
简介面向GIS学习者、城市规划人员与地理数据分析者的凉山彝族自治州区县级别行政区划Shapefile矢量数据包包含该州下辖各区县的精确边界可直接导入ArcGIS、QGIS等平台用于底图绘制、空间查询、覆盖度分析与专题制图。压缩包共19个文件体积约887KB核心由.shp几何数据、.dbf属性数据、.shx空间索引、.prj投影文件构成另含.sbn/.sbx索引、.xml元数据及.cpg字符编码等辅助文件格式配套齐全可保证在不同GIS软件中的读取兼容性。数据以区县为单位存储属性表包含对应行政区名称等信息便于进行面积统计、人口分布叠加等操作。已有400人学习下载非常适合需要快速获取凉山州基础区划底图开展区域规划、资源管理、灾害应急和教学演示的读者使用。1. 凉山州区县shp解压后先别急着拖进GIS解压这套“凉山彝族自治州区县级别行政区划.rar”你会得到二十多个后缀各异的文件。真正描述凉山州17个县级行政区边界的是以“凉山彝族自治州区县级别行政区划”为主文件名的一整组shapefile文件压缩包里还混入了“凉山彝族自治州.shp”和“成都市各乡镇街道行政区划 - 副本.shp”前者是州级整体轮廓后者精确到成都乡镇街道直接全选拖进ArcGIS会让你误判图层数量。这套数据的价值在于提供了凉山州各区县精确边界区域规划、人口密度统计、公共设施覆盖评估、灾害影响范围划定都用得上。适合两类人一是要用真实行政边界做空间分析或GIS制图的工程师二是手里有区县经济、人口、路网数据想做空间连接和可视化的数据分析师。拿到数据的第一个动作不应该是加载而是先把这二十多个文件的作用分清楚。2. 文件家族逐个拆解.dbf属性、.prj坐标、.sbn索引的分工与坑2.1 文件后缀清单与各自职责Shapefile从来不是一个单文件格式而是一个文件家族。这套凉山州数据解压后的后缀基本覆盖了完整的家族成员每个后缀承担不同职责缺失或错放都会影响图层行为。后缀职责缺失时的影响.shp存储点、线、面几何坐标与拓扑关系图层完全无法加载.dbf属性表区县名称、代码、统计字段都在这里只剩图形属性表空白.shx几何与属性记录之间的索引文件部分软件加载极慢或直接报错.prj坐标系与投影参数WKT格式文本软件只能猜测坐标系底图偏移.cpg属性文本的字符编码声明中文字段名和区县名可能乱码.sbn/.sbx空间索引由ArcGIS生成维护空间查询响应变慢不影响打开.xml图层元数据记录数据来源等信息对使用基本无影响有一个常见认知误区多数人只把.shp拷走发给别人结果对方打不开原因是缺了.shx和.dbf。规范的交付方式是整套文件一起打包或者直接转成File Geodatabase。很多人也问过“shp转gdb之后就和gdb一样了吗”答案是不一样。shp字段名最长10个字符没有子类型、属性域也不支持任何拓扑规则gdb能存拓扑关系、网络数据集、注记字段名更长。转进去是换了数据结构不是“shp换了件外衣”。如果你后续要做凉山州区县边界的拓扑检查比如查相邻区县边界是否重合gdb是更合适的承载格式。2.2 .shp与.dbf如何逐条对应几何与属性同步机制.shp里存储的是几何对象凉山州区县边界对应的几何类型是Polygon.dbf里存储的是对应属性。两者靠记录顺序一一对应——.shx索引从几何号跳到属性号靠的也是这个顺序。换句话说属性表第0行对应的是shp里第0个多边形。这个机制意味着两件事。第一不要在GIS软件外直接用Excel修改.dbf文件里的记录顺序尤其是按区县名排序保存后再打开图层会发现几何和名称对不上区县边界张冠李戴这种错误极难排查。第二属性表里一行不一定只对应一个简单多边形。行政区划中的复杂情况很常见比如某个县包含主边界和不相连的飞地它在几何层面是多部件要素MultiPolygon。在第4章做面积统计时必须按区县字段分组汇总而不是按要素个数估算。2.3 .prj/.cpg/.sbn的遗留问题坐标系误判、中文乱码、索引失效.prj文件内容是人类可读的WKT文本里面写明坐标系名称和椭球参数。这套凉山州数据里同时存在“凉山彝族自治州区县级别行政区划.prj”和“凉山彝族自治州.prj”两者对应的图层不同坐标系却很可能一致。但不要因此假设所有历史数据都规范很多早期shp的.prj是后补的甚至是从别的文件复制来的加载后表现为图层跑到非洲海岸线附近。.cpg声明的是属性文本编码常见的值有UTF-8和GBK。凉山州这套数据如果在Windows中文环境下打开属性表出现“西昌”这类乱码先看.cpg内容再尝试把编码声明改成“GBK”或“UTF-8”重新加载。改.cpg比改.dbf安全因为不动数据结构。.sbn/.sbx是ArcGIS生成的空间索引QGIS不维护它如果在ArcGIS里做大量空间叠加查询感觉卡顿可以在ArcCatalog里重新构建空间索引而不是删除文件。3. 加载与坐标系转换从.prj判定到QGIS/ogr2ogr落地3.1 加载前先读.prj用命令判定坐标系而不是凭感觉拿到未知shp时我先看.prj文本而不是直接拖进GIS。用文本编辑器打开或命令行直接读cat 凉山彝族自治州区县级别行政区划.prj输出会是一段WKT常见两种内容一种是GEOGCS[GCS_WGS_1984, DATUM[D_WGS_1984, SPHEROID[WGS_1984, 6378137.0, 298.257223563]] ...另一种是GEOGCS[CGCS2000, DATUM[China_2000, SPHEROID[CGCS2000, 6378137.0, 298.257222101]] ...。看WKT时只需要抓两个关键词开头是GEOGCS还是PROJCS。GEOGCS表示地理坐标系坐标单位是度直接量算长度和面积没有实际意义PROJCS表示投影坐标系单位通常为米可直接量算。这套凉山州区县边界如果是地理坐标系后续做面积统计必须转入投影坐标系。如果.prj缺失QGIS会默认按WGS84处理这时发现图层与在线底图整体偏移几百米不是数据坏了是坐标系被猜错了。提示从网上下载矢量数据后与在线影像对不上第一嫌疑永远是坐标系而不是文件损坏。3.2 QGIS与ArcGIS的投影转换界面操作凉山州的区县边界如果原始坐标系是WGS84而项目要求统一到CGCS2000叠加国土调查数据时边界容易有米级偏差1:5万比例尺下不仔细看看不出做面积统计就会引入系统误差。把图层与项目底图统一到同一坐标系后再做分析是动手前必须完成的一步。QGIS中的做法是加载图层后右键点击图层名选择“导出” → “要素另存为…”。在弹出的对话框里把格式选为ESRI Shapefile文件名另起一个CRS选择EPSG:4490即CGCS2000地理坐标系。这里不要勾选“仅保存所选要素”否则会丢数据。ArcGIS中对应的是ArcToolbox中的“数据管理工具” → “投影和变换” → “要素” → “投影”输入凉山州区县shp输出坐标系选CGCS2000确认后生成新图层。界面操作的优势是所见即所得缺点是一旦shp文件多比如同时转换区县级、州级和成都乡镇街道路径数据逐个点界面就低效了。命令行工具的批量处理优势此时很明显。3.3 ogr2ogr命令行批量转换与编码修正GDAL自带的ogr2ogr可以一次完成坐标转换、编码修正和字段重命名且不修改原始图层ogr2ogr -t_srs EPSG:4490 -lco ENCODINGUTF-8 \ 凉山州_wgs84_to_cgcs2000.shp \ 凉山彝族自治州区县级别行政区划.shp参数说明-t_srs EPSG:4490指定目标坐标系这里是CGCS2000地理坐标系-lco ENCODINGUTF-8控制输出shp的.cpg声明让属性按UTF-8编码写解决后续在QGIS或Linux环境下乱码输出文件名在前输入数据源在后。如果只需要重新投影不加其他参数即可。如果需要把地理坐标投影成平面米制坐标把EPSG:4490换成项目选定的高斯-克吕格投影或UTM投影具体带号以项目统一坐标系为准。这里有一个常见误用有人直接用ogr2ogr把shp转成gdb以为顺便修好了坐标系。实际上-t_srs只做几何坐标变换不会改变属性字段类型更不会自动建立拓扑关系。转换完成后建议用ogrinfo -so -al复查一遍坐标系和要素数量确认没有转换丢要素。4. 区县边界实战属性查询、要素提取、几何修复与面积校验4.1 先用ogrinfo看清属性表结构与字段类型拿到下载好的shp我一般不看说明文档先跑一条ogrinfo命令把属性结构摸清楚ogrinfo -so -al 凉山彝族自治州区县级别行政区划.shp-so表示只输出概要信息-al表示遍历全部图层。输出中会列出几何类型Polygon、要素数量以及每个属性字段的名称、类型和宽度。区县边界的dbf里通常有区县名字符串字段、区县代码字段个别版本还带面积字段。字段类型决定SQL怎么写数值字段直接比较字符串字段必须加单引号。如果字段名是中文且出现乱码说明.cpg编码声明与实际存储编码不一致回到3.3节的-lco参数重新写一遍。4.2 按区县名查询、要素提取与合并外边界最常见的需求是只保留某个区县的边界做局部制图。QGIS里用表达式选择打开属性表选择“按表达式选择要素”输入区县名 西昌市如果字段名不是“区县名”先看4.1的输出结果替换成实际字段名。选中后右键图层导出所选要素为独立shp即可。命令行方式用ogr2ogr直接输出ogr2ogr -where NAME 西昌市 西昌市.shp 凉山彝族自治州区县级别行政区划.shp-where后面跟SQL风格过滤条件字段名按实际调整字符串值注意加单引号等号两边建议保留空格。这样导出的shp只含满足条件的要素适合按区县分发数据。有人问“shp有没有办法只保留外边界线”如果你的目的是把凉山州17个区县边界合并成一张全州轮廓图QGIS里用“矢量” → “地理处理” → “融合”按州名字段聚合得到一张多边形再提取外环线即可。另外压缩包里的“凉山彝族自治州.shp”本身就是州级轮廓拿来直接用之前要和区县数据叠加核对边界是否吻合因为两套数据可能来源不同、精度有差异。4.3 几何修复Fix Geometries、Repair Geometry与shapechecker行政边界数据常见几何问题包括多边形自相交、重复顶点、闭环不闭合、零面积碎片。凉山州这套数据如果经过多次坐标系转换或格式转换出现自相交的概率不低通常表现为做面积计算时某区县报错、叠加分析结果异常、输出打印时边界线有毛刺。QGIS里用处理工具箱中的“修复几何”Fix Geometries输入凉山州区县shp输出为修复后的新图层。它会把断裂的多边形补回闭环、移除无效环和自相交部分。ArcGIS中对应“修复几何”Repair Geometry工具。第三方工具shapechecker也能做类似修复加载shp后运行检查列出有问题的要素重点看是否存在空几何或零面积要素。修复后务必再跑一次4.1的ogrinfo命令对比修复前后要素数量。如果要素数量变了说明原数据里有空几何或小于容差的碎面被清理掉了这时核对属性表里的区县总数是否还是17个。少了一个说明原几何问题导致要素被合并或删除需要回到原始数据重新处理不能将错就错往下分析。4.4 面积校验地理坐标系与投影坐标系下的单位陷阱先泼一盆冷水不要迷信dbf里自带的面积字段。历史数据的面积字段可能是用当时坐标系量算的椭球参数、投影带都可能与现在不一致误差有时大到离谱。正确做法是投影后用几何重新计算。如果图层保持WGS84或CGCS2000地理坐标系QGIS字段计算器里的$area返回的是“平方度”。平方度不是平方千米1度纬度约111公里但1度经度在凉山州北纬26度到29度区间只有约100公里上下面积换算系数随纬度变化手工换算极易出错。把图层投影成米制坐标系后再计算$area返回平方米除以1000000即为平方公里。投影后用字段计算器新建一个双精度字段表达式写$area / 1000000得到各区县面积。对照公开统计资料做校验例如西昌市面积在2600平方公里量级如果算出个三位数或者六位数检查是不是图层没投影或投影带选错。以下是示意表格具体值以你的数据为准区县要素数CGCS2000投影后面积(km²)西昌市1约2655会理市1约4528还有一种与面积相关的常见操作“渔网分割”做网格化人口估算时先生成渔网矢量层再与凉山州区县边界做交集运算保留区县代码字段用于分组统计。直接用渔网去切原版shp时要注意输出图层的属性表里是否还带区县标识否则统计结果无法按区县归集。5. 边界坐标导出txt以及把Excel经纬度表落回图层的技巧5.1 三种shp转txt的路线用Python直接导出边界坐标网上搜“shp转txt”搜到的大多是道路、地类图斑的坐标导出需求凉山州区县边界同样适用。常见路线有三条QGIS里另存为CSV但默认只导出属性表不带几何坐标用MMQGIS插件可以导出几何信息最可控的做法是用Python的pyshp库直接读取几何坐标。我一般用pyshp不依赖ArcGIS运行时。import shapefile reader shapefile.Reader(凉山彝族自治州区县级别行政区划.shp) with open(liangshan_boundary.txt, w, encodingutf-8) as f: for i, shape in enumerate(reader.shapes()): f.write(fFeature {i}: parts{len(shape.parts)}, points{len(shape.points)}\n) part_index shape.parts [len(shape.points)] for pi in range(len(shape.parts)): start part_index[pi] end part_index[pi 1] for x, y in shape.points[start:end]: f.write(f{x:.6f},{y:.6f}\n)逻辑说明shape.parts记录多部件要素里每个环的起始点索引通过把parts末尾追加总点数就能把一条要素拆成多个环分别输出。循环里f.write输出的是经度、纬度逗号分隔末尾换行。第4章提到过多部件要素这段脚本就是专门处理它的。如果还想在txt里带上区县名称遍历reader.records()取区县名字段写进每一行即可。输出的txt文件可以直接交给不依赖GIS环境的程序去做边界判定或数据交换。5.2 把Excel经纬度表落成点图层并与区县边界做空间连接另一个高频需求手里有Excel格式的区县采样点经纬度表想判断每个点落在凉山州哪个区县边界内或者想把业务数据挂到地图上。直接改dbf不现实正确做法是把Excel另存为CSV格式保证表头里有经度、纬度两列随后在QGIS里选“图层” → “添加图层” → “添加分隔文本图层”文件格式选CSVX字段指定经度Y字段指定纬度坐标系选择WGS84导入后得到点图层。ArcGIS中对应“添加数据” → “XY数据”再在图层属性里指定坐标系。点位落图后做空间连接QGIS中“矢量” → “分析工具” → “按位置连接属性”目标图层为采样点连接图层为凉山州区县shp几何谓词选“相交”输出结果里每个点会附上所在区县名称。ArcGIS对应“空间连接”Spatial Join匹配选项选INTERSECT。做完空间连接后检查一下有多少点落在边界外如果数量异常优先怀疑CSV里的经纬度是否写反再检查原始坐标系是不是GCJ02等偏移坐标系行政边界底图通常不带偏移用互联网坐标采集的经纬度需要先做坐标纠偏否则大量点会落在边界外。本文还有配套的精品资源点击获取