简介:广东省shp地图是一套面向GIS从业者、城乡规划人员及区域研究学者的矢量地理数据包,聚焦广东省省界、市级与县级行政区划,并附带产业与人口专题图层。数据采用Shapefile标准格式,可直接在ArcGIS等专业软件中打开。资源共30个文件,以shp几何文件为核心,配合dbf属性表、shx几何索引、sbn/sbx空间索引、prj投影定义及mxd工程文档,压缩包仅1.25MB,小巧但结构完整;产业专题还提供jpg预览图,便于直观核对。目前已有2657人学习下载。用户拿到后可快速提取广东各级行政边界,叠加人口、产业属性进行地图制作、空间可视化和初步分析,适用于区域经济对比、人口分布呈现、公共服务设施布点等场景。由于数据包含投影文件,坐标定义明确,也适合作为高校GIS课程练习的数据底图。对于需要开展广东地理信息基础分析或课题研究的人而言,这套数据具备较好的实用价值。
1. 广东省shp地图:省级行政区划数据不该让你从画边界开始
做地图可视化或空间分析的人最怕的不是没有数据,而是数据拿回来打开一片空白、要素全挤在坐标零点、或者属性表全是乱码。广东省shp地图就是用来终结这类问题的:它是一套覆盖全省的行政区划矢量底图,包含省界、地级市界、区县级边界,可用于数据可视化、选址分析、人口与经济数据空间化、Web GIS原型搭建等场景。适合GIS开发、数据分析师、前端可视化工程师和做量化研究的同学。你不用再从零描边界,更不用求人手工画底图,但前提是搞清楚它的坐标系、字段编码和几何完整性——这正是我接下来要拆的内容。
2. 拿到shp先做三件事:查字段、查投影、查几何完整性
2.1 用QGIS快速体检:看层级和属性字段
我拿到任何shp数据的第一件事,不是写代码,而是先拖进QGIS看一眼。这能立刻暴露八成问题:坐标对不对、边界全不全、属性字段有没有值。
广东全省的地图数据通常按行政层级拆分成多个文件,常见的是“省界、地级市、区县”三组。在QGIS左侧图层面板里,把三个图层都加进来,先看两点:
一是缩放比例尺,看省界是否有闭合、各区县是否有明显缺块。二是打开属性表,看字段结构。一般行政区划shp会带“名称”“行政区划代码”这类属性,有的还有“级别”“面积”等派生字段。若属性表全空,那它就只是“一张画了边界的图”,后续做空间关联会很痛苦。
一份能用的广东区县级shp,属性表里至少要有:名称字段、行政区划代码字段。代码字段尤其关键,它是空间数据与统计年鉴数据做关联的主键。没有代码字段,我只能靠名称模糊匹配,翻车概率极高。
提示:在QGIS中快速检查要素数量,右键图层→属性→信息,会显示要素总数。地级市约20个,区县在100个以上,如果数量对不上,说明数据有缺失或抓取不完整。
2.2 用GeoPandas查投影和几何:不能被“看起来正常”骗了
QGIS能显示不代表坐标可靠。我见过太多shp在QGIS里显示正常,导出给后端却发现坐标是经纬度和投影坐标混用的。所以第二步用GeoPandas做程序化检查,把坐标系和几何类型打印出来。
import geopandas as gpd gdf = gpd.read_file("guangdong_county.shp") print(gdf.crs) # 查看坐标系 print(gdf.geometry.geom_type.unique()) # 几何类型 print(gdf.geometry.is_valid.sum(), "/", len(gdf)) # 有效几何数量 print(gdf.bounds.head()) # 查看每个要素的经纬度范围这段代码做了四件事:第一行打印坐标系定义,正常情况应该能看到EPSG:4326或其他坐标系描述,如果输出None,说明shp缺投影文件;第二行看几何类型,行政区划应该是Polygon或MultiPolygon,出现LineString说明数据有问题;第三行统计有效几何数量,能初步暴露自相交问题;第四行打印要素边界范围,广东的大致范围北纬20°到25.5°、东经109°到118°左右,如果出现0或负数大值,别急着分析,先去查坐标定义。
参数上要注意,read_file默认按文件实际内容读取,并不会自动修正坐标系。crs是None时,后续to_crs做投影转换会直接报错。遇到这种情况,我一般先查数据源说明文档,确认原始坐标系是WGS84还是CGCS2000,再手动指定。
2.3 shp是一组文件不是单个文件:缺组件会导致读不出来
这是非常基础的常识,但也是下载资源最容易翻车的点。shp格式是“多文件结构”,一个完整的shapefile至少需要四个文件配合才能正常打开:
| 文件后缀 | 作用 | 缺失后果 |
|---|---|---|
| .shp | 存储几何坐标 | 无法显示图形 |
| .shx | 几何索引 | 部分软件打不开 |
| .dbf | 属性表数据 | 属性全丢 |
| .prj | 投影坐标系定义 | 坐标乱掉或无法转换 |
| .cpg | 属性表字符集说明 | 中文乱码 |
在命令行下可以直接用ls命令核对文件完整性:
ls -l guangdong_county.*输出里应该看到至少四个同主名文件。如果只有.shp和.dbf,那必须回去补全组件。常见做法是用QGIS“另存为”重新生成一份完整的shapefile,或者用GDAL的ogr2ogr命令做一次格式转换。
ogr2ogr -f "ESRI Shapefile" guangdong_county_fixed.shp guangdong_county.shp这条命令会读取原始数据,重新产出全套shp组件文件。–f参数指定输出格式为ESRI Shapefile,输出文件名换一个,避免覆盖原始数据。执行完后再跑一遍ls命令,文件族就齐全了。
这里有个容易误会的点:很多人以为.shp一个文件就是全部,这是不对的。你从网上下到的数据如果只有一个.shp,那基本可以判断是某平台的数据导出工具偷懒,只发了几何文件,属性数据已经丢了。
3. 把shp用起来:区划合并、坐标转换与导出
3.1 先用GBK或UTF-8把dbf属性读出来
广东省的行政区划shp来自不同源头,属性表编码很分裂:有的是GBK,有的是UTF-8。GeoPandas读取时如果编码不对,中文名称会变成乱码。
import geopandas as gpd gdf = gpd.read_file( "guangdong_county.shp", encoding="utf-8" ) print(gdf[["name", "adcode"]].head())假如打印出来的名称字段是“锟斤拷”或“鏉窞”,说明编码猜错了。把encoding参数改成gbk再读一次:
gdf = gpd.read_file( "guangdong_county.shp", encoding="gbk" )多数情况下,老数据的dbf用GBK编码的概率更大,因为早期ArcGIS的数据生产环境默认就是GBK。新导出的开源数据大多用UTF-8。判断依据可以看.shp同目录下有没有.cpg文件——它记录的就是编码信息。查看它的内容:
cat guangdong_county.cpg输出UTF-8就按UTF-8读,输出GBK或GB2312就按GBK读。如果连.cpg都没有,那就两个编码都试一遍,这是最笨但也最有效的办法。
注意:不要用Excel直接打开dbf文件查看,它不会告诉你真实编码,改文件还可能损坏结构。用GeoPandas或QGIS读最稳。
3.2 按地市级合并区县:dissolve的字段保留策略
拿到区县级shp后,有时需要把边界合并成地级市级别,比如做市级人均GDP分布图。GeoPandas里用dissolve方法:
import geopandas as gpd gdf = gpd.read_file("guangdong_county.shp", encoding="utf-8") city_gdf = gdf.dissolve( by="city_name", # 按地市名字段分组 aggfunc="sum", # 非几何字段聚合方式 as_index=False ) print(city_gdf.shape)dissolve的核心逻辑:按分组字段合并几何,把同一地市下所有区县边界融合为一个面。这里最容易犯的错是aggfunc参数设置。如果属性表里有面积字段,用sum会重复累加——每个区县的面积加总成地市面积,这没问题。但如果有“人口”字段,sum也是对的。可如果字段是“人均GDP”这种派生指标,sum就完全错了,合并后必须重新计算。
我一般会在dissolve之前先把不需要的字段全部drop掉,只保留name、adcode这类后续用得上的标识字段,然后aggfunc设为first,避免数值字段被错误累加。
3.3 坐标转换到CGCS2000:七参数和四参数该信谁
广东的shp数据最常见的两种坐标系是WGS84经纬度和CGCS2000经纬度。前者是GPS原始坐标基准,后者是国家大地坐标系。很多制图规范要求输出CGCS2000,所以坐标转换绕不开。
gdf_cgcs2000 = gdf.to_crs("EPSG:4490") print(gdf_cgcs2000.crs)EPSG:4490就是CGCS2000地理坐标系,单位是度。如果只是经纬度层面转换,因为WGS84与CGCS2000在民用精度下差异极小(理论框架差异约几厘米到亚米级),直接原地切换即可,肉眼完全看不出差别。
但如果你拿到的shp是投影坐标,比如地图厂商导出过的高斯-克吕格投影,那就要小心了。投影坐标转回地理坐标,必须先确认数据落在哪个分带(3度带还是6度带),中央经线是多少。分带搞错,图形会横向错位几十公里。遇到这种数据,我一般优先用GDAL做转换:
ogr2ogr -t_srs EPSG:4490 output.shp input.shp -s_srs EPSG:4547这里-s_srs指定源坐标系,EPSG:4547是CGCS2000 3度带高斯投影的某分带代称。实际分带要看数据范围,广东区域常用120度中央经线那一带。参数不对,转换结果就是整个边界变成一条斜线,非常直观。
3.4 导出成GeoJSON/PostGIS给上层应用用
后端分析和前端可视化需要的格式通常不是shp。shp是传统GIS桌面软件的格式,浏览器里没法直接用。所以最后一步通常是转成GeoJSON。
gdf_cgcs2000.to_file( "guangdong_city.geojson", driver="GeoJSON", encoding="utf-8" )导出后我习惯先打开GeoJSON文件看一眼头部,确认坐标数组不是空壳,属性字段是中文原文不乱码。如果数据量大,超过10MB,前端渲染会卡,这时优先考虑转成TopoJSON,或是接入PostGIS做空间查询,只返回视野范围内的数据。
另外,如果项目是要部署到在线地图上,务必确认坐标系与在线底图一致。绝大多数在线底图使用Web墨卡托投影,对应EPSG:3857。直接从EPSG:4490转3857:
gdf_web = gdf_cgcs2000.to_crs("EPSG:3857")但这只是坐标参考系的数学转换。另一个坑是地图厂商对国内坐标做了偏转处理,直接用WGS84或CGCS2000的shp叠加在在线底图上,会发现省界整体偏移几百米。这个问题不是转换能解决的,后面避坑章节细说。
4. 制图与可视化:把边界落到一张能用的图上
4.1 QGIS分级配色:五分钟做出一张专题图
数据检查无误后,最快速的出图方式是QGIS。假设我要把广东各地市的某个统计指标做成等级图:右键图层→符号系统→分级。在“分级”面板里选择要渲染的数值字段,分级方法选“自然间断点”,类别数量设为5左右,颜色渐层用浅色到深色。
分级符号化的核心参数是“模式”和“类别数”。自然间断点适合本身分布不均的数据,能拉开层级差距;等间距则适合数值均匀分布的指标。如果数据有极端值,建议先看直方图,把离群值单独处理。
做行政区划专题图时,还要注意边界线的视觉层级:地市级边界线宽0.6到0.8,线色灰色;省界加宽到1.2;县级边界只在需要局部展示时开启,不然图面会显得很碎。
提示:出图前务必先用“检查几何有效性”工具跑一遍,否则后续打印或导出PDF时,边界可能会出现奇怪的破洞或重叠。
4.2 在线渲染:GeoJSON接入前端底图
Web端展示行政区划数据,最常见的选择就是Leaflet。把上面导出的GeoJSON直接加载进来:
fetch("guangdong_city.geojson") .then(res => res.json()) .then(data => { L.geoJSON(data, { style: function(feature) { return { color: "#666", weight: 1, fillOpacity: 0.3 }; }, onEachFeature: function(feature, layer) { layer.bindTooltip(feature.properties.name); } }).addTo(map); });这段代码里有两个关键点。style回调控制样式,web墨卡托底图下最好把fillOpacity调低,避免遮挡底图底纹。onEachFeature中的bindTooltip把属性表中的名称字段挂到悬浮提示上,前提是属性字段名与你GeoJSON里的properties键一致。
如果数据量超过几万要素,前端直接挂载GeoJSON会卡顿。这时候要把数据交给后端PostGIS做空间过滤,前端只加载视野范围的数据。我用过Practical最顺的方式:后端提供一个接口,接收前端传过来的边界范围,返回与范围相交的行政区要素。整套链路从shp到PostGIS的导入也很简单:
shp2pgsql -s 4490 -I guangdong_county.shp guangdong_county | psql -U postgres -d gisdb-s参数指定坐标系EPSG:4490,-I参数会自动创建空间索引。导入后,前端通过接口请求,体验比直接加载几十MB的GeoJSON好一个量级。
4.3 标注避让:名称重叠的烦恼
行政区划图的标注是个容易显穷的细节。地市级名称放在面中心,用“地市质心”标注;区县名称同理。但广东沿海区县密集,小面积区县的中心点会互相重叠。
在QGIS中解决标注重叠,可以用“基于规则的标注”,在放置设置里开启“禁止冲突”,并把优先级设为按面积从大到小分配——面积大的先标,面积小的自动让位或隐藏。这是出图时我每次都强制检查的选项。
5. 广东省shp地图避坑实录:乱码、边界漂移与拓扑错误
5.1 属性表中文变成“锟斤拷”乱码
现象:在QGIS或GeoPandas中打开广东shp,名称字段显示为“锟斤拷”“鏉窞”等奇怪字符。
原因:dbf属性表是GBK编码,但读取时默认按UTF-8解码,中文二进制字节被错误解析。这是shp数据历史遗留问题,老数据生产环境多为GBK。
解决:先看同目录.cpg文件确认编码,或在读取时指定encoding="gbk"。如果是QGIS打开,在添加图层时选择“图层编码”为GBK。已经乱码的数据不要直接在Excel里改,重新用正确编码读一遍最干净。
5.2 加载后图形跑到海里或消失
现象:shp在QGIS里加载后,图层显示完全空白,或者边界跑到非洲几内亚湾附近。
原因:数据是投影坐标,但软件按经纬度坐标渲染,或者.prj文件缺失导致软件默认按EPSG:4326处理。投影坐标值通常在数百万级别,与经纬度的百级数值差了几万倍。
解决:先打印数据范围的min/max值,如果数值在几十到一百多,大概率是经纬度;如果是六位数甚至七位数,就是投影坐标。用ogr2ogr指定正确的-s_srs和-t_srs重投影。我处理的模拟项目X里遇到过一次边界跑到大洋中央的,原因就是源数据的投影分带参数写错,换中央经线后恢复正常。
5.3 shp只有一个文件,缺了一整套组件
现象:下载的“广东省shp地图”解压后只有一个.shp文件,拖进QGIS报“无效数据源”,或打开后只有图形没有属性。
原因:资源发布者只上传了主文件,没有把.shx、.dbf、.prj一起打包。很多网盘打包工具会自动过滤掉“看起来像隐藏文件”的同名文件,导致组件缺失。
解决:优先联系发布者要完整包。如果拿不到完整包,用ogr2ogr强制读取.shp并重新输出一套完整文件。如果.shp本身已经缺了.dbf,那属性数据大概率已经彻底丢失,只能靠图形做纯展示用途。
5.4 合并后出现细长面或自相交
现象:用dissolve把区县合并成地市后,生成的面出现自相交,或在计算面积时报错,甚至某些地市边界多出极细长的“缝”。
原因:原始区县边界在相邻处存在微小重叠或间隙,或者个别要素是无效几何,比如自相交多边形。dissolve时这些无效几何会被带进合并结果。
解决:在dissolve前跑一遍几何修复:
from shapely.validation import make_valid gdf["geometry"] = gdf.geometry.apply(make_valid)make_valid会重构无效几何,自相交的面会被拆成合法多边形。修复后重新跑dissolve,生成结果再做一次is_valid检查。如果几何数量不多,也可以在QGIS里用“修复几何”工具手工处理。
5.5 叠加在线地图总是偏几百米
现象:shp和在线地图都是“经纬度”,但叠加后省界线与影像底图总是对不上,整体偏移。
原因:国内在线底图厂商使用了偏转坐标算法,把WGS84坐标加密到偏移后的坐标系。直接叠加未经转换的原始坐标必然偏移。
解决:两种办法。一是换底图,使用无偏转的标准底图;二是在应用中引入坐标纠偏库,把WGS84的经纬度在客户端做一次偏转转换。这个问题本质上是坐标系基准不统一,不是shp数据本身的问题。
注意:在处理专题图叠加影像做对比时,最好确保两边坐标系基准一致,否则“看着是同一个点,实际隔了一条街”。
6. 交付前做三个验证:几何修复、面积自检与影像底图比对
最后这步是我从多次翻车换来的习惯:所有shp数据在用于正式项目前,都要跑一遍几何有效性、面积量算和视觉比对三重验证。很多人拿到数据直接做分析,最后出图全是破洞或边界错位,回头改数据反倒浪费两倍时间。
第一重验证是几何有效性。用GeoPandas跑is_valid统计,如果无效几何比例超过千分之一,就用make_valid修复,再导出新文件。这一步能避免后续空间计算和出图时出现莫名其妙的异常。
import geopandas as gpd gdf = gpd.read_file("guangdong_county.shp", encoding="utf-8") invalid = gdf[~gdf.geometry.is_valid] print(f"无效几何: {len(invalid)}")第二重验证是面积自检。把地理坐标投影到适合广东区域的等积投影,再计算各要素面积,与官方统计年鉴上的行政区面积做对比。偏差超过2%就说明数据有问题,可能是边界缺失或几何错误。广东海岸线曲折,沿海区县如果漏了填海区域,面积偏差会很明显。
第三重验证是视觉比对。把shp叠加到无偏转的影像底图上,透过半透明边界检查主要城镇轮廓是否吻合。行政边界与影像中明显的地物特征(如河口、山脊线)不应有肉眼可见的偏移。这一步靠代码无法替代,必须人眼抽查三到五个区域。
从那以后,我每次拿到shp数据都强制走一遍这三个验证,哪怕再急也至少跑完前两个。这套流程救过我不少次,尤其是那些“看起来全对”的数据,偏就偏在不起眼的多边形角落里。希望帮到你。
本文还有配套的精品资源,点击获取