2025全国省份点位数据可视化实战:shp与Excel全流程指南

发布时间:2026/10/28 5:44:49
2025全国省份点位数据可视化实战:shp与Excel全流程指南

省份点位数据的可视化这件事,我做过不下十个项目,从最开始的“拿到数据不知道从哪下手”,到后来能在一两个小时内把一套省级点位数据跑成可交付的地图,中间踩的坑基本都踩过一遍。这次拿到的标题是“2025全国省份点位数据:shp与Excel格式的地图可视化实战指南”,说白了就是两件事:一是手里有一份全国省份的点位数据,可能是shp矢量格式,也可能是Excel表格格式;二是要把这份数据变成一张能看、能讲、能交付的地图。听起来简单,但真正动手你会发现,坐标系不对、编码乱码、点位偏移、省份名称对不上、地图边界缺失,这些问题一个接一个。

这篇文章适合谁看?如果你是做数据分析、城市规划、市场选址、物流调度、教学演示,或者只是单纯想把一堆带经纬度的表格变成一张漂亮地图的人,那这篇内容基本能覆盖你从数据准备到出图的全流程。我不讲虚的,直接按我实际操作的顺序来:先拆解这类项目的整体思路,再讲shp和Excel两种格式各自的核心细节,然后给出一套完整的实操流程,最后把我遇到过的问题和排查方法整理成速查表。中间会穿插参数选择、工具选型的理由,以及一些文档里不会写的经验。

1. 项目整体设计与思路拆解

1.1 为什么先想清楚“点位”和“边界”的关系

拿到“全国省份点位数据”这个描述,第一件事不是打开软件,而是想清楚数据里到底有什么。所谓点位数据,通常是一组带经纬度的点,每个点代表一个具体位置,比如某个门店、某个监测站、某个事件发生地。而“省份”这个维度,意味着这些点需要和省级行政区划边界产生关联。这里有两种常见情况:一种是点位本身已经带了省份字段,你只需要按省份聚合或者着色;另一种是点位只有经纬度,需要靠空间关系判断它落在哪个省。

这两种情况的处理逻辑完全不同。前者是属性表的操作,后者是空间叠加分析。我在实际项目里见过太多人把这两种混在一起,结果做出来的地图点位飘到海里或者邻省去了。所以第一步一定是打开数据看一眼:shp文件用GIS软件打开属性表,Excel文件直接看列名。如果Excel里有“省份”“城市”“经度”“纬度”这几列,那基本就是“带属性点位”;如果只有经纬度,那就得准备一份省级边界数据做空间关联。

提示:不要假设Excel里的“省份”字段一定规范。我见过写“广西”的,也见过写“广西壮族自治区”的,还有写“广西省”的,这三种在程序里会被当成三个不同的省份。

1.2 shp与Excel两种格式的定位差异

shp格式是GIS领域的“老牌选手”,它本质上是一组文件的集合,至少包含.shp、.shx、.dbf三个文件,分别存几何形状、索引和属性表。它的优势是几何信息和属性信息绑在一起,打开就能画图,坐标系信息通常也存在.prj文件里。缺点是跨平台协作麻烦,别人发给你一个shp,经常漏掉.prj或者.dbf,导致坐标丢失或者属性乱码。

Excel格式则是“通用交换格式”,谁都能打开,谁都能编辑。它的优势是门槛低,业务人员可以直接改数据;缺点是它只有属性没有几何,经纬度只是两列数字,软件不会自动把它们当成空间坐标。所以Excel做地图可视化的核心动作是“把两列数字转成空间点”,这一步在GIS软件里叫“显示XY数据”,在代码里叫“从经纬度构造几何对象”。

我一般的选型逻辑是这样的:如果数据量在几千条以内,且需要频繁和业务方确认字段,用Excel走“表格转点位”的路线更灵活;如果数据量上万,或者需要做缓冲区、叠加分析这类空间运算,shp更合适,因为几何和属性在一起,处理效率高。这次标题里两种格式都提到了,所以下面两条路线我都会讲。

1.3 坐标系选择:这一步错了后面全白干

坐标系是地图可视化里最容易翻车的地方,没有之一。简单说,经纬度是球面坐标,单位是度;而地图投影是平面坐标,单位是米。你在Excel里看到的经度116.4、纬度39.9,这是地理坐标系(常见的是WGS84,也就是EPSG:4326)。如果你直接把这些点画在屏幕上,大多数GIS软件会默认按经纬度显示,看起来没问题,但一旦你要计算距离、面积,或者和另一份投影坐标的数据叠加,就会出大问题。

我的习惯是:存储和交换用地理坐标系(EPSG:4326),展示和分析用投影坐标系。全国范围的地图,常用的投影是Albers等面积投影或者Web墨卡托(EPSG:3857)。Web墨卡托的好处是和在线底图对齐方便,缺点是高纬度地区面积变形大;Albers等面积投影适合做统计类地图,面积比例准确。如果你只是做点位展示、不涉及面积计算,Web墨卡托足够用;如果要做人口密度、资源分布这类需要面积可比的分析,老老实实用Albers。

这里有个实操细节:shp文件如果自带.prj,打开后坐标系就确定了,但你要检查它是不是你想要的;Excel转点位时,软件通常会问你“坐标系是什么”,这时候一定要选对,选错了点位会整体偏移几百米甚至几公里。我见过有人把WGS84的点位当成GCJ02(一种国内常用的加密坐标系)来用,结果点位整体往某个方向偏了几百米,在省级尺度上看不出来,放到城市尺度就露馅了。

1.4 可视化目标决定图层设计

在动手之前,还要想清楚这张图要表达什么。是单纯展示点位分布?还是按省份做聚合统计?还是要做热力图、聚类图?不同的目标对应不同的图层设计。

如果只是展示点位分布,一个点图层加一个省份边界底图就够了,点位用圆点表示,大小固定或者按某个数值字段映射。如果要按省份聚合,那就需要先做空间关联或者属性汇总,把每个省的点位数量算出来,然后用分级设色(choropleth)的方式给省份填色。如果要做热力图,点位密度高的区域会自然凸显,适合看聚集趋势,但不适合精确读数。

我在实际项目里通常会把这两种叠在一起:底层是省份边界的分级设色,上层是点位散点,这样既能看总量分布,又能看具体位置。但要注意,点位太多的时候散点会糊成一片,这时候要么做抽样,要么改用热力图,要么按省份聚合后只显示聚合结果。

2. 核心细节解析与实操要点

2.1 shp文件的结构与常见“缺件”问题

shp格式虽然老,但它的设计其实挺讲究。一个完整的shp数据集至少包含这几个文件:.shp存几何,.shx存索引(加快空间查询),.dbf存属性表,.prj存坐标系定义。很多人打包发送的时候只发.shp,接收方打开发现没有属性、没有坐标系,一脸懵。所以我的第一条经验是:拿到shp先看文件夹里有没有.prj和.dbf,没有的话要么找对方要,要么自己根据数据来源判断坐标系后手动指定。

.dbf文件还有个经典问题:编码。早期的.dbf用的是系统默认编码,中文环境下可能是GBK,而现在的软件默认按UTF-8读取,结果属性表里的中文全变成乱码。解决办法是在GIS软件里打开时指定编码,或者在导入前用工具把.dbf转成UTF-8。我在QGIS里的做法是:图层属性里找到“数据源编码”,手动选GBK,中文就正常了。ArcGIS里则是在“地理处理环境”里设置编码。

另外,shp的字段名有长度限制(最多10个字符),中文属性字段经常被截断。如果你拿到一个shp,发现属性表里字段名是“PROVINCE_1”这种,别慌,打开.dbf看看原始字段名,或者直接看数据内容判断含义。

2.2 Excel转点位的三个关键动作

Excel做地图可视化,核心就三步:读表、转点、上图。但每一步都有细节。

第一步读表,重点是编码和列名。Excel文件本身可能是.xlsx也可能是.csv,.csv的编码问题更常见,UTF-8和GBK混用会导致中文乱码。我的做法是先用文本编辑器打开.csv看一眼,确认编码后再导入。列名方面,经度列可能叫“经度”“lon”“longitude”“x”,纬度列可能叫“纬度”“lat”“latitude”“y”,导入时要手动映射,别指望软件自动识别。

第二步转点,在QGIS里叫“图层 > 添加图层 > 添加分隔文本图层”,选好文件后指定X字段和Y字段,坐标系选EPSG:4326。在ArcGIS里叫“显示XY数据”,操作类似。这里的关键是X对应经度、Y对应纬度,千万别搞反,搞反了点位会跑到地球另一边。转完之后建议立刻“导出为shp”或者“另存为GeoJSON”,把临时点位固化成正式图层,避免后续操作丢失。

第三步上图,把转好的点图层和省份边界图层叠在一起。如果点位明显偏移,先检查坐标系是否一致;如果点位数量对不上,检查是否有空值或者非法经纬度(比如经度超过180、纬度超过90)。

2.3 省份名称匹配:最琐碎也最容易出错

点位要和省份边界关联,靠的是省份名称字段。但现实中的名称写法五花八门:“北京”“北京市”“北京城区”,“内蒙古”“内蒙古自治区”,“新疆”“新疆维吾尔自治区”。如果直接做表连接,匹配率可能只有六七成。

我的处理办法是建一张“名称映射表”,把各种写法统一到一个标准名称上。具体做法是:先把点位表里的省份字段去重,导出一份唯一值列表,然后人工对照标准省份名称做映射。这一步看着笨,但最可靠。映射表大概长这样:

原始写法标准名称
北京市北京
北京城区北京
内蒙古自治区内蒙古
新疆维吾尔自治区新疆
广西省广西

映射完之后再做连接,匹配率基本能到100%。如果还有匹配不上的,多半是名称里有空格、全角半角混用,或者多了不可见字符,用“去除首尾空格”和“统一全半角”处理一下就好。

2.4 点位聚合与分级设色的参数选择

如果要做按省份的聚合统计,核心是“空间连接”或者“属性汇总”。空间连接是把每个点落到它所在的省份多边形里,然后统计每个省的点数;属性汇总则是直接按省份字段分组计数。前者适合点位没有省份字段的情况,后者适合有字段的情况。

聚合完之后做分级设色,关键是分级方法的选择。常见的有等间距、分位数、自然断点(Jenks)。等间距适合数据分布均匀的情况,分位数适合数据偏态分布,自然断点则是让组内差异最小、组间差异最大。我一般先用自然断点看一眼分布,如果分组太碎再改用分位数。分类数量建议5到7类,太少看不出差异,太多颜色难区分。

颜色选择上,顺序型数据(数量从少到多)用单色渐变,比如浅蓝到深蓝;如果是要突出高低对比,可以用双色渐变。避免用彩虹色,因为人眼对彩虹色的顺序感知不准确。

3. 实操过程与核心环节实现

3.1 环境准备与工具选型

这次实操我用QGIS作为主力工具,理由是免费、跨平台、对shp和Excel的支持都很成熟,而且坐标系处理比较透明。如果你习惯用ArcGIS,操作逻辑类似,只是菜单位置不同。代码路线我用Python的geopandas加matplotlib,适合需要批量处理或者自动化出图的场景。

QGIS的安装没什么好说的,官网下载对应版本即可。Python环境建议用conda建一个独立环境,核心库是geopandas、pandas、matplotlib,如果需要底图再加contextily。版本方面,geopandas对shp的读写依赖fiona和pyproj,conda安装会自动处理依赖,比pip省心。

注意:geopandas读shp时如果遇到编码问题,可以在read_file里加encoding参数,比如encoding='gbk'。读Excel用pandas的read_excel,.xlsx一般没问题,.csv要注意encoding。

3.2 shp路线的完整操作流程

假设你拿到的是一个省份边界的shp和一个点位shp。第一步,把两个shp都拖进QGIS,检查坐标系。在图层属性里看“源”部分的CRS,如果是EPSG:4326就对了,如果是其他投影,先统一到4326再做后续操作。统一的方法是“矢量 > 数据管理工具 > 重新投影图层”。

第二步,检查属性表。打开点位shp的属性表,确认有省份字段或者至少能通过空间关系判断省份。如果点位shp没有省份字段,用“矢量 > 地理处理工具 > 连接属性”做空间连接,把省份边界图层的名称字段挂到点位上。

第三步,做聚合统计。如果只是展示点位,跳过这步;如果要按省份着色,用“矢量 > 分析工具 > 按位置统计”或者直接在属性表里按省份分组计数,把结果导出成一张省份统计表。

第四步,把统计表连接到省份边界图层。在省份边界图层的属性里做“连接”,连接字段选省份名称,目标表选统计表。连接成功后,省份边界图层就有了点位数量字段。

第五步,设置符号化。省份边界用分级设色,字段选点位数量,分类方法选自然断点,类别数设5。点位图层用简单标记,颜色选一个和底图对比明显的,大小设3到5像素。

第六步,出图。用QGIS的“新建打印布局”,加地图、加图例、加比例尺、加指北针,导出PNG或者PDF。导出分辨率建议300dpi,方便打印和嵌入文档。

3.3 Excel路线的完整操作流程

Excel路线的第一步是读表。在QGIS里用“添加分隔文本图层”读.csv,或者用“添加矢量图层”读.xlsx(需要装Spreadsheet Layers插件)。读的时候指定X字段和Y字段,坐标系选EPSG:4326。读进来之后先看一眼点位分布,如果明显不对,检查经纬度是否搞反。

第二步,把临时点位图层导出为shp或者GeoJSON,固化下来。这一步很重要,因为临时文本图层在关闭工程后会丢失,而且不支持后续的空间操作。

第三步,准备省份边界数据。如果没有现成的shp,可以从公开的行政区划数据源获取,注意选2025年版本的边界,避免用到过时的区划。拿到边界后同样检查坐标系,统一到4326。

第四步,空间连接。用“连接属性”把省份名称挂到点位上,或者用“按位置统计”直接算每个省的点数。

第五步和第六步与shp路线一致:连接统计表、设置符号化、出图。

3.4 代码路线的关键片段

如果你要做批量处理或者自动化,Python路线值得一试。核心逻辑是:用geopandas读shp和Excel,用pandas做聚合,用matplotlib出图。下面是我常用的一个骨架:

import geopandas as gpd import pandas as pd import matplotlib.pyplot as plt # 读省份边界 province = gpd.read_file('province_boundary.shp') # 读点位Excel points_df = pd.read_excel('points.xlsx') # 转成GeoDataFrame points = gpd.GeoDataFrame( points_df, geometry=gpd.points_from_xy(points_df['经度'], points_df['纬度']), crs='EPSG:4326' ) # 空间连接,把省份名称挂到点位上 points_joined = gpd.sjoin(points, province[['省份名称', 'geometry']], how='left', predicate='within') # 按省份聚合计数 count_by_province = points_joined.groupby('省份名称').size().reset_index(name='点位数量') # 连接回省份边界 province_stats = province.merge(count_by_province, left_on='省份名称', right_on='省份名称', how='left') # 出图 fig, ax = plt.subplots(figsize=(12, 8)) province_stats.plot(column='点位数量', cmap='Blues', legend=True, ax=ax) points.plot(ax=ax, color='red', markersize=5) ax.set_axis_off() plt.savefig('map.png', dpi=300, bbox_inches='tight')

这段代码里有两个细节值得说。一是sjoin的predicate='within',意思是点位必须完全落在省份多边形内部才算匹配,边界上的点可能匹配不上,如果数据里有边界点,可以改成intersects。二是merge之后如果有点位数量为空,说明该省没有点位,出图时可以用fillna(0)补零,避免显示为空白。

3.5 出图的美化与交付要点

地图做出来和地图能交付是两回事。交付级的地图要注意几点:图例要清楚,标明颜色对应的数值范围;比例尺和指北针不能少;标题要写清楚数据年份和口径;如果点位有分类,图例里要说明每类代表什么。

颜色方面,省份底图用浅色系,点位用深色或者高饱和色,保证对比度。如果点位密集,可以调低透明度(alpha值设0.6左右),避免重叠区域糊成一片。导出格式优先选PDF(矢量,放大不糊)或者PNG(300dpi以上)。

4. 常见问题与排查技巧实录

4.1 点位偏移:先查坐标系再查加密

点位偏移是最常见的问题,表现是点位整体往某个方向偏,或者和底图对不上。排查顺序是:先确认点位和底图的坐标系是否一致,不一致就统一;如果一致还偏,检查数据来源是否用了加密坐标系。国内常见的加密坐标系和WGS84之间有几百米的系统性偏移,在省级尺度上不明显,在城市尺度上很明显。解决办法是找到数据的原始坐标系说明,用对应的转换参数纠偏,或者直接找未加密的数据源。

4.2 中文乱码:编码问题的三种场景

中文乱码出现在三个地方:shp的.dbf属性表、csv文件、Excel文件。.dbf的乱码在QGIS里通过设置数据源编码解决;csv的乱码用文本编辑器确认编码后,导入时指定;Excel的乱码比较少见,如果出现,多半是文件本身损坏或者用了特殊字符集,另存为UTF-8的csv再导入通常能解决。

4.3 省份匹配不上:建映射表是正解

匹配不上的原因前面说过,名称写法不统一。我的建议是不要试图用模糊匹配或者正则去猜,直接建映射表,一次建好以后复用。映射表可以存成csv,每次导入前先做一次替换。如果省份字段里混了城市名,比如“广州市”写在省份列里,那要先做一轮清洗,把城市名归到对应的省。

4.4 点位落在省界外或者海里

这种情况通常是经纬度搞反、坐标系错误,或者数据本身有脏值。排查方法是:先看经纬度范围,经度应该在73到135之间,纬度在3到54之间(全国范围),超出这个范围的基本是脏数据;再看点位是否落在省份多边形内,用空间查询筛出落在边界外的点,单独检查。

4.5 常见问题速查表

问题现象可能原因排查动作解决办法
点位整体偏移坐标系不一致或加密坐标对比点位和底图CRS统一CRS或纠偏
中文乱码编码不匹配确认文件编码指定GBK或转UTF-8
省份匹配率低名称写法不统一导出唯一值列表建映射表统一名称
点位跑到境外经纬度搞反或脏值检查经纬度范围交换XY或剔除脏值
点位数量对不上空值或非法坐标统计空值数量补零或剔除
出图模糊分辨率不足检查导出设置提到300dpi或导出PDF

4.6 几个我踩过的坑

第一个坑是shp文件漏了.prj,打开后坐标系显示为“未知”,我按默认的4326处理,结果和另一份投影数据叠加时点位整体偏移。后来养成习惯,拿到shp先看文件夹,缺.prj就问来源要,要不到就根据数据范围判断。

第二个坑是Excel里的经纬度列有隐藏空格,转点位时报错“无法解析坐标”。解决办法是用“去除首尾空格”处理一遍,或者用代码strip()一下。

第三个坑是省份边界数据版本太老,和点位数据里的新行政区划对不上。比如某地撤县设区后名称变了,老边界里还是旧名称,匹配不上。解决办法是找最新版本的边界数据,或者在建映射表时把新旧名称都映射到同一个标准名。

第四个坑是点位太多导致出图卡顿。几万个点直接画散点,QGIS会卡,matplotlib也会慢。解决办法是先做聚合,按省份或者按网格统计密度,用聚合结果出图,或者抽样展示。

4.7 性能与数据量的小经验

数据量在五千条以内,QGIS和Python都能流畅处理;到五万条,QGIS的符号化会明显变慢,建议先聚合再出图;到五十万条以上,就得考虑用空间数据库或者分块处理了。Excel本身的行数上限是一百多万行,但实际做地图可视化时,超过十万行的点位表用Excel管理就很吃力,建议转成csv或者直接入库。

另外,shp的单文件大小上限是2GB,虽然一般点位数据到不了这个量级,但如果要做全国高精度网格,还是用GeoPackage或者PostGIS更稳妥。

5. 数据更新与版本管理的一点心得

2025年的数据意味着时效性,而行政区划是会变的。我一般会在项目文件夹里建一个“数据版本”子目录,把每次拿到的边界数据和点位数据按日期命名,比如“province_202501.shp”“points_202503.xlsx”。这样做的原因是,当你发现某个月的点位匹配率突然下降,可以快速对比是不是边界数据换了版本。

还有一点是字段命名的一致性。不同来源的shp,省份字段可能叫“NAME”“PROV”“省”等等,我在做连接之前会先把字段名统一改成“省份名称”,这样代码和操作流程可以复用,不用每次改字段映射。这个习惯看着小,但能省下大量重复劳动。

最后分享一个我常用的检查清单,每次出图前过一遍:坐标系是否统一、省份匹配率是否达标、点位是否有明显偏移、图例和标题是否完整、导出分辨率是否够用。这五项过了,基本不会出大问题。