利用python实现热力学地图(保姆式讲解)

news2024/11/20 15:28:47

一、首先展示最终的效果

对二手房房源的分析,将分析后的结果用热力图显示:

显示效果如下所示:

 heatMap参考代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
<!DOCTYPE html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=xzjQRq0KqoPbRG340r22ndL8VkbZIS3S"></script>
    <script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>
    <title>热力图功能示例</title>
    <style type="text/css">
    ul,li{list-style: none;margin:0;padding:0;float:left;}
    html{height:100%}
    body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}
    #container{height:100%;width:100%;}
    #r-result{width:100%;}
    </style>
</head>
<body>
  <div id="container"></div>
<script type="text/javascript">
    var map = new BMap.Map("container");          // 创建地图实例

    var point = new BMap.Point(118.760547,31.995307);
    map.centerAndZoom(point, 10);             // 初始化地图,设置中心点坐标和地图级别
  map.setCurrentCity("南京");    //设置当前显示城市
    map.enableScrollWheelZoom(); // 允许滚轮缩放



    var points =[
<!--data中数据-->
{"lng":"118.760547","lat":"31.995307","count":"1"},
{"lng":"118.76127240000001","lat":"31.99646666","count":"13"},
{"lng":"118.763391","lat":"31.994544","count":"7"},
{"lng":"118.764602","lat":"31.99557132","count":"12"},
{"lng":"118.764628","lat":"31.993465999999998","count":"2"},
{"lng":"118.765818","lat":"31.997544","count":"6"},
{"lng":"118.76630800000001","lat":"32.002635","count":"13"},
{"lng":"118.766849","lat":"31.998096999999998","count":"2"},
{"lng":"118.76711999999999","lat":"31.999557","count":"8"},
{"lng":"118.77068500000001","lat":"32.001864000000005","count":"5"}

];//这里面添加经纬度


<!--半径 可见度-->
    heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":100,"maxOpacity":0.6,"visible":true});
    map.addOverlay(heatmapOverlay);
    heatmapOverlay.setDataSet({data:points,max:100});

</script>
</body>
</html>

二、在百度平台注册开发者账户

1)进入百度开放平台:

百度开发平台

2)注册个人开发者账户(选择个人使用)参考下面的界面:

 3)注册登录后点击控制台

(https://lbsyun.baidu.com/apiconsole/key#/home)

 三、实现地理编码

实验目的:输入地址,输出该地址对应的经纬度。

1)在控制台看板中点击应用管理--》创建应用,如下图所示。

 

  设置完成点击提交按钮,就完成了应用的创建。

2)创建后的应用如下图所示:

 3)地理编码

 选择页面导航栏中的开发文档-->服务接口-->Web服务API,显示界面如下图所示:

 选择Web服务API菜单中的正/逆地理编码-->地理编码.如下图所示:

 选择导航栏上的服务文档,如下图所示(在服务文档里可以查看api的各个参数):

 根据地址实现地理编码的参考代码:

import json
import requests

def getknglat(address):
    url="https://api.map.baidu.com/geocoding/v3/?address=南京市&output=json&ak=3wFhBw4kBi56MelWGmqSsU1Uy9xiqot4"
    res=requests.get(url).text
    print(res)
    temp=json.loads(res)#将字符串转化为json
    print(temp["result"])
    lat=temp["result"]["location"]["lat"]
    lng=temp["result"]["location"]["lng"]
    return lng,lat #经度 longitude 纬度 latitude
#print(getknglat("南京大学"))
'''
输出的结果样例
{"status":0,"result":{"location":{"lng":118.80242172124585,"lat":32.06465288561847},"precise":0,"confidence":20,"comprehension":100,"level":"城市"}}
{'location': {'lng': 118.80242172124585, 'lat': 32.06465288561847}, 'precise': 0, 'confidence': 20, 'comprehension': 100, 'level': '城市'}
(118.80242172124585, 32.06465288561847)
'''

四、WEB开发

1)选择开发文档中的WEB 开发-->JavaScript API,界面如下图所示:

    在这之前需要创建热力图服务的浏览器端 

 注:百度地图开放平台的账户注册参考开发指南中的账号和获取密钥操作。

    浏览器端应用的设置,可参考下图的设置:

2)找到百度地图的demo,并复制相应的代码(这里面有详细的代码介绍)

 

 3)在pycharm中创建Html文件,如下图所示:

 将helloworld中的源码拷到baidumapDemo.html文件中。

 <!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=p8cynEzrMX2IkDEN5fH4BFkOGjQjtBFx"></script>
    <script type="text/javascript" src="http://api.map.baidu.com/library/Heatmap/2.0/src/Heatmap_min.js"></script>
    <title>热力图功能示例</title>
    <style type="text/css">
        ul,li{list-style: none;margin:0;padding:0;float:left;}
        html{height:100%}
        body{height:100%;margin:0px;padding:0px;font-family:"微软雅黑";}
        #container{height:90%;width:100%;}
        #r-result{width:100%;}
    </style>
</head>
<body>
    <div id="container"></div>
    <div id="r-result">
        <input type="button"  onclick="openHeatmap();" value="显示热力图"/><input type="button"  onclick="closeHeatmap();" value="关闭热力图"/>
    </div>
</body>
</html>
<script type="text/javascript">
    var map = new BMap.Map("container");          // 创建地图实例

    var point = new BMap.Point(118.760547,31.995307);
    map.centerAndZoom(point, 12);             // 初始化地图,设置中心点坐标和地图级别
    map.enableScrollWheelZoom(); // 允许滚轮缩放

    var points =[{'lat':31.994641031479546,'lng':118.76338396886818,'counts': 7},
{'lat': 31.99515825934137,'lng': 118.76239331755178, 'counts': 13},
{'lat': 31.993956289530654,'lng': 118.76082128290932, 'counts': 2},
{'lat': 31.99245265021546,'lng': 118.7558879803876, 'counts': 12},
{'lat': 31.999432855702388,'lng': 118.76741691145524, 'counts': 8},
{'lat': 32.00193148289008,'lng':118.76625576175304, 'counts': 13},
{'lat': 31.99919622550667,'lng':118.76354530453779, 'counts': 6},
{'lat': 32.00215593416205,'lng':118.77065027230785, 'counts': 5},
{'lat': 31.995390000354142,'lng':118.75996699436934, 'counts': 1},
{'lat': 31.99827833030048,'lng':118.76686714848313, 'counts': 2}];

    if(!isSupportCanvas()){
        alert('热力图目前只支持有canvas支持的浏览器,您所使用的浏览器不能使用热力图功能~')
    }
    //详细的参数,可以查看heatmap.js的文档 https://github.com/pa7/heatmap.js/blob/master/README.md
    //参数说明如下:
    /* visible 热力图是否显示,默认为true
     * opacity 热力的透明度,1-100
     * radius 势力图的每个点的半径大小
     * gradient  {JSON} 热力图的渐变区间 . gradient如下所示
     *  {
            .2:'rgb(0, 255, 255)',
            .5:'rgb(0, 110, 255)',
            .8:'rgb(100, 0, 255)'
        }
        其中 key 表示插值的位置, 0~1.
            value 为颜色值.
     */
    heatmapOverlay = new BMapLib.HeatmapOverlay({"radius":45});
    map.addOverlay(heatmapOverlay);
    heatmapOverlay.setDataSet({data:points,max:100});
    //是否显示热力图
    function openHeatmap(){
        heatmapOverlay.show();
    }
    function closeHeatmap(){
        heatmapOverlay.hide();
    }
    closeHeatmap();
    function setGradient(){
        /*格式如下所示:
        {
            0:'rgb(102, 255, 0)',
            .5:'rgb(255, 170, 0)',
            1:'rgb(255, 0, 0)'
        }*/
        var gradient = {};
        var colors = document.querySelectorAll("input[type='color']");
        colors = [].slice.call(colors,0);
        colors.forEach(function(ele){
            gradient[ele.getAttribute("data-key")] = ele.value;
        });
        heatmapOverlay.setOptions({"gradient":gradient});
    }
    //判断浏览区是否支持canvas
    function isSupportCanvas(){
        var elem = document.createElement('canvas');
        return !!(elem.getContext && elem.getContext('2d'));
    }
</script>

提示:注意修改您的AK

在浏览器中运行页面,如果显示如下提示信息:

 解决方案将地址栏中的localhost修改为:127.0.0.1,修改后的界面如下图所示:

 

五、文件的处理与读入 (数据处理操作)

import numpy as np
import json
import requests
import pandas as pd

def getknglat(adress):
    #url = f'http://api.map.baidu.com/geocoding/v3/?city=南京市&address={adress}&ak=InTptui6skOcBML4iHGlhBml2srxz3mo&output=json&callback=showLocation'
    url="https://api.map.baidu.com/geocoding/v3/?city=南京市&address="+adress+"&ak=InTptui6skOcBML4iHGlhBml2srxz3mo&output=json"
    res=requests.get(url).text
    res=res.strip('showLocation&&showLocation(').strip(')')
    temp=json.loads(res)#将字符串转化为json
    #print(temp["result"])
    lat=temp["result"]["location"]["lat"]
    lng=temp["result"]["location"]["lng"]
    return lng,lat #经度 longitude 纬度 latitude
#print(getknglat("德盈菁华园"))
#print(getknglat("江苏警官学院家属区"))



wb=pd.read_csv("house.csv",encoding="utf-8")
ws=wb["community"]

#计数
counts={}#定义一个字典
for i in ws:
    counts[i]=counts.get(i,0)+1
counts=counts.items()#取出字典的元组
counts_list=list(counts)#将counts转化为列表,此时列表中元素为(小区名,出现的次数)这种形式

num=len(counts_list)#计算出列表中的元素个数

list_all=[]#存放所有地点的经纬度、出现次数信息
lat_lng_counts={}#字典每次临时存放这种类型{"lat":34.34672364986643,"lng":108.96549386128427,"count":2}数据
#更新list_all
#print(getknglat("柏悦澜庭"))
#print(getknglat("德安花园"))




for i in range(0,num): 
    #print(getknglat(counts_list[i][0]))
    
    lng,lat=getknglat(counts_list[i][0])
    #print(lng,lat)
    lat_lng_counts["lat"]=lat
    lat_lng_counts["lng"]=lng
    lat_lng_counts["counts"]=counts_list[i][1]
    list_all.append(lat_lng_counts)#将数据加入到list_all内
    lat_lng_counts={}#清空字典
    
    
    
#异常处理
for i in range(0,num):
    try:
        if list_all[i]["lat"]=="暂无数据" or list_all[i]["lng"]=="暂无数据":
            del list_all[i]
            continue
        else:
            pass
    except:
        continue
        
        
#将数据写入到文件中   
for it in list_all:
    if it == list_all[0]:
        with open("data123.txt", mode="w", encoding="utf-8") as f: #a可以续写,w则是清空再写
                it = str(it)
                f.write("["+it + ",")
                f.write("\n")
    else:
        with open("data123.txt", mode="a", encoding="utf-8") as f:
            if it == list_all[-1]:
                it = str(it)
                f.write(it + "];")
            else:
                it = str(it)
                f.write(it+",")
                f.write("\n")
                

'''
#输出json格式数据
print("[",end="")
for i in range(0,num):
    if i==num-1:
        print(list_all[i],end="")
    else:
        print(list_all[i])
print("]")
'''  
    













附加(下面的代码可以忽略,博主仅用于记录思路)

import pandas as pd
c = pd.read_csv("result.csv",encoding="utf-8",low_memory=False)
num=len(c)
print(num)

info = []
#perpect
def add_info(lng,lat):
    for stu in info:
        if lng == stu["lng"] and lat ==stu["lat"]:
            stu['count'] += 1
            return
    stuDict = {'lat': lat,'lng': lng,'count': 1}
    info.append(stuDict)
    return
    pass
for it in range(num):
    try:
        if c.iloc[it]["longitude"] == "暂无数据" or c.iloc[it]["latitude"] == "暂无数据" :
            continue
        else:
            add_info(float(c.iloc[it]["longitude"]), float(c.iloc[it]["latitude"]))
    except:
        continue
for it in info:
    if it == info[0]:
        with open("data123.txt", mode="w", encoding="utf-8") as f: #a可以续写,w则是清空再写
                it = str(it)
                f.write(it + ",")
                f.write("\n")
    else:
        with open("data123.txt", mode="a", encoding="utf-8") as f:
            if it == info[-1]:
                it = str(it)
                f.write(it + ";")
            else:
                it = str(it)
                f.write(it+",")
                f.write("\n")
print("over")

六、展示结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一起看跨年烟花(流行背景音乐+雪花)---- 系列

2023年快要到来啦&#xff0c;很高兴这次我们又能一起度过~ 目录 一、前言 二、跨年烟花 三、效果展示 四、详细介绍 五、编码实现 index.html js 六、获取代码 需要源码&#xff0c;可以私信我(⊙o⊙)&#xff1f;关注我&#xff1f; 一、前言 时光荏苒&#xff0c;白…

数据结构-树

1、树的分类 &#xff08;1&#xff09;满二叉树 一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是满二叉树。也就是说&#xff0c;如果一个二叉树的层数为K&#xff0c;且结点总数是(2^k)-1&#xff0c;则它就是满二叉树。 &#xff08;2…

ThingsKit物联网平台 v1.0.1-Release版本发布

基于ThingsBoard二次开发的物联网平台推荐&#xff1a;ThingsKit物联网平台&#xff0c;开箱即用的物联网低代码平台&#xff0c;提供N1N的产品服务体系&#xff0c;帮助企业快速搭建稳定可靠的物联网系统平台&#xff0c;为企业节省大量时间及人力成本。www.thingskit.com Th…

centos7安装k3s和rancher

文章目录一. 安装k3s1.1 关闭防火墙1.2 修改hostname1.3 安装containerd1.4 containerd安装mysql81.5 安装k3s1.6 卸载k3s二. 安装rancher2.1 安装helm2.1.1 下载2.1.2 安装2.1.3 添加几个repo2.1.4 报错2.2 helm安装ingress-nginx2.3 添加rancher repo2.4 helm安装rancher(自己…

读论文---Clip微调---CLIP Itself is a Strong Fine-tuner

标题 摘要 Recent studies have shown that CLIP has achieved remarkable success in performing zero-shot inference while its fine-tuning performance is not satisfactory. In this paper, we identify that fine-tuning performance is significantly impacted by hyp…

复杂并发场景下的并发调度模型在转转的演进之路

文章目录一、问题背景二、复杂并发场景释义2.1 简单并发场景2.2 复杂并发场景三、分组并发调度模型演进3.1 简单异步并发调度3.2 分组并发调度四、自驱动并发调度模型演进4.1 一个优化耗时的小目标及其实现4.2 下一步的疑惑4.3 对问题的重新思考以及自驱动并发调度模型的诞生4.…

蓝桥集训(附加面试题)第八天

本文来源于算法面试题特训专栏&#xff0c;这里有大量专业性的算法题比如&#xff08;动态规划21天&#xff0c;大厂特训28天等等&#xff09; 欢迎大家一起学习。 链接&#xff1a;传送门 目录标题导读Java蓝桥集训面试题点击直接资料领取导读 在刚刚结束的 每日算法&面…

【pandas】教程:3-取DataFrame子集

pandas 取 DataFrame 的子集 pandas 选择列 注&#xff1a; 引用库的导入和数据的导入只做一次&#xff0c;所有代码是在 jupyter notebook 里完成的。 import pandas as pd titanic pd.read_csv("data/titanic.csv")只要年龄数据 ages titanic["Age"…

速度杠杠的,部署机器学习模型的这7个要点要谨记

在模型部署时&#xff0c;模型的性能和耗时都非常重要。但是我们在构建模型时&#xff0c;往往没有考虑模型的预测速度。虽然性能优化会损害预测准确性,但更简单的模型通常运行得更快&#xff0c;也不容易过拟合。 预测延迟被测量为进行预测所需的经过时间。延迟通常被视为一个…

降维和特征选择的对比介绍

在machine learning中&#xff0c;特征降维和特征选择是两个常见的概念&#xff0c;在应用machine learning来解决问题的论文中经常会出现。特征降维和特征选择的目的都是使数据的维数降低&#xff0c;使数据维度降小。但实际上两者的区别是很大&#xff0c;他们的本质是完全不…

Java整合RocketMQ实现生产消费

文章目录参考文档环境搭建生产者普通消息同步发送异步发送单向传输顺序消息延迟消息批量消息事务消息消费者Push消费Pull 消费代码仓库参考文档 RocketMQ作为阿里系开源项目&#xff0c;有非常成熟的中文文档可以快速了解并上手。 环境部署控制台安装RocketMQ常见问题 环境搭…

【现代机器人学】学习笔记八:轨迹生成

这节课的内容主要讲述如何通过插值等方式生成一条满足运动学约束的运动轨迹。这节的内容在全书中较少&#xff0c;相比前一章开链动力学而言&#xff0c;可以说内容少了许多。但是这节的内容却是目前在机械臂应用方面使用最广泛的一节。 闲话休提&#xff0c;马上开始&#xf…

ThreeJS:创建第一个三维场景

场景效果 ThreeJS与WebGL WebGL使得开发者可以直接使用显卡的计算资源,创建高性能的二维和三维计算机图形效果,然后在JavaScript脚本中进行WebGL编程,创建三维场景并生成动画。但是,原生的WebGL编程是十分复杂的,且容易出错。然而,Three.JS库可以简化WebGL的开发过程。 基…

十、Java 17 新特性

十、Java 17 新特性 JDK 17 在 2021 年 9 月 14 号正式发布了&#xff01;根据发布的规划&#xff0c;这次发布的 JDK 17 是一个长期维护的版本&#xff08;LTS)。Java 17 提供了数千个性能、稳定性和安全性更新&#xff0c;以及 14 个 JEP&#xff08;JDK 增强提案&#xff09…

示波器应用(二)

前篇我们对场景六基色色相和白平衡还有明度进行了验证&#xff0c;对黑白场做了微调。后面我们还需要对场景调光。 本篇主要涉及一些画面美术知识&#xff0c;不感兴趣可以跳过。 我们需要先了解一个摄影知识 曝光 下面要说到一种颜色模式HSB&#xff0c;HSB分别表示&#…

Redhat-ansible-合集

1.安装 2.部署ANSIBLE 2.1INVENTORY 2.2ANSIBLE配置文件 2.3AD HOC命令 3.PLAYBOOK 4.变量 5.ansible vault加密变量 6.ansible_facts 7.loop 8.条件判断 9.handler处理 10.错误处理 11.tags标签 12.管理文件 13.template模板 14.host-pattern 15.动态Inventory 16.ro…

玻纤效应对skew的影响(一)

在高速SerDes传输系统中&#xff0c;随着信号速率的提高&#xff0c;UI会越来越小&#xff0c;传输线的对内skew会越来越大。以PCIe信号来说&#xff0c;PCIe4.0速率的一个UI是62.5ps&#xff0c;当速率提高到PCIe5.0时&#xff0c;每个UI就只有31.25ps&#xff0c;更进一步&am…

SparkSQL源码分析系列01-Catalyst作用

SparkSQL 是如何将SQL语句转化为Spark任务的呢&#xff1f; 详细过程如下图 通过拉去 github 的 Spark 源码&#xff0c;查看 SparkSQL 模块的 readme.txt 文件可以看出&#xff0c;SparkSQL 包含4个方面的内容 SparkSQL源码主要包含4大模块 Catalyst (sql/catalyst)&…

Solidity之为什么 ++i 比 i++ 省gas

文章目录为什么 i 比 i 省gas测试验证demo1demo2为什么 i 比 i 省gas为什么 i 比 i 省gas i通常更昂贵&#xff0c;因为它必须增加一个值并“返回”旧值&#xff0c;因此可能需要在内存中保存两个数字我在记忆中只使用过一个数字。在许多情况下&#xff0c;在编译器优化之后&a…

【SVM】简单介绍(四)

1、Soft Margin SVM 对偶求解 构造拉格朗日函数 L12∥w∥2C∑i1nξi−∑i1nαi(yi(wTxib)−1ξi)−∑i1nγiξiαi≥0γi≥0\begin{aligned} & L\frac{1}{2}\|w\|^2C \sum_{i1}^n \xi_i-\sum_{i1}^n \alpha_i\left(y_i\left(w^T x_ib\right)-1\xi_i\right)-\sum_{i1}^n \ga…