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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,1000CU*H 3个月
简介: 本文介绍了使用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 属性表的操作-以人口密度分布图为例
😀在本文中,作者以人口密度分布图为例,详细讲解了属性表的连接、字段添加和计算等功能,最终将人口密度可视化到地图上进行了底图整饰输出。
972 0
|
定位技术
ArcGIS地形起伏度+地形粗糙度+地表切割深度+高程变异系数提取
ArcGIS地形起伏度+地形粗糙度+地表切割深度+高程变异系数提取
16310 0
|
2月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
9月前
|
人工智能 边缘计算 算法
AI人流热力图分析监测技术
通过深度学习算法(如CSRNet)进行实时密度估算和热力图生成,结合历史数据分析预测高峰时段,优化人员调度与促销活动。采用边缘计算减少延迟,确保实时响应,并通过数据可视化工具提升管理决策效率。
839 24
|
1月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
371 43
Go语言深度解析:从入门到精通的完整指南
|
1月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
1月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
1月前
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
1月前
|
Java 项目管理 Maven
Maven项目管理与构建自动化完全指南
Maven彻底改变了Java项目管理方式,通过POM模型、依赖管理和标准化构建流程,大幅提升开发效率。本文深入解析其核心概念、多模块管理、私服搭建及与Spring Boot、Docker等现代技术栈的集成实践,助力开发者实现高效、规范的项目构建与团队协作。
Maven项目管理与构建自动化完全指南
|
1月前
|
数据采集 运维 监控
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
本文系统解析爬虫与自动化核心技术,涵盖HTTP请求、数据解析、分布式架构及反爬策略,结合Scrapy、Selenium等框架实战,助力构建高效、稳定、合规的数据采集系统。
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
下一篇
oss云网关配置