首页 / 资讯中心 / 文章详情

带审图号的中国行政边界SHP数据怎么用?国省市县边界处理全攻略

带审图号的中国行政边界SHP数据怎么用?国省市县边界处理全攻略 ★ FEATURED ARTICLE
简介面向地图制图、GIS开发与数据分析人员提供一套带审图号GS(2019)1822号的中国国省市县四级行政边界矢量数据shp格式包含十段线和南海诸岛解决地图合规使用与边界数据获取两大痛点。压缩包内共62个文件涵盖shp几何数据、dbf属性表、shx几何索引、prj投影定义等标准矢量组件以及sbn/sbx空间索引、xml元数据、审图号说明txt、原图jpg预览等辅助文件整体约78.78MB层级清晰便于直接查找。数据按国界、省界、市界、县界分别组织同时提供等积投影与通用投影版本可适应学术制图、Web可视化、地理统计分析等不同场景十段线与南海诸岛的完整呈现保证了南海海域表达规范。随包附带的审图号文本和“国家数据库原图”可供核对边界和用途申报参考。已有297人浏览学习适合需要规范中国行政边界底图的从业者或研究者快速获取可用数据。1. 国省市县级中国行政边界shp带审图号的地图数据集到底怎么用做地图可视化的人都知道一张能公开用的中国地图比算法难找多了。市面上的行政边界shp要么缺南海诸岛要么得自己补十段线更麻烦的是没有审图号项目交付、文章配图都卡在合规上。这份国省市县级中国行政边界数据集把这块补齐了国、省、市、县四级边界齐全十段线和南海诸岛附图层单独存放自带审图号GS(2019)1822号公开出图可以拿审图号说话。适合GIS数据分析、Web地图开发、报告配图这几类场景ArcGIS、QGIS、GeoPandas都能直接读算是能省不少事的底图数据。2. 数据包里有什么shp文件构成与边界层级拆解2.1 先检查文件完整性shp格式不止四个文件拿到数据集后我的第一件事不是急着打开而是确认文件结构完整。shp本质上是多文件格式主文件只存几何属性存在dbf里空间索引和投影信息各用一个辅助文件。这套国省市县级行政边界包里每一级边界至少对应四个基础文件。文件后缀作用缺失后果.shp要素几何点线面打不开图层.shx几何索引部分软件无法读取.dbf属性表名称、区划代码名称全部丢失.prj坐标系描述坐标错位或软件报错除了这四个还可能有.cpg编码声明、.sbn/.sbx空间索引这些是可选文件。注意网上流传的裁剪版本经常把.prj丢了导致图层被当成未知坐标系加载。检查命令我一般用终端直接列目录ls -la ./cn_admin_boundary/看输出里shp、shx、dbf、prj四个文件的时间戳是否一致如果dbf明显是后补的说明属性表可能被改写过。时间戳一致的包完整性更好。之前我拿到过一个只有三个文件的版本缺了.prjQGIS加载后整个图层都落在赤道上排查了很久才发现是坐标系缺失。2.2 国省市县四级边界图层组织与属性字段这个数据集的图层组织方式比较清晰通常是一个主图层包含全部级别用行政区划级别字段区分或者分四个独立shp文件分别存放国、省、市、县边界。我拆过的这个包采用的是独立文件方案南海诸岛和十段线做成单独的要素层不混在省级边界里。属性字段是另一个容易忽略的点。行政边界数据的属性表里至少要有名称字段和行政区划代码字段代码字段常见的是六位数字编码代表国标行政区划代码。拿到数据后先用Python读一下字段结构和前几行确认名称字段用的是什么编码import geopandas as gpd gdf gpd.read_file(./cn_admin_boundary/province.shp, encodingutf-8) print(gdf.columns.tolist()) # 查看字段名列表 print(gdf[[NAME, ADCODE]].head(10)) # 名称和区划代码代码里encoding参数很关键如果dbf是GBK编码而这里写成utf-8读出来的名称会全是乱码。这种情况下先试encodinggbk读取后再转成字符串。字段ADCODE如果存在后续做数据融合、按区域筛选都用得上比用名称匹配可靠得多因为名称在不同版本里可能有简称和全称的差异。十段线的存放方式也要看清楚数据包里一般有专门的线要素图层一段线代表一段断续国界线覆盖南海海域。出图时这个图层要和主图放在同一个地理范围内不能单独设置成飞地或插图否则图审环节会出问题。2.3 坐标系先统一再干活CGCS2000还是WGS84行政边界数据的坐标系直接决定了它能不能和你手头的其他图层套合。这个包在prj文件里声明的是什么很重要常见的有两种CGCS2000地理坐标系经纬度和WGS84地理坐标系。两者的数值差异在普通地图比例尺下几乎看不出来但混用时叠加在线底图上就会偏移几十米到几百米。读取坐标系用ogrinfo最直接ogrinfo -so ./cn_admin_boundary/province.shp province | grep -A 5 Coordinate System输出信息里能看到坐标系名称、基准面、投影参数。如果是Albers_Equal_Area或Mercator投影说明数据做过投影变换这时要和WGS84在线底图叠加必须先做重投影。我的处理习惯是把所有行政边界统一投影到Web墨卡托EPSG:3857再缓存起来因为不管接Mapbox还是其他在线瓦片都不用每次加载都做实时重投影。不过要注意做面积统计时用3857会有变形应按省级面积量算需求先转回Albers或Lambert投影。3. 加载与出图从shp到合规地图的完整流程3.1 QGIS加载shp编码和样式一次配好QGIS加载shp时容易被坑在编码上。默认情况下QGIS可能用系统编码猜dbf的编码方式猜错就乱码。所以加载矢量图层时要主动指定编码。操作路径是图层 → 添加图层 → 添加矢量图层 → 在“编码”下拉框里选UTF-8如果打开后属性表中文还是乱码就关掉重来换GBK或GB18030再试一次。样式设置方面我一般直接把线状边界和面状填充分开配。国家级边界用2号深灰色省级边界用1号中等灰市级边界用0.5号浅灰县界只在需要局部放大的视图里启用。QGIS里把样式保存成qml文件换机器加载时可以直接复用不用重新调。下面是一个精简的qml内容适合做底图边界qgis pipe rasterrenderer rastertransparency/ /rasterrenderer vectorlayer symbol layer pass0 classSimpleFill prop kcolor v245,245,245,255/ prop koutline v80,80,80,255/ prop koutline_width v0.4/ /layer /symbol /vectorlayer /pipe /qgis这里的color是填充色outline是边界线颜色outline_width是线宽单位是毫米。注意透明度的写法最后一个255是不透明想淡一点就调低数值。qml里还支持按字段设置分类样式比如按ADCODE前两位区分省份颜色适合做专题图。3.2 出图布局主图与南海诸岛附图的位置关系合规出图的关键不在地图多漂亮在于图幅完整性。标准做法是主图覆盖中国全境南海诸岛作为附图放在主图右下角十段线必须完整落在附图范围内。QGIS打印布局里先添加主图再把南海附图的数据框拖进布局设置固定比例尺。常见翻车场景是把主图裁到中国大陆轮廓内然后单独把南海诸岛放大放在角落比例尺对不上。正确做法是让十段线图层和主图使用同一坐标系同一范围附图只是视窗范围变化不改变要素的几何位置。具体布局参数我习惯这样设主图比例尺1:32000000附图比例尺1:48000000附图位置在主图右下角宽度占主图宽度四分之一左右这样既符合地图阅读习惯也能保住十段线在图面上的位置。3.3 导出前的合规检查审图号怎么标注出图导出的前一步要过一遍合规检查清单不是光有个审图号就万事大吉。审图号GS(2019)1822号本身代表这套数据通过了审图流程但你在图上标注的位置和样式也有要求通常放在图名下方或图廓外右下角字体大小不低于正文的一半。我的检查顺序是第一国界线是否完整十段线是否显示第二行政区域名称是否有错字漏字第三港澳台图层是否单独做了样式区分第四审图号是否已标注且清晰可读第五地图比例尺、指北针、图例是否齐全。这五项过完再导出比事后被退回重做省时间得多。4. 避坑行政边界数据最常见的五个坑4.1 属性表中文乱码名称全是问号现象加载shp后NAME字段显示为“”或乱码省份名称无法辨认。原因dbf文件的编码是GBK/GB18030加载时按UTF-8解析了。这个在Windows导出的数据里尤其常见部分数据生产工具默认用系统区域编码写dbf。解决加载矢量图层时在编码下拉框里手动选GBK或GB18030再通过字段计算器把NAME列转成UTF-8存储或者直接重新保存一份UTF-8编码的shp副本。用GeoPandas读的时候read_file里带上encodinggbk参数即可。4.2 图层和在线底图对不上偏移好几个街区现象行政边界和影像底图之间有明显位移边界线嵌进建筑里。原因边界数据是CGCS2000或西安1980坐标系底图是WGS84两者默认参考框架有差异虽然都是经纬度但不同基准面之间有几米到几十米的平移。解决在QGIS里对边界图层执行重投影目标坐标系选EPSG:3857然后再加载在线底图。如果偏移量巨大先检查prj文件是否存在没有prj文件的shp被QGIS强行按未知坐标系加载才是真正的元凶。4.3 十段线消失在主图外或南海诸岛只剩几个点现象出图后南海诸岛区域空白十段线不在图幅范围内或者跑到主图之外。原因出图布局里只框选了大陆范围作为主图视窗十段线图层还在但视窗裁剪把它裁掉了附图又没有单独配置视窗。解决在打印布局里为南海诸岛添加独立的图幅绑定十段线所在的图层设置好范围让它显示在主图右下角。我一般复制主图的图层组然后把视窗范围拖到南海区域最后统一比例尺这样十段线和岛礁位置不会错乱。4.4 导出GeoJSON后属性字段丢失或乱码现象shp转GeoJSON后打开发现字段名变了中文属性乱码部分几何变成空。原因GeoJSON的字段类型和shp不完全兼容部分旧字段类型如日期型、数值型宽字段转换时会丢精度或变成null编码处理不当也会让中文属性全乱。解决转换前先清洗字段保留必要的名称字段和区划代码字段其他字段删掉输出时指定driverGeoJSON并确保数据本身是WGS84坐标因为GeoJSON规范要求用WGS84。4.5 公开出图被审图环节打回配图不合规现象地图放在项目报告或网页上后被要求下架或修改理由是边界不完整或缺少审图信息。原因出图时漏了南海诸岛或用了没有审图号的旧数据或审图号标注位置不显眼图面信息不完整。解决换用带审图号GS(2019)1822号的数据集出图前严格按第3章的检查清单过一遍审图号标注在图廓内醒目位置。别自己手动画十段线直接用数据包里现成的线图层。5. 裁剪与融合按业务范围提取边界数据5.1 按区域提取目标范围GeoPandas属性筛选处理行政边界数据提取业务涉及的区域是常用操作。比如项目只需要某几个省份的市县级边界在这种情况下按ADCODE字段筛选效率最高。GeoPandas读取后按行政区划代码前两位过滤代码如下import geopandas as gpd gdf gpd.read_file(./cn_admin_boundary/city.shp, encodingutf-8) # 假设目标省份区划代码前缀为11和12 target_prefix (11, 12) gdf[ADCODE] gdf[ADCODE].astype(str).str.zfill(6) subset gdf[gdf[ADCODE].str.startswith(target_prefix)] subset.to_file(./output/target_city.shp, encodingutf-8, driverESRI Shapefile)astype(str)防止区划代码被识别成数值导致前导零丢失zfill(6)把缺失的高位补零startswith过滤出前缀匹配的行政区。to_file里encodingutf-8保证写出的dbf属性在主流软件里正常显示。5.2 县级边界融合成市级Dissolve操作正确姿势有些业务不需要县级精度要把县级边界合并成市级。这里最忌讳的做法是先按名称字段直接溶解因为名称可能有重名或简称差异。正确做法是先按ADCODE前四位分组再溶解几何import geopandas as gpd county gpd.read_file(./cn_admin_boundary/county.shp, encodingutf-8) county[city_code] county[ADCODE].astype(str).str.zfill(6).str[:4] city county.dissolve(bycity_code, aggfuncfirst) city.to_file(./output/city_dissolved.shp, encodingutf-8, driverESRI Shapefile)dissolve的aggfunc参数指定非几何字段的聚合方式用first表示保留每个市的第一条记录这样城市名称还会留在属性表里。如果用groupby写聚合逻辑要确保没有不必要的字段参与溶解否则可能会出现同一个市被拆成多个面的情况。5.3 导出GeoJSON给Web地图坐标和编码一起搞定Web地图项目里shp要转GeoJSON才能被前端直接消费。这个环节坑比较多记住一个原则GeoJSON必须是WGS84坐标。如果原始数据是CGCS2000要先做投影变换再导出import geopandas as gpd gdf gpd.read_file(./cn_admin_boundary/province.shp, encodingutf-8) gdf_wgs84 gdf.to_crs(epsg4326) gdf_wgs84.to_file(./output/province.geojson, driverGeoJSON, encodingutf-8)to_crs(epsg4326)把坐标系转成WGS84地理坐标系driverGeoJSON指定输出格式。注意GeoJSON文件本身是UTF-8编码不需要额外处理编码问题但前端读取时要确认fetch或axios设置了正确的响应类型。之前我把CGCS2000的数据直接导出了GeoJSON结果在线地图上整体偏移明显后来强制每次都先转4326再导出就再没出过这类问题。6. 最后一个习惯叠加经纬网校验十段线完整性数据加载完、样式调好、导出前我最后一道工序是叠加经纬网做完整性校验。在QGIS里用“网格”工具生成1度间隔的经纬网叠加在行政边界图层上重点检查十段线是否跨越东经109度到118度这个范围以及南海诸岛附图的经纬度位置是否合理。这一步能快速发现图层错位、范围裁错、十段线丢失三类问题。习惯用代码校验的也可以写一段轻量逻辑import geopandas as gpd line gpd.read_file(./cn_admin_boundary/ten_dash_line.shp, encodingutf-8) total_geometry_count len(line) valid_geometry_count line.geometry.is_valid.sum() print(f要素数: {total_geometry_count}) print(f有效要素数: {valid_geometry_count})如果要素数为零或有效要素数明显偏少说明shp主文件或索引文件已经损坏需要回到原始压缩包重新解压。从那以后我每次接到边界数据都强制走一遍文件完整检查、坐标系统一、十段线叠加校验确认三道工序都过了再谈出图和交付省下的都是后面的返工时间。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站