ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

锡林郭勒盟区县级shp数据获取与处理:从下载、投影到边界线实战

锡林郭勒盟区县级shp数据获取与处理:从下载、投影到边界线实战 简介资源为内蒙古锡林郭勒盟区县级别行政区划SHP矢量数据包面向GIS开发、规划研究及地图制图人员用于解决区县边界矢量化底图获取问题是区域空间分析不可或缺的基础资料。压缩包共22个文件以shp/shx/dbf/prj等标准Shapefile组件为主另含sbn/sbx空间索引、cpg编码及xml元数据文件可在ArcGIS、QGIS等主流GIS软件中直接读取、编辑与出图整个包仅245KB轻量易用。目前已有704人学习下载。数据覆盖锡林郭勒盟辖区区县边界与名称属性内置多套图层文件行政区划面要素清晰、拓扑结构完整字段结构简单导入后即可按需查询、筛选与制图。适用于区县边界可视化、空间叠置分析、人口与经济数据挂接、城市规划辅助、资源管理底图制作等应用场景也可作为院校地理信息课程的教学示例数据为区域研究提供简洁可靠的基础底图支撑。1. 锡林郭勒盟区县级shp一份能直接用来出图和做分析的边界底图在网上下载到的锡林郭勒盟区县级shp十个里有八个打开以后要么属性表是空的要么图形全都挤在不知所云的地方——先在状态栏把经纬度显示打开鼠标移到锡林浩特市的位置发现坐标动辄八位数那就是一个没定义坐标系的文件或者定义错了投影。真正的区县级shp应该是一份打开就能用的东西要素边界清晰、属性字段里有旗县名称和行政区划代码、坐标系标注完整。它解决的是一类很具体的需求做锡林郭勒盟的地图可视化、市级专题图、农牧业空间统计或者是拿边界去裁剪遥感影像。需要这份数据的人大多是GIS工程师、数据分析师、基层规划口的技术人员以及做生态农牧类课题的研究生。与其全网反复找不如把「下载、验证、清洗、转换」这一条链路自己走通。2. 获取渠道与数据选型区县级shp从哪里来、下载完怎么验证能用2.1 公开版数据的常见来源与适用场景锡林郭勒盟区县级别的行政区划边界常见做法是从两类公开渠道拿一类是测绘部门发布的公开版基础地理数据通常以1:100万或1:25万的比例尺分级发布县级行政边界基本都在1:100万里覆盖另一类是各类地理信息平台直接提供的GeoJSON或shp下载接口这类数据多数源自同一套国标行政区划底图字段做了精简。两者在边界形状上差异不大差别主要在属性和精度测绘数据的县级界线更细还能带出旗县之间的争议区域处理平台下载的GeoJSON通常只有名称和代码两个字段胜在下载路径短、格式规整。这里建议直接以盟市名加「区县」「行政区划」做关键词去检索下载时优先选带CGCS2000坐标系说明的文件不要下载那种压缩包里只有.shp和.dbf、没有任何元数据的裸数据。如果网站同时给出jpg预览图和属性表截图先看预览图里各旗县的形状和脑子里锡林郭勒盟「三市十旗一县」的分布对一下对不上就直接换下一个源。数据不要只下「最新版」2023版和2020版都可以留一份——区县边界的微调经常发生在乡镇合并之后两份对比能发现改了什么。2.2 下载后第一件事三个命令验证文件完整性把shp下载解压后不要直接拖到ArcMap里先用命令行工具做三个快速检查。下面是基于GDAL的命令Windows和Linux环境通用# 查看shp的基本信息和坐标系定义确认文件不是损坏的壳 ogrinfo -so -al 锡林郭勒盟_区县.shp # 只查看属性字段列表确认有名字和代码字段 ogrinfo -so -al 锡林郭勒盟_区县.shp | grep -E 名称|NAME|PAC|code # 用python快速看要素个数和几何类型 python3 -c from osgeo import ogr ds ogr.Open(锡林郭勒盟_区县.shp) layer ds.GetLayer() print(要素数量:, layer.GetFeatureCount()) print(图层几何:, layer.GetGeomType()) ftr layer.GetNextFeature() print(字段列表:, [ftr.GetField(i) for i in range(ftr.GetFieldCount())]) 如果ogrinfo能正常打印出坐标系统且要素数量在12个左右锡林郭勒盟下辖12个旗县级区划那这份文件大概率没问题。-so参数表示只读摘要不遍历几何体速度最快Geometry Type显示LineString而不是Polygon的说明拿到的可能是境界线不是闭合的面要素。关于压缩包shp是多文件格式.dbf是属性表、.prj是坐标系、.shx是索引缺一个文件后面都会出问题建议解压后把所有同名文件保留在同一目录不要单独拷贝某个后缀。提示如果检查时发现坐标系是GCS_WGS_1984不要急着转投影先按第四章方案处理如果连.prj都没有那说明数据源没写坐标系不可直接用于量算面积。3. 读懂shp里的区县属性字段编码、名称清洗与shp转txt3.1 先搞清PAC编码锡林郭勒盟的12个旗县都是谁自治区盟市下辖单位名称很特殊东乌珠穆沁旗和西乌珠穆沁旗这种「东、西」前缀容易被GIS软件的排序逻辑打乱太仆寺旗、镶黄旗这类相对小众的名称在显示时还容易出现乱码。拿到shp后的首要任务是把每个要素和真实旗县对上号。锡林郭勒盟的行政区划代码以1525开头下面这组对照关系在任何公开数据源里都应一致旗县区划名称PAC行政区划代码备注二连浩特市152501县级市锡林浩特市152502盟行署驻地阿巴嘎旗152522旗苏尼特左旗152523旗苏尼特右旗152524旗东乌珠穆沁旗152525旗西乌珠穆沁旗152526旗太仆寺旗152527旗镶黄旗152528旗正镶白旗152529旗正蓝旗152530旗多伦县152531县如果下载到的数据里字段名是英文缩写比如NAME和PAC先用SELECT语句全量打印一遍属性值找出「东乌珠穆沁旗」是否被写成「东乌旗」以及「锡林郭勒盟」这个盟级名称有没有混进区县层。最常见的坑是数据源把盟市行政公署驻地锡林浩特市和盟本级锡林郭勒盟的边界都画了出来导致要素数量变成13个这时直接用SQL过滤掉PAC代码为152500的记录。3.2 用geopandas清洗名称和编码类字段属性清洗在GIS里通常是这么做的用geopandas读入shp对PAC列做字符串补齐对名称列做别名映射。锡林郭勒盟各旗县名称在公开数据里有过好几个叫法「东乌珠穆沁旗」在部分旧版数据里的名称字段是「东乌旗」做专题图标注时显示十分不妥。处理代码如下import geopandas as gpd gdf gpd.read_file(锡林郭勒盟_区县.shp, encodingutf-8) print(gdf[[PAC, NAME]].head(15)) # 对PAC做字符串处理确保是6位数字 gdf[PAC] gdf[PAC].astype(str).str.zfill(6) # 名称规范化映射处理简称 name_map { 东乌旗: 东乌珠穆沁旗, 西乌旗: 西乌珠穆沁旗, 锡林郭勒盟驻锡林浩特市: 锡林浩特市 } gdf[NAME] gdf[NAME].replace(name_map) gdf gdf[gdf[PAC] ! 152500] # 去除盟本级 gdf.to_file(锡林郭勒盟_区县_清洗.shp, encodingutf-8)读取shp时的encoding参数容易被忽略网上很多shp的dbf文件是GBK编码存储的不用encodingutf-8读出来名称乱码而你存回去的时候要明确写encoding参数否则中文名称字段在 ArcGIS 里显示为「锟斤拷」。PAC转成字符串再补零是为了防止数字型字段把「152501」显示成「152501.0」。这里如果发现gdf里有多边形边的顶点数异常可以先检查数据源本身的质量问题不要急着在清洗阶段做简化因为行政区划面在出图缩小到整个盟范围看时顶点数多并不影响。3.3 把shp转成txt坐标串导出和经纬度批量输出热词里「shp转txt」的需求很典型常见使用场景有两个一是把字段属性导出成excel能打开的文本做台账比对二是把每个旗县的边界顶点坐标转成WKT文本串用于外部系统交换。注意区分属性转txt用pandas就能解决坐标串转txt必须遍历几何体。下面这段能把两个需求合并处理python3 -c import geopandas as gpd gdf gpd.read_file(锡林郭勒盟_区县_清洗.shp, encodingutf-8) # 导出属性到txt制表符分隔 gdf[[PAC, NAME]].to_csv(锡林郭勒盟_区县_属性.txt, sep\t, indexFalse) # 导出每个旗县的边界坐标串到txt with open(锡林郭勒盟_区县_坐标串.txt, w, encodingutf-8) as f: for _, row in gdf.iterrows(): geom row.geometry # 只取外边环坐标忽略内部洞 coords list(geom.exterior.coords) f.write(f\{row[PAC]}|{row[NAME]}|LINESTRING(\) f.write(, .join(f\{x:.6f} {y:.6f}\ for x, y in coords)) f.write()\n) 这段代码的关键在geom.exterior.coords它只取多边形外环行政边界里的飞地或内洞在区县级数据里基本不会出现但如果你发现导出后的txt有奇怪的重复折返线段再考虑改用geom.interiors。坐标保留6位小数的量级大约0.1米足够做专题图使用文本文件行尾建议用\n直接用记事本打开时每一行都是一个完整的旗县边界串后续要导入其它平台时按竖线切分字段即可。4. 坐标系与投影锡林郭勒盟跨经度带的处理方案4.1 原始坐标系判定CGCS2000、WGS84与Web墨卡托锡林郭勒盟的经度范围大致在东经111度到120度之间东西横跨约900公里这个跨度在任何一种投影方式下都不能忽略变形问题。从公开渠道下载的数据常见的坐标系有三种CGCS2000地理坐标系GCS_China_Geodetic_Coordinate_System_2000、WGS84地理坐标系、以及为网络地图准备的Web墨卡托投影EPSG:3857。CGCS2000和WGS84在区县级地图上的差异在米级以内做可视化完全不用区分但Web墨卡托的坐标值是米制单位和前两者完全不同。判断坐标系的方式用ogrinfo输出来看如果Data axis to CRS axis下面出现GEOGCS[China Geodetic Coordinate System 2000说明是CGCS2000如果GEOGCS[WGS 84就是WGS84。如果输出里什么都没有或者显示LOCAL_CS建议直接放弃这份数据。还有一种情况是下载到的shp是已经投影过的平面坐标但.prj文件里只写了PROJCS[CGCS2000 / 3-degree Gauss-Kruger zone 40这时需要确认它到底是3度分带还是6度分带的结果误判会造成整个图层平移几百米。4.2 跨带问题的典型处理按中央经线重投影不管是做全盟范围的面状地图还是做各旗县拼接的专题图我都建议在项目初期就确定一个统一的投影策略。常见做法是明确输出坐标系为EPSG:4547CGCS2000 / 3-degree Gauss-Kruger CM 114E或EPSG:4548CM 117E。区别在于中央经线选114度还是117度——选哪条经线决定图面两端的长度变形比例。锡林郭勒盟的旗县分布是东西长条形东乌珠穆沁旗在东端二连浩特市在西端如果选117度经线做中央经线东端变形小但西端变形明显如果做全盟整体展示选114度能让主要旗县的平均变形最小。import geopandas as gpd from pyproj import CRS gdf gpd.read_file(锡林郭勒盟_区县_清洗.shp, encodingutf-8) # 检查当前坐标系类型先统一转成CGCS2000地理坐标 if gdf.crs is None: print(文件缺少坐标系定义常见处理是从同名prj文件读取这里先强制指定) gdf gdf.set_crs(EPSG:4490, allow_overrideTrue) else: gdf gdf.to_crs(EPSG:4490) # 全盟统一投影到CGCS2000 3度高斯克吕格中央经线114E gdf_114 gdf.to_crs(EPSG:4547) # 如果只做某个东侧旗县比如西乌珠穆沁旗的精细分析改用117E gdf_117 gdf.to_crs(EPSG:4548) # 计算面积和地理坐标下的估算值做对比 gdf_114[area_km2] gdf_114.geometry.area / 1e6 print(gdf_114[[NAME, area_km2]].head())用EPSG:4547做全盟投影之后每个旗县面要素的单位是米geometry.area直接算出平方米除以1e6就是平方公里。这里特别提醒转换投影时不要在中途绕到WGS84地理坐标再转回来直接用to_crs做一次转换避免两次不同基准面之间的布尔莎七参数偏移累积。面积值如果与真实面积出现几十平方公里的偏差大概率是中央经线选择不合适或者源数据本身质量差不要怀疑算法。4.3 做完投影后验证图形是否正确投影转换是最容易出「静默错误」的环节——图层能显示、属性都对但实际位置偏移了百米级或面积错得离谱。验证方法不用打开ArcMap直接算每个旗县的包络矩形坐标范围再和真实经纬度范围对比锡林浩特市的经度大致在116度附近投影后X坐标应在中央经线114度以东的位置值大约在20万到30万米之间因为离中央经线约2度多每度约111公里。用代码检验更直接# 验证投影后每个旗县的外包矩形坐标是否符合预期范围 for _, row in gdf_114.iterrows(): bounds row.geometry.bounds print(f{row[NAME]}: X [{bounds[0]:.0f}, {bounds[2]:.0f}], Y [{bounds[1]:.0f}, {bounds[3]:.0f}])输出的X坐标如果在几十万到百万级别且东侧旗县的X值明显大于西侧旗县说明投影方向和分带参数正确。如果锡林浩特市的X值出现负值或小于10万的数字大概率是错用了6度分带或中央经线选错。这一条是排查坐标问题的通用规则拿一个你知道准确位置的旗县政府驻地坐标来反推。5. 边界线处理的几个实战技巧只留外边界、渔网分割、批量修复5.1 只要锡林郭勒盟的外边界线dissolve之后再取外环做盟级专题图时经常不需要展示旗县边界只需要整盟的轮廓线。直接从区县面shp里提轮廓的常见误区是对每个旗县单独提取边界结果得到一堆相互重叠的碎线。正确做法是先做dissolve融合再取外环这样内部旗县之间的边界线会消失只剩下整个盟的轮廓线。import geopandas as gpd # 先融合所有区县为一个整体面 union gdf_114.dissolve(byPAC, aggfuncsum) # 这里的by只是走过场 union_geom union.geometry.unary_union boundary_line gpd.GeoDataFrame( geometry[union_geom.boundary], crsgdf_114.crs ) boundary_line.to_file(锡林郭勒盟_外边界线.shp, encodingutf-8)这里unary_union的作用是把所有旗县面要素合并成一个Geometry对象再取boundary属性得到边界线。dissolve的by参数虽然传了PAC但因为全部要素合并最终效果等效于对整个图层做融合。你可能会注意到代码里把aggfunc写成了sum这个参数在这里不影响几何结果只是为了让pandas不报错。这条外边界线在很多分析场景里能直接当成裁剪mask用比如做全盟遥感影像裁剪时的矢量边界。5.2 用渔网分割shp做空间统计网格的基础操作「渔网分割shp」是热词里的高频需求本质是生成规则网格然后用网格去切行政区划面。锡林郭勒盟面积广大常见做法是生成10km × 10km的渔网统计每个网格里草场、耕地或者矿点的分布强度如果做旗县级内部的精细分析网格间距可以缩小到1km。生成渔网的核心参数是网格起点坐标、单元格宽高、行列数范围取当前图层的包络矩形import geopandas as gpd import numpy as np from shapely.geometry import box gdf gpd.read_file(锡林郭勒盟_外边界线.shp, encodingutf-8) minx, miny, maxx, maxy gdf.total_bounds cell_size 10000 # 10km网格单位与数据坐标系一致米 # 从西南角开始生成网格多边形 cols int(np.ceil((maxx - minx) / cell_size)) rows int(np.ceil((maxy - miny) / cell_size)) grids [] for i in range(rows): for j in range(cols): x0 minx j * cell_size y0 miny i * cell_size grids.append(box(x0, y0, x0 cell_size, y0 cell_size)) grid_gdf gpd.GeoDataFrame(geometrygrids, crsgdf.crs) # 用外边界裁剪网格只保留落在盟内的网格 grid_clip gpd.overlay(grid_gdf, gdf, howintersection) grid_clip.to_file(锡林郭勒盟_10km渔网.shp, encodingutf-8)total_bounds返回的是整个图层的四至范围网格从这个范围的外包矩形开始铺铺完之后用overlay的intersection方式把边界外的网格切掉。这里的cell_size单位取决于你当前数据坐标系——如果是投影坐标系就是米如果是地理坐标系就是度换算起来对应大约0.09度但直接用投影坐标算更符合习惯。生成的网格数量会很惊人锡林郭勒盟面积约20万平方公里10km网格理论上约2000个但如果投影后四至范围覆盖到周边盟市实际生成网格数会多出不少所以裁剪那一步千万别省。5.3 用shapechecker修复shp和批量压缩的技巧热词里「shapechecker修复shp步骤」是许多人在处理从非主流网站下载的数据时会遇到的问题。shp文件在多次拷贝、从压缩包部分解压、或经过FTP传输后容易出现几何自相交、空几何和属性记录数不匹配等情况。shapechecker的常见修复步骤是打开软件载入shp运行「Check」扫描几何错误然后执行「Repair」自动修复最后保存时勾选「重建索引」。命令行环境下GDAL的ogr2ogr也可以做类似的事情用-skipfailures跳过损坏要素ogr2ogr -skipfailures 修复后.shp 锡林郭勒盟_区县_清洗.shp至于批量压缩shp单个shp本身无法像jpg那样压缩常见做法是打包整个文件集合。这里有个参数技巧在项目交付阶段用zip压缩时把.shp、.shx、.dbf、.prj四个文件分别存储压缩率远高于文件夹整体拖入但注意压缩后拿给别人时要提醒对方先整体解压再使用不要直接从压缩包里双击打开.shp否则GDAL找不到.dbf会导致属性表为空。如果需要真正意义上的文件瘦身考虑用ogr2ogr的输出选项-lco SPATIAL_INDEXNO并设置PRECISIONNO缩减坐标精度通常能把文件体积压缩到原来的60%左右。本文还有配套的精品资源点击获取
返回列表