目录
方法一: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)
适合分类数据:
Set1
、Set2
、Set3
:用于离散分类。Pastel1
、Pastel2
:柔和的离散颜色。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图片