手把手教你怎么做人口密度热力图

简介: 本文介绍了使用Python和ArcGIS绘制人口密度地图的方法。Python部分包括地图数据获取、格式转换、数据整合及可视化;ArcGIS部分涵盖地图投影、数据连接、人口密度计算与图例设置。同时提供了C++代码用于数据分割,并介绍了如何利用高德API获取地址经纬度,实现地图标注。

方法一:python绘图

首先在网上收集shp矢量地图数据,这里推荐阿里云:DataV.GeoAtlas地理小工具系列,但它只能得到区县一级的数据粒度,乡镇一级需要其它渠道(如csdn资源,Bigemap等),得到json文件后,若有需要修改的地方,可以通过Arcgis进一步编辑改进(如裁剪地图,增删要素,地图要素导出,文件格式转换等),内置的Arctoolbox功能很强大。

image.gif 编辑

image.gif 编辑

然后将格式化转出的geojson数据放到这个网站:mapshaper转换为shp格式

image.gif 编辑

得到一个压缩包,解压后将整个文件导入pycharm中(记得不能只有shp文件,否则会报错):

image.gif 编辑

将csv数据文件和shp地图文件导入进python中,后面进行数据的整合,示例代码如下(南京市人口密度图):

import pandas as pd
import geopandas as gpd
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('TkAgg')  # 更改为 TkAgg 后端
# 设置字体为 SimHei,确保能够显示中文
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定中文字体
matplotlib.rcParams['axes.unicode_minus'] = False  # 处理负号显示问题
# 读取人口密度数据
data = pd.read_csv('C:/Users/86182/Desktop/population/nanjing_population_density.csv',encoding='gbk')
# 读取矢量地图数据
nanjing_map = gpd.read_file('C:/Users/86182/Desktop/population/nanjing_shapefile/nanjing_shapefile.shp',encoding='utf-8')
#整合数据
merged = nanjing_map.set_index('name').join(data.set_index('district'))
fig, ax = plt.subplots(1, 1, figsize=(10, 10))
merged.plot(column='population_density', ax=ax, legend=True,
            legend_kwds={'label': "人口密度 (人/km²)",
                         'orientation': "horizontal"},
            cmap='Pastel1')  # 使用颜色映射
# 添加标题
plt.title('南京市人口分布密度图')
#地区数据标注
locations = {
    "秦淮区": (118.7984, 32.0204),
    "建邺区": (118.7436, 32.0102),
}
for district, coord in locations.items():
    plt.scatter(*coord, color='red', s=5)  # 标记位置
# 显示图形
plt.show()

image.gif

locations中是对应地方的经纬度,用于数据标注。这里的cmap='Pastel1'只是一种方式,更多如下:

在 Matplotlib 中,cmap(颜色映射)用于将数据值映射到颜色。常见的颜色映射类型包括:

1. 线性渐变(Sequential Colormaps)

用于表示从低到高的数值变化:

  • viridis:默认,适合大多数应用。
  • plasma:高对比度,适合视觉上需要突出显示的情况。
  • inferno:适合热图,暗色调。
  • magma:柔和的颜色变化。
  • cividis:为色盲用户设计的颜色映射。

2. 离散颜色(Qualitative Colormaps)

适合分类数据:

  • Set1Set2Set3:用于离散分类。
  • Pastel1Pastel2:柔和的离散颜色。
  • Dark2:较为鲜艳的颜色。

3. 对比色(Diverging Colormaps)

用于表示具有中间值的数值,例如正负变化:

  • coolwarm:从蓝色到红色的渐变,适合表示差异。
  • RdYlBu:从红色到黄色再到蓝色的渐变。
  • PiYG:粉色到绿色的渐变。
  • BrBG:棕色到蓝绿色的渐变。

最后效果如下: image.gif 编辑

方法二:Arcgis绘图:

首先导入shp文件,接着点击数据框属性 image.gif 编辑

在投影坐标系中选择合适的地图作为坐标系

image.gif 编辑

然后打开属性表添加area字段,计算几何面积

image.gif 编辑

然后加入人口数据,将人口数据csv文件导入,进行数据连接:

image.gif 编辑

后进行字段计算,得出对应的人口密度:

image.gif 编辑

然后打开图层的属性选择色带和分类数,根据人口密度进行颜色渲染。

最后插入指南针和图例,大功告成:

image.gif 编辑

如果想要自定义渐变色带。可以点样式管理器进行操作:

image.gif 编辑

具体教程有很多

注:如果页面动不了,图例也无法修改,说明点到了焦点数据框,再点一下就解锁了:

image.gif 编辑

如果想要制作像这样的色带图例需要将它转换为图形,再解除分组就可以操作它里面的文本和图形内容了:

image.gif 编辑

最后谈一下word数据处理,根据其数据制作excel表格时可以用代码实现数据分割:

如遇到这样以元组为单位的数据:

image.gif 编辑

可以用c++代码分割地名和地址:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
 
int main() {
    std::ifstream inputFile("locations.txt"); 
    std::ofstream namesFile("names.txt");
    std::ofstream addressesFile("addresses.txt");
    std::string line;
 
    while (std::getline(inputFile, line)) {
        // 去除首尾空白字符,包括空格、制表符和换行符
        line.erase(0, line.find_first_not_of(" \t\n\r\f\v"));
        line.erase(line.find_last_not_of(" \t\n\r\f\v") + 1);
 
        // 跳过空行
        if (line.empty()) {
            continue;
        }
 
        // 由于地名和地址是换行分隔的,我们可以交替写入两个文件
        static bool isName = true; // 静态变量用于跟踪当前行是地名还是地址
 
        if (isName) {
            namesFile << line << std::endl;
        } else {
            addressesFile << line << std::endl;
        }
 
        // 切换状态
        isName = !isName;
    }
 
    inputFile.close();
    namesFile.close();
    addressesFile.close();
 
    return 0;
}

image.gif

结果:

image.gif 编辑

image.gif 编辑

非常好用,如果数据量小的话可以直接交给ai

数据标注:

关于获得地址的经纬度在arcgis上进行地图数据标注:

对给定大量地址进行批量获得经纬度的方法,这个python脚本非常好用:

使用高德地图API批量获取地址对应的经纬度_高德地图api经纬度定位查询-CSDN博客


 

image.gif 编辑

image.gif 编辑 image.gif 编辑

然后进行数据标注,

image.gif 编辑

右键导入的表格点击显示xy数据然后选择地理坐标系中的:

image.gif 编辑

image.gif 编辑

注意:一定是上面的形式,否则地图上没有标注显示

解释一下两者的不同:

地理坐标系

地理坐标系定义:地理坐标系是以椭球体面为参考面,以法线为依据,用经纬度表示地面点在椭球表面的位置的坐标系统。

投影坐标系

投影:将球面坐标转为平面坐标的过程。

如果在操作过程中遇到了比例尺变得很大或者找不到地图的情况,将地图框缩放至图层框内然后右键点击缩放至图层即可,也可以点击全图和缩放整个页面进行调整。

最后导出为jpg图片

相关文章
|
数据可视化 定位技术
ArcGIS应用基础3 属性表的操作-以人口密度分布图为例
😀在本文中,作者以人口密度分布图为例,详细讲解了属性表的连接、字段添加和计算等功能,最终将人口密度可视化到地图上进行了底图整饰输出。
1593 0
|
定位技术
ArcGIS地形起伏度+地形粗糙度+地表切割深度+高程变异系数提取
ArcGIS地形起伏度+地形粗糙度+地表切割深度+高程变异系数提取
20492 0
|
Java Apache
阿里Java开发手册一方库/二方库/三方库等概念详解
阿里Java开发手册一方库/二方库/三方库等概念详解
3466 0
|
数据采集 数据挖掘 数据处理
如何使用 Pandas 库进行数据清洗和预处理?
数据清洗和预处理是数据分析中至关重要的步骤,Pandas库提供了丰富的函数和方法来完成这些任务
1087 64
|
9月前
|
人工智能 小程序 定位技术
别让客人“刷”不到你:本地生活GEO布局的4个土办法
别让客人“刷”不到你!本地生活商家必须掌握的GEO四步土办法:画清3公里人群圈、结构化信息让AI秒懂、用顾客原话做内容、每月删旧更新。精准触达AI推荐,把客流引到店门口。(238字)
850 0
|
数据安全/隐私保护
企业如何用一部手机,一张二维码,搞定仓库出入库
本文介绍如何利用手机与二维码搭建轻量级仓库管理系统,无需复杂设备即可实现快速、准确的扫码出入库操作,提升效率并降低错误率,适合中小企业应用。
|
人工智能 边缘计算 算法
AI人流热力图分析监测技术
通过深度学习算法(如CSRNet)进行实时密度估算和热力图生成,结合历史数据分析预测高峰时段,优化人员调度与促销活动。采用边缘计算减少延迟,确保实时响应,并通过数据可视化工具提升管理决策效率。
1591 24
|
数据采集 数据可视化
国内77个城市建筑物轮廓(带高度)数据分享(附百度网盘)
国内77个城市建筑物轮廓(带高度)数据分享(附百度网盘)
3096 1
|
监控 Ubuntu 安全
|
JavaScript 前端开发 搜索推荐
ECharts词云图(案例一)+配置项详解
ECharts,百度的JavaScript图表库,支持词云图(自5.0版起),借助`echarts-wordcloud`插件。配置词云图涉及`tooltip`(如显示、颜色、边框等)和`series`(类型、形状、大小范围等)。示例代码展示了如何在HTML中引入依赖并配置词云图,包括数据、形状、大小、颜色等。完整代码和依赖可下载。调整这些配置可创建个性化词云图。参阅官方文档获取不同版本详情。
6670 4
 ECharts词云图(案例一)+配置项详解