资讯详情 省级SHP三级区划与道路网落图:坐标、编码与县级路网密度统计
📅 2026/10/24 7:43:20
简介这套面向GIS从业者、城市规划与交通研究人员及地理信息专业学生的空间数据包聚焦四川省2022年7月的行政区划与交通网络底图需求。包内共33个文件以shp、dbf、shx、prj为主辅以xml元数据及sbn/sbx空间索引文件压缩包约66.64MB可在ArcGIS、QGIS等平台直接加载。数据覆盖省、市、县三级行政边界属性表记录行政级别与区域代码投影信息明确坐标系统道路网区分高速公路、主干道和次要道路铁路网包含高速铁路与普通线路及车站等属性便于开展行政区域对比、人口与经济差异分析、交通流量评估、选址与服务覆盖范围测算。已有2637人学习适合用于专题制图、空间查询、交通规划模型构建及灾害响应等场景为理解四川省地理空间格局、识别交通瓶颈和优化规划提供较完整的基础数据支撑。1. 从一份 2022.07 省级 SHP 说起三级区划与路网能拼出什么一份 2022.07 的省级 SHP 资源把省、市、县三级行政区划面层和道路网、公路网线层放在同一个包里做 GIS 落图时最费时间的往往不是加载而是坐标、编码和拓扑对齐。它适合做县域统计、路网密度面板、专题图底图也适合拿来做空间连接和叠加分析的练习数据。下面用“本省”指代这份 SHP 覆盖的省域重点拆三件事图层怎么体检、三级区划怎么挂接、道路网和公路网怎么落到县。铁路网线层如果也在包里处理思路相近但等级字段和道路网不是一套后面会单独说。新手可以跟着代码跑一遍熟手可以直接看参数和踩坑段。2. SHP 拆包与图层体检坐标系、字段、几何三项先过一遍拿到 SHP 压缩包很多人第一反应是拖进 QGIS 或 ArcGIS 看颜色结果一算面积就翻车。血泪经验是先做体检再谈出图。体检只看三项——坐标系能不能认、字段类型稳不稳、几何有没有空值和自相交。三项过了后面的空间连接和长度统计才有意义。这个资源是 2022.07 的行政区划加路网年份不算新但做县级统计足够真正要小心的是不同图层可能来自不同来源坐标系不一定统一。2.1 压缩包里的目录结构与图层命名SHP 不是单个文件而是一组同名文件。常见的是.shp存几何、.shx存索引、.dbf存属性、.prj存坐标系、.cpg存编码。少一个.shx或.dbfGDAL 可能还能读但属性或空间索引会出问题少.prj就只能靠猜坐标系。拿到包后先解压到一个纯英文路径别放在带空格和中文的深层目录里某些旧版驱动对路径很敏感。我一般先列目录不急着打开属性表# 解压后进入 shp 目录先看文件配对情况 find ./shp -maxdepth 2 -type f | sort # 统计每个图层的同名文件是否齐全 for f in ./shp/*.shp; do base${f%.shp} for ext in shp shx dbf prj cpg; do [ -f ${base}.${ext} ] || echo 缺少: ${base}.${ext} done done这段脚本只做一件事按 SHP 的伴生文件逐个检查。base${f%.shp}去掉后缀拿到同名基底[ -f ... ]判断文件是否存在。缺.prj不一定会报错但后面to_crs会直接失败缺.cpg则中文属性可能变成乱码。文件名以实际包为准代码里用./shp只是示例目录。图层命名通常能看出层级比如省、市、县三级面层道路网和公路网线层可能还有铁路网。不要靠文件名猜字段下一步用ogrinfo一次性看全。2.2 用 GDAL/ogr 做一次图层体检ogrinfo是 GDAL 自带的命令行工具不依赖桌面软件适合批量巡检。先看单个图层的摘要再决定要不要读全量# -so 只输出摘要-al 输出所有图层单个文件也可以直接指定 ogrinfo -so -al ./shp/admin_county.shp # 批量看每个 SHP 的几何类型、要素数、坐标系和字段 for f in ./shp/*.shp; do echo $f ogrinfo -so -al $f | sed -n 1,80p done-so是 summary only不读几何速度快-al表示所有图层。输出里重点看三行Geometry:是 Polygon 还是 MultiPolygonFeature Count:是不是 0Layer SRS WKT:有没有坐标系。如果Layer SRS WKT是空.prj大概率缺失或损坏。sed -n 1,80p只是截断输出避免刷屏实际排查可以去掉。字段部分要看类型。行政区划的编码字段如果是字符串前导零能保住如果变成整数01会变成1后面按编码挂接就会对不上。道路网的等级字段如果是数字先确认它是不是编码值别直接当排序用。长度字段如果原本有只能参考重新投影后要自己算。2.3 坐标系判定与统一到投影坐标系的选择坐标系是这类资源最容易埋雷的地方。行政区划面层常见的是地理坐标系单位是度道路网线层可能也是地理坐标系。用地理坐标系直接算面积得到的是“平方度”数值看起来像玄学和平方公里差好几个数量级。正确做法是先确认 CRS再统一转到投影坐标系。用 GeoPandas 读前几行看crs和字段import geopandas as gpd from pathlib import Path for p in sorted(Path(shp).glob(*.shp)): gdf gpd.read_file(p, rows5) print(图层:, p.name) print( 几何类型:, gdf.geom_type.unique().tolist()) print( 坐标系:, gdf.crs) print( 字段:, list(gdf.columns))rows5只读前 5 行用来快速看结构不用于统计。gdf.crs如果是None说明没有.prj或驱动没识别这时不要直接to_crs先找原始坐标系说明。geom_type.unique()能看出面层是不是混了Polygon和MultiPolygon线层是不是混了LineString和MultiLineString。混着不是错但后续line_merge、overlay要按类型处理。投影怎么选本省经度跨度不小常见做法是按 3 度带高斯-克吕格投影或者用 UTM 分带。做县级面积和路网长度统计选一个覆盖研究区的等角投影即可不必追求和官方图件完全一致。用 UTM 时按经度选带# 示例东经 102°–108° 范围用 UTM 48N更西的区域改用 47N crs_metric EPSG:32648 county gpd.read_file(shp/admin_county.shp).to_crs(crs_metric) county[area_km2] county.geometry.area / 1e6 print(county[[county_code, area_km2]].head())EPSG:32648是 WGS84 / UTM 48N单位米geometry.area得到平方米除以1e6得平方公里。如果研究区跨两个带不要硬用一个带按县拆分或改用 Albers 等面积投影。参数不是固定的关键是“先投影、再算长度面积”这条顺序不能反。提示.prj缺失时不要用“看起来像”的坐标系硬套。先用控制点或已知边界核对再写入 CRS否则后面所有面积和长度都会带着系统误差。3. 省市县三级挂接编码、面积与路网归属的落地做法三级行政区划面层最常见的用法是“县挂市、市挂省”然后按县汇总路网。听起来简单实际有两个难点一是层级字段不一定规整二是空间关系不一定干净。2022.07 的资源做区划统计够用但边界简化、飞地、跨县线状地物都会影响挂接结果。我的做法是先把属性挂接和空间挂接分开做再互相校验别一上来就用sjoin一把梭。3.1 三级边界的层级字段与编码规则省、市、县三层各自有名称和编码字段。常见编码是 6 位县级、4 位市级、2 位省级但字段名可能是code、adcode、xzqhdm之类长度也不一定统一。先看字段值和长度分布不要假设编码都是字符串import geopandas as gpd for name in [admin_province, admin_city, admin_county]: gdf gpd.read_file(fshp/{name}.shp) print(, name, len(gdf)) for col in gdf.columns: if col geometry: continue sample gdf[col].dropna().astype(str).head(3).tolist() print(f {col}: dtype{gdf[col].dtype}, sample{sample})重点看编码字段的dtype和样本值。如果dtype是int64前导零已经丢了需要从名称或上级编码重新补如果样本里出现000000、空字符串、暂无说明有占位值挂接前要过滤。名称字段可能有同名乡镇或同名区县不能拿名称当唯一键编码才是主键。层级关系不要靠名称包含来判断比如“某市”下面不一定所有县都带市名。常见做法是给县层补一个city_code给市层补一个province_code然后用编码做左连接。如果资源本身没有上级编码字段就用空间关系反推但反推结果要人工抽查。3.2 用 Python GeoPandas 做层级挂接与面积核算先做属性挂接再做面积核算。属性挂接用merge空间挂接用sjoin两者结果对不上时以编码为准空间结果只做校验。下面是一段可抄的流程import geopandas as gpd import pandas as pd crs_metric EPSG:32648 prov gpd.read_file(shp/admin_province.shp).to_crs(crs_metric) city gpd.read_file(shp/admin_city.shp).to_crs(crs_metric) county gpd.read_file(shp/admin_county.shp).to_crs(crs_metric) # 1) 面积投影后算单位平方公里 county[area_km2] county.geometry.area / 1e6 # 2) 县挂市优先用属性编码没有上级编码时用空间 within if city_code in county.columns: county_city county.merge( city[[city_code, city_name]], oncity_code, howleft, suffixes(, _city) ) else: county_city gpd.sjoin( county, city[[city_code, city_name, geometry]], howleft, predicatewithin ) # 3) 检查一对多一个县编码出现多条记录就是异常 dup county_city.groupby(county_code).size() print(一对多县数:, (dup 1).sum()) print(dup[dup 1].head())to_crs必须先做geometry.area才是平方米。merge的howleft保留所有县挂不上的city_name为空方便后面查。sjoin的predicatewithin要求县几何完全落在市几何内边界重叠或简化不一致时会漏这时可以改用intersects再按面积占比取最大但不要默认intersects就是对的。groupby(county_code).size()是检查一对多的低成本办法结果大于 1 就要看是编码重复还是空间重叠。面积核算还要注意 MultiPolygon。geometry.area会把多部件面积相加一般没问题但如果面层里有洞面积会自动扣掉。要核对总面积可以和省级面层面积对比差 1% 以内通常能接受差太多就是投影或几何问题。3.3 面层与线层的叠加路网落在哪个县路网落县有两个口径一个是“道路经过哪些县”用intersects跨县道路会出现在多个县另一个是“每个县境内的道路长度”必须先裁剪再汇总。做密度面板要用后者做连通性分析可以用前者。下面先给裁剪口径road gpd.read_file(shp/road_network.shp).to_crs(crs_metric) county_sel county[[county_code, county_name, geometry]].copy() # overlay 会把跨县道路切碎每个碎片只属于一个县 road_clip gpd.overlay(road, county_sel, howintersection) road_clip[len_km] road_clip.geometry.length / 1000 summary ( road_clip.groupby([county_code, county_name], as_indexFalse)[len_km] .sum() .sort_values(len_km, ascendingFalse) ) print(summary.head(10))overlay(howintersection)的输出保留两个图层的属性几何是相交部分跨县道路会被切成多段每段只落一个县这样汇总不会重复。geometry.length在投影坐标系下单位是米除以 1000 得公里。groupby用县编码和县名一起分组避免同名县混淆。overlay对大数据慢跑之前先裁研究区或者给县层建空间索引。如果包里有公路网和道路网两套线层不要混在一起直接加总。道路网可能包含城市道路、乡村道路公路网偏干线等级字段和重复路段都不一样。铁路网线层如果也在处理方式相同但铁路的等级、复线、电气化字段和公路不是一套统计口径要单独说明。常见做法是给每个线层加一个net_type字段再合并汇总避免把铁路里程算进公路密度。注意sjoin的intersects会把跨县道路复制到多个县直接sum会重复计算里程。做县级里程统计时用overlay裁剪或者先按道路 ID 去重再汇总。4. 道路网与公路网落图线层清洗、分级符号化与里程汇总路网线层比行政区划面层更容易出问题。面层最多是边界简化线层会有悬挂点、重复线段、断头路、等级字段缺失。把道路网和公路网直接叠在区划底图上视觉上很漂亮一做里程统计就露馅。这个资源的价值在于“区划加路网”能直接支撑县级统计但线层必须先清洗再符号化否则图面好看、数字对不上。4.1 线层几何清洗打断、去重、悬挂点线层清洗的目标不是把路网修成完美拓扑而是让长度统计可重复。第一步去空几何和重复几何第二步按道路等级或道路 ID 合并连续线段第三步检查悬挂点。下面是一段基础清洗import geopandas as gpd from shapely.geometry import LineString, MultiLineString road gpd.read_file(shp/road_network.shp) # 去空几何、去重复几何 road road[road.geometry.notna() ~road.geometry.is_empty].copy() road road.drop_duplicates(subset[geometry]).copy() # 按道路等级合并再尝试把多段线接起来 road[grade] road[grade].fillna(unknown).astype(str) merged road.dissolve(bygrade, as_indexFalse).explode(index_partsFalse) def merge_line(g): if isinstance(g, MultiLineString): return g.line_merge() if isinstance(g, LineString): return g return g merged[geometry] merged.geometry.apply(merge_line) print(merged[[grade]].assign(n1).groupby(grade).count())drop_duplicates(subset[geometry])只按几何去重属性不同的重复线也会被删掉如果重复线承载不同属性改成按道路 ID 加几何去重。dissolve(bygrade)把同等级线合并成多段线explode拆回单段line_merge尝试把端点相接的线段接成一条。line_merge不会跨不相接的线段工作所以悬挂点还在下一步单独查。悬挂点检查可以用端点计数一条线有两个端点如果某个端点只出现一次大概率是断头路或边界裁断。下面只做统计不强行修复from collections import Counter from shapely.geometry import Point endpoints [] for geom in road.geometry: if geom.geom_type LineString: coords list(geom.coords) endpoints.extend([Point(coords[0]), Point(coords[-1])]) elif geom.geom_type MultiLineString: for part in geom.geoms: coords list(part.coords) endpoints.extend([Point(coords[0]), Point(coords[-1])]) counter Counter((round(p.x, 6), round(p.y, 6)) for p in endpoints) hanging [k for k, v in counter.items() if v 1] print(端点总数:, len(endpoints), 只出现一次的端点:, len(hanging))坐标四舍五入到 6 位是為了避免浮点误差导致同一点被当成两个点这个精度在投影坐标系下约 0.1 米够用。只出现一次的端点不一定是错误行政边界裁断、数据分层都会造成断头。要做连通性分析再修做里程统计可以先不修。4.2 道路等级字段映射与符号化参数道路等级字段常见的是数字编码或中文名称直接拿来符号化会乱。先做一张映射表把原始值归一到“高速、国道、省道、县道、乡道、城市道路、其他”几类。字段值以实际数据为准下面只是示例原始字段值示例归一化等级建议线宽图面用途高速、G、S 开头高速1.6–2.2省域总图主干国道、G 开头国道1.2–1.6市县连通省道、S 开头省道1.0–1.4区域骨架县道、X 开头县道0.7–1.0县域网络乡道、Y 开头乡道0.4–0.7细部补充城市道路、无名城市道路0.3–0.6城区放大空值、未知其他0.3兜底显示映射不要写死在符号化里先在属性表加一列grade_normdef normalize_grade(v): s str(v).strip().upper() if s in {高速, G, GS}: return 高速 if s.startswith(G) or s in {国道}: return 国道 if s.startswith(S) or s in {省道}: return 省道 if s.startswith(X) or s in {县道}: return 县道 if s.startswith(Y) or s in {乡道}: return 乡道 if s in {城市道路, 城区道路}: return 城市道路 return 其他 road[grade_norm] road[grade].apply(normalize_grade)这个函数只是示例实际字段可能是G108、国道、高速混用需要按样本调整。str(v).strip().upper()先统一大小写和空格避免 g108漏掉。归一化后按等级设线宽总图才能看出骨架不要把所有线设成同一宽度那样道路网和公路网会糊成一片。4.3 按县汇总里程投影选择与长度口径里程汇总最怕两个问题坐标系没投影、跨县重复计算。前面已经讲了投影和裁剪这里补长度口径。道路长度有“几何长度”和“运营里程”两种SHP 里能算的是几何长度如果原始属性里有里程字段只能做参考不能直接替代。按县汇总时先裁剪再算长度顺序不能反。import geopandas as gpd crs_metric EPSG:32648 county gpd.read_file(shp/admin_county.shp).to_crs(crs_metric) road gpd.read_file(shp/road_network.shp).to_crs(crs_metric) # 先裁到县界再算长度 road_clip gpd.overlay(road, county[[county_code, county_name, geometry]], howintersection) road_clip[len_km] road_clip.geometry.length / 1000 # 按县和等级汇总方便后面做分级设色 by_county_grade ( road_clip.groupby([county_code, county_name, grade_norm], as_indexFalse)[len_km] .sum() ) print(by_county_grade.head())overlay之后每条线只属于一个县length不会重复。groupby同时保留县和等级后面可以画堆叠图或做等级占比。如果只想要县总里程去掉grade_norm再sum一次。crs_metric换成其他投影时长度会有细微差异做跨年对比要固定同一个投影不要每年换带。公路网和道路网如果分属两个线层建议分别汇总再合并不要先concat再裁剪。因为两个线层的重复路段、等级字段、几何精度可能不同先合并会把重复里程带进来。常见做法是给每个线层加net_type各自裁剪汇总最后按县编码merge并在报告里注明口径。提示长度统计前先确认线层有没有 Z 值或 M 值。geometry.length只看 XYZ 值不影响但如果几何是 3D 且投影不对长度仍按平面算不要误以为带了高程就是真实里程。5. 避坑与排查坐标系、编码、空几何这五处最容易翻车这份资源用起来顺不顺很大程度取决于前 30 分钟有没有做检查。下面五条是我在区划加路网数据上踩过的坑每条按“现象、原因、解决”写能复现的尽量给命令或代码。不是每个包都会全中但遇到了能快速定位。5.1 现象面积算出来差了一个数量级现象很直观同一个县QGIS 里量出来几千平方公里Python 里算出来几万甚至几十万。原因通常只有一个——面层还是地理坐标系geometry.area的单位是“平方度”。度不是长度单位平方度更不是面积单位数值没有可比性。另一种情况是投影带选错本省西部和东部硬用同一个 UTM 带边缘变形大面积偏差也会上去。解决分两步先看gdf.crs是不是地理坐标系is_geographic为True就说明还没投影再用to_crs转到覆盖研究区的投影坐标系然后算面积。跨带时不要一个 EPSG 用到底按县判断经度范围或者改用 Albers 等面积投影。算完拿省级面层总面积做一次对数差 1% 以内算正常差 10% 以上先查投影和几何。import geopandas as gpd gdf gpd.read_file(shp/admin_county.shp) print(是否地理坐标系:, gdf.crs.is_geographic if gdf.crs else 无 CRS) gdf_m gdf.to_crs(EPSG:32648) gdf_m[area_km2] gdf_m.geometry.area / 1e6 print(gdf_m[area_km2].describe())describe()能快速看面积分布出现 0 或异常大值就要查空几何和自相交。to_crs前如果crs是None先补.prj或手动set_crs不要直接转。5.2 现象市县挂接出现一对多现象是sjoin之后一个县编码对应多条市记录或者merge之后行数变多。原因有三种县层编码重复、市层边界重叠、县界跨市界。边界简化数据里飞地或跨界片区会让within失败改用intersects又会把边界线附近的县挂到两个市。名称挂接更危险同名区县直接撞车。解决顺序是先用编码merge再用空间关系校验。编码挂接后检查county_code是否唯一空间校验时用within对挂不上的县单独看几何不要直接改成intersects了事。确实需要intersects的按相交面积占比取最大并记录占比低于阈值的标记为待人工确认。# 编码挂接后检查重复 dup county_city.groupby(county_code).size() print(重复县编码:, dup[dup 1].index.tolist()) # 空间挂接后检查一个县是否落到多个市 sj gpd.sjoin(county, city[[city_code, geometry]], howleft, predicatewithin) cnt sj.groupby(county_code).size() print(空间一对多:, cnt[cnt 1].head())sjoin输出的索引是原表索引groupby(county_code)前先确认字段还在。边界重叠严重时先做make_valid修几何再挂接。5.3 现象路网在县界处断成两截现象是地图上路网在县界处突然断开或者按县汇总后总里程比全省总里程多一截。原因不是路真的断了而是线层按县界裁过或者原始数据本身在边界处被打断。line_merge只能接端点完全重合的线坐标差一点就接不上overlay裁剪后每条线只保留县内部分跨县道路自然分成两段。解决要看目的做连通性分析先按道路 ID 或名称合并再做line_merge合并前把端点坐标四舍五入到统一精度做县级里程统计接受裁剪后的分段但汇总时按县编码分组不要按道路 ID 去重。检查悬挂点时端点只出现一次的数量可以作为参考不要追求零悬挂行政边界数据很难做到。# 按道路 ID 合并同一条路的多段线再尝试接续 road[road_id] road[road_id].fillna(road.index.astype(str)) dissolved road.dissolve(byroad_id, as_indexFalse).explode(index_partsFalse) dissolved[geometry] dissolved.geometry.apply( lambda g: g.line_merge() if g.geom_type MultiLineString else g )dissolve按road_id合并explode拆回单段line_merge再接。没有road_id时只能用名称加等级近似误差会大一些。5.4 现象中文属性乱码现象是属性表里县名、道路名变成问号或乱码ogrinfo输出也不正常。原因是 DBF 的编码和读取端不一致常见是 GBK 与 UTF-8 混用.cpg缺失或写错。GDAL 有时能自动猜猜错就乱码GeoPandas 读进来直接是乱码字符串后面按名称匹配全废。解决先看.cpg内容再用encoding参数显式读。GDAL 的SHAPE_ENCODING环境变量也能起作用。读进来后不要直接改.dbf先复制一份确认编码再写回。中文名称只用于显示挂接尽量用编码能避开大部分乱码问题。# 先试 UTF-8乱码再试 GBK以实际 .cpg 为准 gdf gpd.read_file(shp/admin_county.shp, encodingGBK) print(gdf[county_name].head())encodingGBK不是万能UTF-8 数据用 GBK 读也会乱。先看.cpg里写的是UTF-8还是GBK再用对应编码。写回时用to_file(..., encodingUTF-8)并确认目标软件支持。5.5 现象导出 GeoJSON 后字段丢失现象是 SHP 导出 GeoJSON 后某些字段没了或字段名被截断。原因是 DBF 字段名有长度限制GeoJSON 虽然支持长字段名但中间转换可能被截断另外中文字段名、特殊字符、空值类型也可能导致驱动写入失败。导出 GeoJSON 后坐标顺序变成[x, y]如果下游按[lat, lon]读位置会反。解决是导出前把字段名改成英文短名保留一个映射表能用 GPKG 就用 GPKG字段名和类型更稳。必须 GeoJSON 时显式指定driverGeoJSON导出后抽查字段数量和坐标顺序。# 导出前重命名字段保留映射 rename_map {county_code: cty_code, county_name: cty_name} out county.rename(columnsrename_map) out.to_file(county.geojson, driverGeoJSON, encodingUTF-8)rename_map按实际字段调整导出后ogrinfo -so -al county.geojson对一遍字段数。坐标顺序在 GeoJSON 规范里是[x, y]即[经度, 纬度]下游库如果默认[lat, lon]要显式设置。6. 进阶用法把 SHP 做成县级路网密度面板基础挂接跑通后最有复用价值的产物不是一张图而是一张县级面板表每个县一行包含面积、道路里程、公路里程、密度。后面换年份、换路网图层只要字段对齐就能重复跑。下面这段代码把区划、道路网、公路网合成一张 CSV字段名按实际数据改import geopandas as gpd import pandas as pd crs_metric EPSG:32648 county gpd.read_file(shp/admin_county.shp).to_crs(crs_metric) county[area_km2] county.geometry.area / 1e6 def road_stats(path, prefix): road gpd.read_file(path).to_crs(crs_metric) clip gpd.overlay(road, county[[county_code, geometry]], howintersection) clip[f{prefix}_km] clip.geometry.length / 1000 return clip.groupby(county_code, as_indexFalse)[f{prefix}_km].sum() road_df road_stats(shp/road_network.shp, road) highway_df road_stats(shp/highway_network.shp, highway) panel county[[county_code, county_name, area_km2]].merge(road_df, oncounty_code, howleft) panel panel.merge(highway_df, oncounty_code, howleft).fillna({road_km: 0, highway_km: 0}) panel[road_density] panel[road_km] / panel[area_km2] panel[highway_density] panel[highway_km] / panel[area_km2] panel.to_csv(county_road_panel.csv, indexFalse, encodingutf-8-sig)road_stats把“裁剪、算长度、按县汇总”封成函数换图层只改路径和前缀。fillna(0)处理没有路网经过的县避免密度出现空值。utf-8-sig让 CSV 在常见表格软件里打开不乱码。面板字段建议固定为县编码、县名、面积、道路里程、公路里程、道路密度、公路密度后面做分级设色或时序对比都够用。输出字段含义常见用途county_code县编码主键跨表挂接area_km2投影后面积密度分母road_km县内道路几何长度总量对比highway_km县内公路几何长度干线覆盖road_density道路里程/面积分级设色highway_density公路里程/面积干线密度这张表跑出来后我一般先做两件事一是按密度排序看尾部密度为 0 的县是漏裁还是真没有路二是把总面积加总和省级面层对一遍差太多就回查投影。铁路网如果也要进面板建议单独加railway_km不要和公路混在一个密度字段里口径不同混在一起后面解释不清。从那以后我每次拿到新的 SHP都先跑一遍坐标系、编码、空几何三项检查再谈出图和统计这套顺序帮我省掉了很多返工。希望帮到你。本文还有配套的精品资源点击获取