查看原文
其他

数据治理 | 地址数据可视化—教你如何绘制地理散点图和热力图

快点关注→ 数据Seminar 2022-12-31

本文目录

一、引言

二、经纬度可视化

1. 使用 Python 创建地图

(1)创建地图底图

(2)标记地点

(3)标记区域

2. 地理散点图

3. 地理热力图

三 、结束语

本文共4772个字,阅读大约需要18分钟,欢迎指正!对话框发送"0617"获得本文同款数据!

Part1引言

上期文章我们介绍了如何使用地理服务API转换地址和经纬度,那么大家拿到经纬度后是否知道怎么使用呢?本期文章小编就来给大家小露一手,为大家介绍如何使用 Python 基于经纬度生成地理散点图和热力图,速来围观。
本文中所有 Python 代码均在集成开发环境 Visual Studio Code (VScode) 中使用交互式开发环境 Jupyter Notebook 编写和运行

Part2经纬度可视化

(1)使用 Python 创建地图

Python 中有许多地理应用模块,folium 是其中非常简单易用的一个,如果你是 Windows 用户并且已经安装了 Python3 环境,那么在命令提示符中使用命令 pip install folium 即可安装该模块。安装完成后就可以快速上手生成地图了。

(1)创建地图底图

首先,我们可以先生成一个空地图,不做任何标记处理,操作代码及效果如下:
# 导入 Python 地图处理模块
import folium

# 生成地图底图
My_map = folium.Map(
           # 地图的初始中心点,纬度在前,经度在后;
           # 此点为 杭州市政府 的经纬度
           location=[30.246026,120.210792],
           
           # 地图初始缩放比例,数值越小,放大程度越低
           # 如果设置为 1或2,将会得到一个世界地图
           zoom_start=15,
           
           # 地图底图的风格,可以使用模块提供的底图,也可以使用
           # 其他渠道的底图,无需科学上网就能在国内使用的
           # 部分底图风格已经以注释的形式罗列在下方,
           # 此处使用高德提供的底图
           tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
           # 'OpenStreetMap'    : 开放街道底图,默认值
           # 'Stamen Watercolor': 水墨画底图
           # 'Stamen Terrain'   : 地势地形底图
           # 'Stamen Toner'     : 黑白无标记底图
           # 高德地图提供的街道图 url:'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'
           
           # 是否在地图左下角添加比例尺
           control_scale=True,
           
           # 使用第三方提供的底图时需要用到的参数
           attr='default'
           )
           
 # 展示生成的地图底图,需要在 Jupyter notebook 中运行才可以看到
 My_map
得到的地图可以任意的缩放和移动,下图是初始位置的截图:

(2)标记地点

我们可以自由地在地图上标记一个位置,并为这个标记设置个性的颜色和图案。标记地点只需要传入所标记地点的经纬度即可。
注意:当使用的地图底图是模块自带的底图时,默认使用的是 WGS84 坐标系,使用时需要传入 WGS84 坐标系的坐标点(经纬度);而当使用高德提供的地图底图时,则使用的是 GCJ-02 坐标系,需要传入 GCJ-02 坐标系的坐标点 ,否则会发生坐标偏移,导致标记的位置与实际的位置不一致。
为刚才创建的地图添加标记,代码如下:
# 地点标记
folium.Marker(
      # 标记地点的经纬度
      # 这里使用的是杭州市政府的经纬度
      location = [30.246026,120.210792],
      # 标记的样式,使用此参数即可
      popup='<i>Mt. Hood Meadows</i>',
      # 标记点的颜色、形状
      icon=folium.Icon(
                  icon='heart',    # 标记点的内部形状,这里设置为心形
                  color='pink',    # 外部颜色设置为粉色
                  icon_color ='red'# 内部颜色设置为红色
                  )
      ).add_to(My_map)   # add_to:将设置的标记添加到底图上

# 查看添加了标记的地图
My_map
适当放大后如下图所示:

(3)标记区域

我们在影视剧中经常会听到这样的台词:“方圆十里……”,我们也可以在地图中标记这样的区域。比如我们可以标记杭州市政府方圆 2km 内的圆形区域。代码和效果图如下:
# 添加区域标记
folium.Circle( 
        # 标记区域的中心点经纬度,此点为杭州市政府
        location=[30.246026,120.210792], 
        # 标记圆形区域的半径,单位:米
        radius=2000,
        # 标记区域的形状,此参数代表使用圆形
        popup='The waterfront',
        # 标记区域轮廓线的颜色
        color="lightgreen",
        # 标记区域内部填充色
        fill_color='skyblue',
        # 标记区域内部填充色的透明度
        # 从 0 到 1;数字越小,透明度越高
        fill_opacity=0.4
).add_to(My_map)   # 将标记的区域添加到地图底图上

# 查看添加区域标记后的地图
My_map
  

(2)地理散点图

当我们想要查看一些位置在地图上的分布时,可以将这些地点对应的经纬度标记在地图上。
小编从某处捡到一份数据,内含 1000 条位于杭州市内的地址数据,并附带有对应的经纬度值(GCJ-02 坐标系)。首先我们读取数据以备后用,代码如下:
import pandas as pd

data = pd.read_csv('1000条杭州地址.csv')
data.head()   # 输出前 5 行
  
接下来我们将使用这份数据来生成地理可视化图。
我们首先创建一个新地图,命名为 Scatter_map,在新的地图上标记位置可以免受其他组件的影响。另外,我们可以标记出指定行政区划的轮廓线,这样有利于我们识别地区和散点的位置。创建地图和添加行政区划轮廓线的代码如下:
# 创建一个新的地图底图,用于地理散点图
Scatter_map= folium.Map(
           location=[30.246026,120.210792],
           zoom_start=15,
           # 使用高德街道地图,需要使用对应坐标系的经纬度(GCJ-02)
           tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
           control_scale=True,
           attr='default')
           
# 添加杭州市的轮廓线
# 杭州市行政区划轮廓线 url
url = 'https://geo.datav.aliyun.com/areas/bound/geojson?code=330100_full'
folium.GeoJson(
    url,
    style_function = lambda _: {
          # 轮廓线内部的填充色
          'fillColor''skyblue',
          # 轮廓线颜色
          'color''blue',
          # 轮廓线粗细
          'weight': 1,
          # 轮廓线稠密度
          'dashArray''5, 8'},
).add_to(Scatter_map)    # 将轮廓线添加到新的地图底图上

Scatter_map
  
接下来就可以在标有轮廓线的地图上绘制散点图了,标记散点的代码如下:
# 散点对象
incidents = folium.map.FeatureGroup()
# 使用准备好的杭州市内地址数据
for lat,lng in zip(data['经度'], data['纬度']):
    '''遍历所有位置的经纬度,每一个点都标记在地图上'''
    incidents.add_child(
        folium.CircleMarker(
            [lng, lat],  # 散点的经纬度,纬度在前
            radius=1,    # 散点的半径
            color='red'# 散点的主体颜色
            fill=False,  # 散点是否为实心
            opacity=0.3, # 散点的透明度
            fill_color='blue'# 散点内部填充色
            fill_opacity=1,    # 内部填充的透明度,0-1,1 代表完全不透明
        )
    )

# 将散点图对象添加到地图上
Scatter_map.add_child(incidents)

Scatter_map
  
我们还可以将做好的地理散点图保存为 html 文件,保存后随时可以使用浏览器打开,更方便查看,保存代码如下:
Scatter_map.save("我的地理散点图.html")

(3)地理热力图

# 创建一个新的地图底图,用于地理热力图
Heat_map= folium.Map(
           location=[30.246026,120.210792],
           zoom_start=9,
           # 使用高德街道地图,需要使用对应坐标系的经纬度(GCJ-02)
           tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
           control_scale=True,
           attr='default')
           
# 添加杭州市的轮廓线
# 杭州市行政区划轮廓线 url
url = 'https://geo.datav.aliyun.com/areas/bound/geojson?code=330100_full'
folium.GeoJson(
    url,
    style_function = lambda _: {
          # 轮廓线内部区域的填充色
          'fillColor''skyblue',
          # 轮廓线颜色
          'color''blue',
          # 轮廓线粗细
          'weight': 1,
          # 轮廓线稠密度
          'dashArray''5, 8'},
).add_to(Heat_map)    # 将轮廓线添加到新的地图底图上

# 导入热力图函数
from folium.plugins import HeatMap
HeatMap(
      # 经纬度数据值,可以是numpy.array对象或者二维列表
      # 纬度在前,经度在后
      data[['纬度''经度']].values,
      # 每个点热力强度,直接影响热力图色温
      radius=20,
      # 热力拟合程度,或称模糊程度
      blur=15,
      # 热力程度与颜色对应值,不建议自定义该参数, 会很丑
      # gradient={0.4: 'green', 0.65: 'orange', 1: 'red'}
      ).add_to(Heat_map)   # 将热力图添加到地图底图上

Heat_map
热力图的颜色分布会随着地图的缩放而变化:
保存为 html 并使用浏览器打开:
Heat_map.save("我的地理热力图.html")
  

Part3结束语

地理散点图和热力图都是高效的地理可视化工具,如果结合上期文章所介绍的地址与经纬度的转换,即使你只有一些文字描述的地址数据,也可以体验由文本地址到地理散点图、热力图的奇妙之旅。还不快学上?





星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!

点击搜索你感兴趣的内容吧

往期推荐


基本无害 | 使回归有意义——基本原理(3)

基本无害 | 使回归有意义——基本原理(2)

基本无害 | 使回归有意义——基本原理(1)

数据治理 | 根据地址获取经纬度及行政区划——API的妙用

数据治理 | 工企地址清洗——Python的妙用

数据治理 | 数据量越来越大,Stata总奔溃?看来……

数据治理 | 超大.csv文件怎么处理?我们有独门武器!(免费赠送自制csv切分工具)





数据Seminar




这里是大数据、分析技术与学术研究的三叉路口


文 | 《社科领域大数据治理实务手册》


    欢迎扫描👇二维码添加关注    

点击下方“阅读全文”了解更多

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存