方法一: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图片