资讯动态

四川SHP包实战:坐标系、编码与路网可达性分析

发布时间:2026/10/14 11:39:26 来源:尧图企业网站定制
简介这份资源面向GIS从业者、城市规划与交通研究人员及地理信息相关专业师生提供2022年7月整理的四川省地理空间数据可用于行政区域分析、交通网络规划、空间查询与专题制图等场景。压缩包共33个文件约66.64MB以shp、dbf、prj、shx等Shapefile核心格式为主辅以sbn、sbx空间索引与xml元数据文件覆盖省级、地市级、区县级行政边界以及道路网与铁路网数据属性表与投影信息齐全可直接在ArcGIS、QGIS等软件中加载使用。借助这些数据读者能够比较不同层级行政区域、评估路网布局与交通瓶颈或将交通与行政图层叠加制作直观地图并结合人口、经济等外部数据构建分析模型。目前已有2630人浏览学习适合需要四川省基础地理底图与交通网络数据的中高级GIS用户参考使用。1. 拿到一份 2022.07 的四川 SHP 包先别急着拖进 ArcGIS上周有个做物流选址的读者发来一份压缩包文件名是「【SHP文件-2022.07】四川省行政区划省、市、县道路网公路网」问我能不能直接拿来做配送分区。我打开一看省、市、县三级行政边界齐全道路网和公路网分层存放坐标系是常见的 CGCS2000 地理坐标。这类资源在 GIS 圈子里属于「基础底图级」素材——做四川范围内的空间分析、路网可达性、行政区划统计基本都绕不开它。但问题也恰恰出在「基础」两个字上。很多人拿到 SHP 包的第一反应是双击打开、拖进软件、开始画图结果要么是中文属性乱码要么是道路网和行政区划对不上位置要么是面积算出来差了几个数量级。这份 2022.07 的数据本身质量不差坑主要出在使用方式上。下面我按「先搞清楚里面有什么、再动手做一次完整加载、最后把常见翻车点过一遍」的顺序拆开讲新手能照着复现熟手可以重点看坐标系和拓扑那两节。2. 拆包先看结构省、市、县三级边界与路网分层怎么读2.1 文件清单与图层对应关系拿到压缩包后不要直接解压到中文路径下这是第一个血泪经验。SHP 格式对路径中的中文和空格容忍度很低尤其是后续用 Python 的 geopandas 或 GDAL 读取时路径里带中文经常报「文件不存在」或「无法识别数据源」。我一般会先解压到一个纯英文短路径比如D:/gis_sc/然后再看目录结构。一份典型的四川行政区划加路网 SHP 包解压后通常包含以下几组文件。每组 SHP 至少由.shp、.shx、.dbf、.prj四个文件组成缺一不可。很多人只拷贝.shp就发给别人结果对方打开后属性表全空就是因为.dbf没带上。图层组常见文件名示例几何类型关键属性字段省级边界sc_province.shpPolygon省名、省代码市级边界sc_city.shpPolygon市名、市代码、所属省县级边界sc_county.shpPolygon县名、县代码、所属市道路网sc_road.shpLineString道路名称、等级、长度公路网sc_highway.shpLineString公路编号、等级、类型需要留意的是不同来源的 SHP 包在字段命名上差异很大。有的用拼音缩写有的用中文全称有的干脆只有NAME和CODE两个字段。2022.07 这个时间点意味着行政区划数据大概率已经包含了当年最新的乡镇级调整结果但县级以上的边界变动不大拿来和旧版对比时主要看属性表里的代码是否一致。2.2 坐标系与投影为什么你的面积算出来是错的这是最容易被忽略、后果最严重的一节。SHP 包里的.prj文件决定了数据的坐标系。四川常见的坐标系有两种一种是 CGCS2000 地理坐标系经纬度单位是度另一种是 CGCS2000 高斯-克吕格投影单位是米。如果你拿到的是地理坐标系直接算面积会得到一个以「平方度」为单位的数字完全没有物理意义。判断方法很简单用记事本打开.prj文件看里面有没有Gauss_Kruger或CGCS2000_3_Degree_GK_Zone之类的字样。如果有说明已经是投影坐标单位是米可以直接算面积。如果只有GCS_China_Geodetic_Coordinate_System_2000那就是地理坐标必须先投影。我一般会统一转到 CGCS2000 3 度带高斯投影中央经线根据四川的经度范围选 102°E 或 105°E。下面这段 Python 代码演示了如何用 geopandas 读取并检查坐标系然后做一次投影转换。import geopandas as gpd # 读取县级边界路径用纯英文 county gpd.read_file(D:/gis_sc/sc_county.shp) # 查看当前坐标系 print(原始 CRS:, county.crs) # 如果单位是度转为 CGCS2000 3度带投影以105E为例 if county.crs and county.crs.unit_name degree: county_proj county.to_crs(EPSG:4544) # CGCS2000 / 3-degree Gauss-Kruger CM 105E print(投影后 CRS:, county_proj.crs) else: county_proj county # 计算每个县的面积平方公里 county_proj[area_km2] county_proj.geometry.area / 1e6 print(county_proj[[NAME, area_km2]].head())这段代码的逻辑是先读入数据检查crs.unit_name是否为degree如果是就调用to_crs转到 EPSG:4544。EPSG:4544 对应的是 CGCS2000 3 度带中央经线 105°E覆盖四川大部分地区。如果你的数据偏西比如甘孜、阿坝一带可以换成 EPSG:4542中央经线 102°E。转换后再算面积单位就是平方米除以 1e6 得到平方公里。注意投影转换不是「越准越好」而是「越合适越好」。四川东西跨度大用一个中央经线覆盖全省会有边缘变形做全省统计时建议按经度分带处理或者直接用 Albers 等积投影。3. 把 SHP 加载进 QGIS 和 Python两条可复现的路径3.1 QGIS 手动加载与属性表检查如果你只是想做可视化或者快速检查数据QGIS 是最省事的入口。打开 QGIS 后直接把解压目录下的.shp文件拖进图层面板即可。但有几个细节决定了你看到的是不是「正确」的数据。第一编码问题。SHP 的属性表默认编码可能是 GBK 或 UTF-8QGIS 有时会自动识别错导致中文县名显示为乱码。解决办法是右键图层 → 属性 → 源在「数据源编码」里手动选 GBK 或 UTF-8切换一次就能看到正常中文。第二图层顺序。道路网和公路网是线图层行政区划是面图层。如果线图层在面图层下面会被面图层遮住。正确的顺序是面图层在下线图层在上并且给面图层设置一定的透明度比如 30%这样既能看清边界又能看到路网走向。第三属性表检查。右键图层 → 打开属性表重点看三列名称字段、代码字段、几何字段。名称字段确认没有乱码代码字段确认位数一致比如县级代码通常是 6 位几何字段确认没有空值或无效几何。如果发现某个县的几何为空说明数据在制作时就有缺失需要单独补。3.2 Python 批量读取与路网长度统计如果你要做批量分析比如统计每个市的公路总里程Python 比 QGIS 更高效。下面这段代码演示了如何一次性读取行政区划和公路网做空间连接后按市汇总里程。import geopandas as gpd import pandas as pd # 读取市级边界和公路网 city gpd.read_file(D:/gis_sc/sc_city.shp) highway gpd.read_file(D:/gis_sc/sc_highway.shp) # 统一投影到 EPSG:4544保证长度单位是米 city city.to_crs(EPSG:4544) highway highway.to_crs(EPSG:4544) # 给公路网打上所属市的标签空间连接 highway_with_city gpd.sjoin(highway, city, howinner, predicateintersects) # 按市名汇总公路长度 highway_with_city[length_km] highway_with_city.geometry.length / 1000 summary highway_with_city.groupby(NAME)[length_km].sum().reset_index() summary summary.sort_values(length_km, ascendingFalse) print(summary.head(10))这段代码的关键在gpd.sjoin这一步。它把每条公路和它相交的市关联起来predicateintersects表示只要几何有交集就算。如果一条公路跨了两个市它会被拆成两条记录分别归入两个市这是符合统计逻辑的。length_km用投影后的几何长度除以 1000 得到公里数。最后按市名分组求和就能得到每个市的公路总里程排名。提示sjoin之前一定要确认两个图层的 CRS 一致否则空间关系判断会出错。我一般会在读取后立刻统一to_crs不依赖原始文件的坐标系。4. 避坑与排查SHP 使用中最容易翻车的五个点4.1 中文乱码现象是县名显示为问号或方块现象打开属性表中文名称字段显示为????或乱码方块。原因SHP 的.dbf文件编码与软件默认解码方式不匹配常见于 GBK 编码的数据在 UTF-8 环境下打开。解决在 QGIS 中手动切换数据源编码在 Python 中用gpd.read_file(..., encodinggbk)指定编码。如果还是不行可以用dbfread库单独读.dbf确认原始编码。4.2 几何无效现象是面积计算出错或空间分析报错现象做buffer或intersection时提示「无效几何」。原因部分多边形存在自相交、重复节点或环方向错误。解决用geopandas的buffer(0)做一次修复或者用make_valid方法。修复后再做空间分析结果会稳定很多。from shapely.validation import make_valid county[geometry] county.geometry.apply(make_valid)4.3 路网与行政区划对不上现象是公路跑到省界外面现象把公路网和行政区划叠加后发现部分公路线段明显超出了省界范围。原因路网数据的覆盖范围可能比行政区划大或者两者坐标系不一致。解决先统一 CRS再用clip按省界裁剪路网。如果裁剪后仍有少量溢出检查是否是省界本身有简化导致的边界误差。4.4 字段类型错误现象是代码字段被识别为数字前导零丢失现象县级代码010001变成10001。原因.dbf中代码字段被存为数值型读取时自动去掉了前导零。解决在读取时用dtype{CODE: str}强制指定为字符串或者在 QGIS 中新建一个文本字段重新赋值。4.5 文件缺失现象是打开时提示「缺少 .shx 文件」现象只拷贝了.shp和.dbf打开时报错。原因SHP 是复合格式.shx是索引文件.prj是投影文件缺任何一个都可能导致读取失败或信息丢失。解决分发和拷贝时务必把同名的一整套文件一起带上建议直接打包整个文件夹。5. 进阶用法用这份数据做一次路网可达性快速评估前面讲的都是「怎么把数据用起来」这一章说一个具体技巧用这份 SHP 包做一次简易的路网可达性评估。不需要复杂的网络分析插件用 Python 的networkx加geopandas就能跑出一个粗略结果。思路是这样的把公路网转成图结构节点是道路交点边是路段边的权重是长度。然后选一个中心城市比如成都计算到其他各县的最短路径距离。这个结果虽然不如专业路网分析精确但用来做初步筛选足够了。import geopandas as gpd import networkx as nx from shapely.geometry import Point # 读取公路网和县级边界 highway gpd.read_file(D:/gis_sc/sc_highway.shp).to_crs(EPSG:4544) county gpd.read_file(D:/gis_sc/sc_county.shp).to_crs(EPSG:4544) # 构建图用路段端点作为节点 G nx.Graph() for _, row in highway.iterrows(): line row.geometry if line is None or line.is_empty: continue coords list(line.coords) start, end coords[0], coords[-1] length line.length / 1000 # 公里 G.add_edge(start, end, weightlength) # 选一个起点成都市中心附近的节点 start_node min(G.nodes, keylambda n: Point(n).distance(Point(104.06, 30.67))) # 计算到所有节点的最短路径 shortest nx.single_source_dijkstra_path_length(G, start_node, weightweight) # 把结果落到县级面上取每个县几何中心最近的节点 county[centroid] county.geometry.centroid county[nearest_node] county[centroid].apply( lambda p: min(G.nodes, keylambda n: Point(n).distance(p)) ) county[dist_km] county[nearest_node].map(shortest) print(county[[NAME, dist_km]].sort_values(dist_km).head(10))这段代码的核心是nx.single_source_dijkstra_path_length它返回从起点到所有可达节点的最短距离。start_node的选取用了成都市中心坐标104.06, 30.67最近的节点。最后把每个县的几何中心映射到最近的图节点取出对应的距离值。需要说明的是这个评估非常粗糙它假设所有公路都可以双向通行没有考虑道路等级和实际车速也没有处理立交和断头路。但对于「哪些县离成都路网距离最近」这种排序问题结果是有参考价值的。如果你要做更精细的分析可以把道路等级作为权重系数乘进去高速权重低、国道权重高这样算出来的「时间距离」会更接近实际。从那以后我每次拿到新的 SHP 包都会先做三件事检查.prj确认坐标系、用make_valid修一遍几何、把中文编码统一成 UTF-8。这三步走完后面无论做可视化还是空间分析基本不会再出玄学问题。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑