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

目录

方法一:python绘图

方法二:Arcgis绘图:


方法一:python绘图

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

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

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

将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()

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:棕色到蓝绿色的渐变。

 最后效果如下:

方法二:Arcgis绘图:

首先导入shp文件,接着点击数据框属性

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

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

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

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

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

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

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

具体教程有很多

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

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

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

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

可以用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;
}

结果:

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

数据标注:

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

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

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

 

然后进行数据标注,

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

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

解释一下两者的不同:

地理坐标系

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

投影坐标系

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

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

最后导出为jpg图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值