ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

甘肃基础数据完整版shp资源:结构解析、加载转换与避坑指南

甘肃基础数据完整版shp资源:结构解析、加载转换与避坑指南 简介这份资源是面向GIS从业者、地理信息专业学生及城市规划人员的甘肃省基础矢量数据合集以Shapefile格式整理可用于地图制图、空间分析与规划决策等场景。压缩包共225个文件约17.3MB包含39个shp、39个dbf、39个shx、39个prj及sbx、sbn索引文件另有4个mxd工程文件覆盖几何图形、属性表、索引与坐标系统等完整结构。数据内容涵盖点、线、面多类要素火车站、加油站、旅游景点等点要素单线水系、公路、国道、省道、县乡道等线要素以及地级市、地区界、省界、县界等面要素并包含城墙、出入口、沟渠、桥梁等复杂地物。已有3027人学习下载读者可借助ArcGIS或QGIS直接加载编辑开展交通网络连通性、水资源分布与旅游资源潜力等分析也可转换为GeoJSON、KML等格式实现共享互操作是研究甘肃省地理空间特征的实用基础资料。1. 甘肃基础数据完整版 shp 资源这套矢量包到底能干什么如果你手头正好缺一份甘肃省的行政边界、路网和水系底图又不想从公开渠道一层层拼数据这个「甘肃基础数据完整版矢量 shp 格式」压缩包值得先看一眼。它把地名、公路、县乡道、单线水系、乡镇名、省道、国道、加油站、建筑物区域、郊区旅游景点这些图层打包成 DBF 属性表配套的 shp 文件覆盖了点、线、面三类基本几何。对做 GIS 制图、路网连通性分析、旅游点位分布、行政区划出图的人来说这是一套能直接拖进 ArcGIS 或 QGIS 里用的底料。它适合规划、测绘、环境评估和教学场景不适合拿来做厘米级工程测量——坐标系和精度得自己先验一遍。2. Shapefile 结构拆解为什么一个图层会带一堆同名文件2.1 shp、dbf、shx、prj 各管什么Shapefile 不是单个文件而是一组同名不同后缀的文件协同工作。你解压后看到每个图层都有.shp、.dbf、.shx有的还带.prj这不是冗余是 Esri 当年定下的分文件存储规则。.shp存几何坐标.dbf存属性字段.shx是几何记录的索引.prj记录坐标参考系。少任何一个轻则属性丢失重则软件直接报错打不开。文件后缀作用缺失后果.shp存储点/线/面的几何坐标无法显示图形.dbf存储属性表字段与记录属性表为空无法按字段分类.shx几何记录索引加速定位部分软件读取缓慢或报错.prj坐标参考系定义坐标未知叠加时错位.cpg属性表字符编码中文属性可能乱码这套甘肃数据里地名、乡镇名、加油站属于点图层公路、县乡道、省道、国道、单线水系属于线图层建筑物区域、郊区旅游景点可能是面或点具体看原始采集粒度。拿到手第一件事不是急着出图而是逐个图层确认几何类型和字段结构。2.2 用 QGIS 快速验证图层完整性我一般先用 QGIS 做一次批量体检比在 ArcGIS 里一个个点开快得多。把解压目录直接拖进 QGIS 图层面板观察哪些图层能正常渲染、哪些报错。然后打开属性表看字段名和记录数中文乱码的话在图层属性里改编码为 GBK 或 UTF-8 试。# 用 Python GDAL 批量检查 shp 文件完整性和坐标系 from osgeo import ogr, osr import os data_dir rD:\gansu_base_data # 替换为你的解压路径 for f in os.listdir(data_dir): if f.endswith(.shp): ds ogr.Open(os.path.join(data_dir, f)) if ds is None: print(f[失败] {f} 无法打开检查 shx/dbf 是否缺失) continue layer ds.GetLayer(0) srs layer.GetSpatialRef() geom_type ogr.GeometryTypeToName(layer.GetGeomType()) print(f[正常] {f} | 几何类型: {geom_type} | 要素数: {layer.GetFeatureCount()}) if srs: print(f 坐标系: {srs.GetName()}) else: print( 坐标系: 未定义需手动指定) ds None这段脚本遍历目录下所有.shp输出几何类型、要素数量和坐标系名称。如果某个文件打开失败大概率是.shx或.dbf没跟着一起解压。坐标系显示“未定义”的图层后续叠加前必须手动指定否则和带坐标系的图层放一起会偏到十万八千里。2.3 属性表字段的读取与筛选属性表是这套数据的价值核心。比如公路图层里可能有道路等级、名称、编码加油站图层可能有名称和位置描述。用 GDAL 或 GeoPandas 都能快速把属性表拉出来看。import geopandas as gpd # 读取公路图层查看字段和前几行 gdf gpd.read_file(rD:\gansu_base_data\公路.shp, encodinggbk) print(字段列表:, gdf.columns.tolist()) print(记录数:, len(gdf)) print(gdf.head(5)[[名称, 等级]] if 名称 in gdf.columns else gdf.head(5))encodinggbk是针对中文 DBF 的常见设置如果报错就换utf-8或latin1试。字段名如果显示为Field1、Field2这种说明原始 DBF 字段名被截断或编码有问题需要在 QGIS 里重新识别编码后再导出。这一步不做后面按名称筛选道路或统计加油站数量都会翻车。3. 把 shp 用起来加载、叠加与格式转换的实操路径3.1 在 ArcGIS 与 QGIS 中加载并统一坐标系ArcGIS 里直接 Add Data 选.shp即可但常见问题是图层能显示却无法叠加根源在坐标系不一致。这套甘肃数据如果.prj缺失或写的是地理坐标系GCS_WGS_1984而你的底图是投影坐标系如 CGCS2000 3 Degree GK Zone 34两者叠加就会错位。正确做法是先查每个图层的坐标系再统一投影到同一个 CRS。# 用 ogr2ogr 批量将 shp 转为 CGCS2000 投影坐标系 for %f in (*.shp) do ( ogr2ogr -f ESRI Shapefile -t_srs EPSG:4547 reprojected\%f %f )-t_srs EPSG:4547是 CGCS2000 / 3-degree Gauss-Kruger CM 102E适合甘肃西部甘肃东部常用 EPSG:4546 或 4545。选哪个取决于你的研究区经度范围。批量转换后所有图层 CRS 一致再叠加就不会出现“路跑到省外”的玄学现象。3.2 用 GeoPandas 做路网与水系的叠加分析加载统一坐标系后的数据用 GeoPandas 做空间叠加很顺手。比如统计每个县乡道与单线水系的交叉点数量或者计算公路网密度。import geopandas as gpd # 读取统一坐标系后的图层 roads gpd.read_file(rreprojected\县乡道.shp, encodinggbk) water gpd.read_file(rreprojected\单线水系.shp, encodinggbk) county gpd.read_file(rreprojected\县界.shp, encodinggbk) # 确保三者 CRS 一致 assert roads.crs water.crs county.crs, 坐标系不一致先统一 # 计算每个县内的道路总长度 roads[length_km] roads.length / 1000 # 投影坐标系下单位为米 road_by_county gpd.sjoin(roads, county, predicatewithin) summary road_by_county.groupby(县名)[length_km].sum().reset_index() print(summary.sort_values(length_km, ascendingFalse).head(10))gpd.sjoin的predicatewithin表示道路完全落在县界内才计入跨界的道路会被排除。如果要算全部影响改用intersects再按比例分摊长度。roads.length在投影坐标系下返回米除以 1000 得公里。这一步能直接产出各县道路里程排名做规划前期分析够用了。3.3 shp 转 GeoJSON、KML 与 3D Tiles 的常见做法数据共享或上web地图时shp 往往要转格式。转 GeoJSON 用ogr2ogr一行命令转 KML 给 Google Earth 用同样简单转 3D Tiles 则需要先转成 GeoJSON 再用工具切片。# shp 转 GeoJSON ogr2ogr -f GeoJSON output.geojson input.shp -lco ENCODINGUTF-8 # shp 转 KML ogr2ogr -f KML output.kml input.shp # shp 转 3D Tiles 的预处理先转 GeoJSON再用 3d-tiles-tools # 注意3D Tiles 需要高度信息纯二维 shp 需先拉伸或贴地转 GeoJSON 时加-lco ENCODINGUTF-8能避免中文属性乱码。转 KML 后可以在 Google Earth 里直接看路网和水系走向。转 3D Tiles 不是一步到位的事纯二维 shp 没有高程字段需要先在 QGIS 里做拉伸或贴地处理再用 Cesium 的工具链切片。如果只是做展示转 KML 或 GeoJSON 足够要做三维城市级应用才值得折腾 3D Tiles。4. 避坑与排查这套 shp 数据最容易翻车的五个地方4.1 中文属性乱码现象、原因与解决现象打开属性表中文名称显示为????或乱码字符。原因DBF 文件默认编码是 GBK但 QGIS 或 ArcGIS 按 UTF-8 读取。解决在 QGIS 图层属性里把编码改为 GBK或在 ArcGIS 中用Convert Encoding工具转成 UTF-8 后重新导出。如果.cpg文件存在打开看里面写的是哪个编码按它来设。4.2 坐标系缺失导致叠加错位现象两个图层单独看都正常叠在一起道路跑到省外。原因至少一个图层没有.prj文件软件按默认坐标系处理。解决先用ogrinfo查每个图层的 CRS缺失的根据数据来源判断是 WGS84 还是 CGCS2000用Define Projection补上再用Project统一到同一 CRS。不要跳过定义直接投影否则坐标值会被二次变换。4.3 几何无效与自相交现象做空间分析时报TopologyException或Invalid Geometry。原因面图层存在自相交、悬挂点或重复节点。解决用 QGIS 的Check Validity工具找出无效几何再用Fix Geometries修复。批量处理可以用shapechk工具或 GeoPandas 的buffer(0)技巧但buffer(0)会轻微改变边界精度要求高时慎用。4.4 字段名截断与类型错误现象属性表字段名变成Field1、Field2或者数值字段被识别为字符串。原因DBF 格式对字段名长度有限制最多10个字符超长会被截断数值字段如果含空值或特殊字符会被当字符串。解决在 QGIS 里用Refactor Fields重命名字段并指定类型导出为新 shp。数值字段的空值用0或NULL填充后再转类型。4.5 文件缺失导致图层打不开现象双击.shp提示“无法打开”或“不是有效文件”。原因.shx或.dbf没跟着一起复制或者压缩包解压时文件名编码错误导致关联断裂。解决确认每个图层至少有三个同名文件.shp、.shx、.dbf缺哪个补哪个。如果文件名有中文确保解压工具没有把文件名转成乱码必要时手动重命名统一。5. 进阶技巧用渔网分割与批量出图验证数据覆盖度5.1 渔网分割统计每个网格的要素密度拿到一套基础数据怎么快速判断它覆盖是否完整、有没有空洞我习惯用渔网分割做密度统计。在 QGIS 里用Create Grid生成覆盖甘肃全省的网格再用Count Points in Polygon或Intersection统计每个网格内的要素数量。import geopandas as gpd from shapely.geometry import box import numpy as np # 读取省界和加油站图层 province gpd.read_file(rreprojected\省界.shp, encodinggbk) gas gpd.read_file(rreprojected\加油站.shp, encodinggbk) # 生成 0.5 度网格 minx, miny, maxx, maxy province.total_bounds grid_cells [] step 0.5 x minx while x maxx: y miny while y maxy: grid_cells.append(box(x, y, x step, y step)) y step x step grid gpd.GeoDataFrame(grid_cells, columns[geometry], crsprovince.crs) grid gpd.clip(grid, province) # 只保留省界内的网格 # 统计每个网格内的加油站数量 joined gpd.sjoin(gas, grid, predicatewithin) counts joined.groupby(index_right).size().reset_index(name加油站数) grid grid.reset_index().rename(columns{index: index_right}) grid grid.merge(counts, onindex_right, howleft).fillna(0) # 找出加油站为零的网格 empty grid[grid[加油站数] 0] print(f零加油站网格数: {len(empty)} / 总网格数: {len(grid)})这段代码先按省界裁剪网格再统计每个网格内的加油站数量。零值网格要么是无人区要么是数据缺失。如果零值网格集中在某个区域大概率是数据采集遗漏出图前需要标注说明。gpd.clip确保网格不超出省界避免统计到省外数据。5.2 批量出图与覆盖度检查验证数据覆盖度最直观的方法是批量出图。用 QGIS 的 Atlas 功能或 Python 的 Matplotlib 按县界批量渲染每张图叠加路网、水系和景点肉眼扫一遍有没有明显断裂或空白。import matplotlib.pyplot as plt fig, axes plt.subplots(2, 3, figsize(18, 12)) layers [公路, 县乡道, 单线水系, 国道, 省道, 加油站] for ax, name in zip(axes.flatten(), layers): gdf gpd.read_file(rfreprojected\{name}.shp, encodinggbk) gdf.plot(axax, markersize1, linewidth0.5) ax.set_title(name) ax.axis(off) plt.tight_layout() plt.savefig(coverage_check.png, dpi150)六张子图并排看路网是否连续、水系是否贯通、加油站分布是否合理一目了然。如果某张图大片空白要么是该要素本身稀疏要么是数据缺失。我一般会把这张覆盖图和数据一起存档下次别人问“这套数据全不全”直接甩图比口头解释管用。5.3 一个习惯先验坐标系再动手从那以后我每次拿到新的 shp 包第一件事不是打开看图形而是先跑一遍坐标系检查脚本。这套甘肃数据里如果.prj齐全且统一后面所有叠加分析都顺如果缺几个提前补上比做到一半发现错位再返工省事得多。希望帮到你。本文还有配套的精品资源点击获取
返回列表