简介:这套云南省滇池与抚仙湖流域地形图GIS数据包,面向ArcGIS用户、地理专业学生及需要区域底图的研究和规划人员。包内整合滇池、抚仙湖湖区边界、河流水系等矢量shp,以及DEM、山体阴影等栅格地形数据,并附带可直接打开的mxd工程和jpg/PDF/EPS出图成果,解决从原始数据到出图的完整需求。压缩包共63个文件,约62.74MB,包括shp/dbf属性文件、adf栅格、mxd工程文件及各类索引辅助文件,结构清晰。已有1619人浏览学习。若熟悉GIS,可在mxd中关联图层后一键出图并局部调整;若不熟悉GIS,也能直接使用已生成的多种格式图片用作报告插图、教学课件或底图参考,大幅节省制图门槛和时间。
1. 滇池与抚仙湖shp矢量包:拿到手先知道它解决什么问题
在水务、国土和环评的日常制图里,最常被问的一句话就是:“有没有现成的滇池和抚仙湖湖区矢量图?”这份云南省滇池与抚仙湖湖区与河流地形图GIS矢量文件shp(含出图文件mxd),就是为这个场景准备的。包里把两湖的湖区面、入湖河流线按地形图层级整理成了标准 shp 矢量数据,同时附带一份可编辑的 ArcGIS MXD 出图工程,适合在 ArcGIS 10.x 里直接打开、改符号、调整注记后出图。做湖泊岸线核对、环湖项目底图、流域水系图斑叠底的人都用得上。数据包本身不大,解压后放进一个纯英文路径的文件夹就能开工。
2. 解压后的第一件事:图层、字段和坐标系一次摸清
拿到任何 shp 数据包,都不要急着往 ArcMap 里拖。先花三分钟在文件层面摸清楚里面到底有什么、字段叫什么、坐标系是什么,这三件事决定了后面所有操作的底子。数据一旦加载进去才发现坐标系不对,后面叠加、算面积、出图全部白做,这个教训我在多个项目里反复吃过。
2.1 数据分层和字段结构:先用脚本把每个shp的“家底”打出来
shp 文件不是单独一个文件,而是由 .shp、.dbf、.shx 等多个文件组成的集合,缺一不可。解压后如果发现 .dbf 缺失,属性表打不开;缺失 .prj,坐标系就丢了三魂七魄。建议先用一段 arcpy 脚本把文件夹内所有要素类的图层类型、要素数量和字段全部列出来。
# -*- coding: utf-8 -*- import arcpy arcpy.env.workspace = r"D:\huxi_gis" for fc in arcpy.ListFeatureClasses(): desc = arcpy.Describe(fc) # GetCount 返回的是 Result 对象,记得 getOutput(0) 取数字 count = arcpy.GetCount_management(fc).getOutput(0) print("图层: {} 类型: {} 要素数: {}".format(fc, desc.shapeType, count)) for fd in arcpy.ListFields(fc): print(" 字段: {} 类型: {} 长度: {}".format(fd.name, fd.type, fd.length))这段脚本里,arcpy.ListFeatureClasses()会列出工作空间下的所有矢量要素类,desc.shapeType能区分 Polygon 还是 Polyline,arcpy.GetCount_management(fc)返回的是一个 Result 对象,很多人第一次用会直接把<Result object>打到屏幕上,还以为自己写错了,其实只是少了.getOutput(0)。后面循环里的arcpy.ListFields(fc)会把字段名、字段类型、字段长度一起显示,这一步能帮你快速判断属性表里有没有名称、类型、面积这些关键列。
湖区面图层和河流线图层大概率是分开的。湖面一般是用 Polygon 存边界和面积,河流线用 Polyline 存干流和主要支流走向。字段上常见的组合会是:
| 字段名 | 类型 | 用途 | 检查要点 |
|---|---|---|---|
| NAME / 湖泊名称 | Text | 图例显示与注记 | 是否有空值 |
| TYPE / 类型 | Text | 区分湖泊、河流、水库 | 出图筛选用 |
| AREA / AREA_KM2 | Double | 湖体面积 | 需要投影后重算 |
| LENGTH / PERIMETER | Double | 岸线长度或河流长度 | 同上 |
注意,这里写的是字段的常见命名方式,具体包的字段名未必完全一致。拿到后不要依赖我这份表去对号入座,运行脚本把真实字段打出来才是正路。如果发现名称字段里有大量空值,后续做注记标注时会很难看,建议先记录再处理。
2.2 坐标系识别:WGS84、CGCS2000还是地方坐标,不能靠猜
shp 的坐标系藏在 .prj 文件里,没有这个文件,ArcMap 就会以“未知坐标系”对待它。最糟糕的情况是,你根本没注意到图层的坐标系是未知的,结果拿到在线影像底图上一叠加,整体偏移到另一个县去了。
判断坐标系最直接的办法是在 ArcCatalog 里右键图层,打开“属性”看“源”标签页。但我更习惯用脚本读,因为要一次检查十几个图层时更高效。
import arcpy shp = r"D:\huxi_gis\lakes.shp" desc = arcpy.Describe(shp) sr = desc.spatialReference if sr.factoryCode == 0: print("坐标系未知,需要先定义") else: print("坐标系名称:", sr.name) print("WKID:", sr.factoryCode) print("线性单位:", sr.linearUnitName)这段代码里,spatialReference是 Describe 对象的关键属性,factoryCode对应 EPSG 编码。比如 WGS84 地理坐标是 4326,CGCS2000 地理坐标是 4490,CGCS2000 投影坐标则按分带有不同的 WKID。如果输出factoryCode == 0,说明这个 shp 没有 .prj 文件,属于“裸数据”,需要先借助周边资料判断它原本是什么坐标系,再用“定义投影”把它补上,这一步相当于是给数据装回定位系统。
滇池和抚仙湖的经度大概在东经 102°40′ 到 102°55′ 之间,处于高斯 3 度分带的第 34 带,中央经线 102°E。很多地方的测绘成果会用 CGCS2000 3 度带投影在存,如果这份数据来自测绘部门,坐标系大概率是这一类。但也要做好它只是 WGS84 经纬度的准备,两者不统一就必须转换。我的处理习惯是:如果只做显示和出图,统一到 WGS84 或 CGCS2000 地理坐标就行;如果要计算面积、做缓冲、做密度分析,先投影到等积投影或者高斯投影再动手。
2.3 完整性与空值快检:一分钟跑完一个数据包的质量体检
数据包解压后有没有明显的“带病”图层,可以跑一节快速体检脚本,重点查两类问题:一是空几何,二是名称字段空值。空几何在手工数字化数据里不常见,但在从 CAD 或 GeoJSON 转过来的数据里时有发生。
# -*- coding: utf-8 -*- import arcpy arcpy.env.workspace = r"D:\huxi_gis" fields_to_check = ["NAME", "TYPE"] for fc in arcpy.ListFeatureClasses(): geo_empty = 0 total = 0 null_values = {} with arcpy.da.SearchCursor(fc, ["SHAPE@"] + fields_to_check) as cur: for row in cur: total += 1 if row[0] is None or row[0].isEmpty: geo_empty += 1 for idx, fld in enumerate(fields_to_check, start=1): if row[idx] is None or str(row[idx]).strip() == "": null_values[fld] = null_values.get(fld, 0) + 1 print("{} 总计 {} 条,空几何 {} 条".format(fc, total, geo_empty)) for fld, cnt in null_values.items(): print(" 字段 {} 空值 {} 条".format(fld, cnt))这段脚本用arcpy.da.SearchCursor遍历属性表,SHAPE@是内置的几何字段,isEmpty方法用来判断几何对象是否为 NULL。空值统计则是遍历 NAME、TYPE 这些业务字段,把空格字符串也归到空值里。
这个检查看起来简单,放小数据上十几秒就跑完了,但它能帮你识别后续最容易被质疑的数据问题。我在交接数据时最怕对方打开属性表发现一堆空名称,图面上一堆要素没标注,导致制图时还得回头补数。
3. 湖面和河流矢量整理:从CAD痕迹到规范化要素
如果这份 shp 是从 CAD 或老矢量化成果转过来的,多多少少会带着几何毛病。最常见的两类问题是面要素自相交、线要素存在悬挂点和伪节点。这些问题在屏幕上看不出来,一旦做面积计算、拓扑分析、空间连接,结果就全乱了。
3.1 面要素自相交:用检查几何和修复几何给湖岸线做手术
面要素自相交是 dwg 转 shp 的典型后遗症。CAD 里的多段线转成 ArcGIS 面时,如果弧段闭合方式不对,就会产生自相交的“蝴蝶结”环。湖岸线图形看起来还在,但面积算出来会和真实值差很大。
ArcToolbox 里有两个被低估的工具:检查几何和修复几何,都在“数据管理工具 → 要素”下面。这两个工具的组合也是我处理任何 shp 数据包的第一步手术。
import arcpy in_fc = r"D:\huxi_gis\lakes.shp" chk_table = r"D:\huxi_gis\lakes_check.dbf" # 检查几何:生成结果表,列出每个要素的错误类型 arcpy.CheckGeometry_management(in_fc, chk_table, "SHAPE_INVALID;DUPLICATE_VERTICES;SELF_INTERSECTIONS") # 修复几何:删除空几何并修复可自动处理的自相交问题 out_fc = r"D:\huxi_gis\lakes_fixed.shp" arcpy.RepairGeometry_management(in_fc, out_fc, "DELETE_NULL")CheckGeometry 工具会为出问题的要素生成一条记录,并在结果表里写明错误类型,比如SELF_INTERSECTIONS或者SHAPE_INVALID。参数里我传了三种错误类型的组合,用分号连接,意思是让它同时检查这三种问题。RepairGeometry 的第二个参数DELETE_NULL表示删除空几何,输出是修复后的新要素类。
实际上,RepairGeometry 对自相交的处理方式是把相交的环拆掉或者重建有效环。对绝大多数湖岸线来说,修复一次就能解决面积算不准的问题。修完后建议再用 CheckGeometry 跑一遍确认没有残留报告,同时重新计算面积字段,因为修复后几何边界可能发生了变化。
3.2 河流线拓扑:悬挂点和伪节点的处理边界
河流线层的拓扑问题比面层更隐蔽。线要素的悬挂点,指的是线的一端没有连接到其他线的端点,像一条断头路。伪节点,则是一条线在没有实际分成两条的地方被硬拆成了两段。
处理河流拓扑前要分清楚场景。模拟河网或地下管网对连通性要求极高,悬挂点必须清零;但自然河流在源头和入湖口本来就是“悬挂”的,你不能为了拓扑把源头也硬接上,这就是最容易翻车的边界判断。我一般先创建拓扑,把规则设成“不能有悬挂点”,但要把容差控制在一个很小的范围内,再去检查被标记出来的悬挂点是不是真的该连。
import arcpy gdb = r"D:\huxi_gis\hydro.gdb" river = r"D:\huxi_gis\rivers.shp" topo_name = "river_topo" arcpy.env.overwriteOutput = True # 创建拓扑,簇容差按数据单位设置:投影坐标用0.001,经纬度用0.0000001 arcpy.CreateTopology_management(gdb, topo_name, 0.001) # 把河网线层加入拓扑 arcpy.AddFeatureClassToTopology_management(topo_name, river) # 添加规则:线要素不得悬挂 arcpy.AddRuleToTopology_management(topo_name, "Must Not Have Dangles (Line)", river)这里要特别说下簇容差参数。容差是用于判断两个点是否重合的距离阈值,如果设置太大,会把本来不该连在一起的支流误判成连通;设置太小,又会有大量本应捕捉的点被漏掉。投影坐标系下我习惯设 0.001 米,经纬度坐标系下则要缩小到 0.0000001 这个量级,因为一度经度的实际长度有上百公里,单位不同,量级完全不同。
拓扑检查的结果会以拓扑错误的形式标出来。对每条被标记的悬挂点,你要确认它在语义上是否合理。入湖口的一端通常应该是闭合的,如果它悬空了几米,就是数字化时漏了捕捉,需要用编辑器里的捕捉工具重新连接。支流源头的悬挂则可以把它加入拓扑错误的例外列表,保留现状。
3.3 字段计算器实战:面积、长度与自动编号一次搞定
面积和长度字段是 shp 属性表里最容易过期的字段。数据经过几何修复、投影转换、节点编辑之后,面积字段的值就已经不可信了,必须重新计算。字段计算器在 ArcMap 里是交互式的,右键属性表字段就能打开,但在批处理和可复现性面前,我建议用 UpdateCursor 脚本。
# -*- coding: utf-8 -*- import arcpy fc = r"D:\huxi_gis\lakes_fixed.shp" # 注意:执行前保证数据已经是投影坐标系,而不是经纬度 with arcpy.da.UpdateCursor(fc, ["SHAPE@", "AREA_KM2", "NAME"]) as cur: for shp, area, name in cur: if shp is not None and not shp.isEmpty: # shp.area 的单位是数据源的线性单位,米制下得到的是平方米 new_area = round(shp.area / 1000000.0, 6) cur.updateRow([shp, new_area, name])这里的核心是shp.area返回的数值单位,完全取决于数据源的坐标系。如果数据是米制投影坐标,shp.area返回平方米,除以 1000000 得到平方公里;如果数据还是经纬度坐标系,shp.area返回的是“度平方”,这个数字没有任何实际意义,所以必须先投影再算面积,顺序不能反。
自动编号也是字段计算器是高频需求。比如给湖泊按顺序编号,很多人在 ArcMap 里用 Python 表达式写:
"LAKE{:03d}".format(!OBJECTID!)但用脚本更可控,尤其是当 OBJECTID 序列中间有断号,需要按顺序重排时:
with arcpy.da.UpdateCursor(fc, ["OBJECTID", "CODE"]) as cur: n = 1 for row in cur: row[1] = "LAKE{:03d}".format(n) n += 1 cur.updateRow(row)这段脚本不管 OBJECTID 是否连续,都会从 1 开始重新编号,保证 CODE 字段是一个没有空洞的序列。批量出图时用这个字段做排序和定位,就不会出现图面顺序错乱的问题。
4. 接管mxd出图工程:修链、配色与批量出图
mxd 是这个数据包的亮点,也是最大的坑点。mxd 文件本身不存数据,它只是把各 shp 图层、符号、注记、图框、图例这些元素组织在一起的工程文件。一旦数据包的存放路径变了,mxd 里的数据源链接就全部断掉,打开后一片红色感叹号。
4.1 mxd版本与断链:先用arcpy把数据源路径修通
ArcMap 不同版本生成的 mxd 并不完全兼容。新版本打开旧版本 mxd 会自动升级,但升级后无法再被旧版本直接打开;旧版本打开新版本 mxd,则会直接提示版本过高无法打开。所以拿到 mxd 的第一步,是先看它的版本信息。最简单的方法是打开 ArcMap,进去后看标题栏或文件菜单里的文档属性。
路径断链是更常见的问题。数据包从压缩包解压到新目录,mxd 里记录的还是原始路径,就会断链。先跑一段脚本摸清所有数据源的真实位置:
import arcpy mxd_path = r"D:\huxi_gis\out_mxd\滇池抚仙湖地形图.mxd" mxd = arcpy.mapping.MapDocument(mxd_path) for lyr in arcpy.mapping.ListLayers(mxd): # 只处理包含数据源的图层,标注图层和组图层没有数据源 if lyr.supports("DATASOURCE"): print(lyr.name) print(" 数据源:", lyr.dataSource) if lyr.isBroken: print(" [断链]") # 批量替换工作空间根路径 n = mxd.findAndReplaceWorkspacePaths(r"D:\原始路径\data", r"D:\huxi_gis") print("已替换路径:", n, "处") mxd.save()findAndReplaceWorkspacePaths的作用是把 mxdata 里所有以旧路径开头的数据源,统一替换成新路径前缀,适合整个目录从 A 盘挪到 B 盘的情况。但如果个别图层连文件名都对不上,这个函数就无能为力了,需要手动用replaceDataSource指定新的 shp 文件。
for lyr in arcpy.mapping.ListLayers(mxd): if lyr.isBroken and lyr.supports("DATASOURCE"): # 参数:工作空间路径、工作空间类型、shp名称 lyr.replaceDataSource(r"D:\huxi_gis", "SHAPEFILE", lyr.name.split(".")[0], False) mxd.save()replaceDataSource的第二个参数"SHAPEFILE"表示工作空间类型是文件夹,第四个参数False表示不执行垂直投影。这里要注意,替换前要确认目标 shp 的坐标系和原本一致,否则替换后图层虽然不红,但图面位置可能全乱。
4.2 符号与布局:湖区、河流、图例、网格一套配齐
修通路径后,打开 mxd 应该能看到一个接近成品的地图视图。接下来要按自己的出图标准调整符号。湖面层建议用浅蓝色填充加深蓝色细边框,透明度调成 90% 左右,这样叠加影像底图时还能透出地形。河流线用青蓝色,主干流和支流分开设置线宽,主干流 1.5pt,支流 1.0pt 或者更细。
| 图层类型 | 推荐符号 | 备注 |
|---|---|---|
| 湖面(面) | 浅蓝填充 + 深蓝细边框 | 透明度 90% 便于叠底图 |
| 河流(线) | 青蓝单线,宽 1.2-1.5pt | 主干流、支流分开设置 |
| 注记 | 黑体或仿宋 | 字号不小于 6pt |
| 图廓外背景 | 无填充 | 保持干净 |
很多人问“gis图中图怎么做”,其实就是布局视图里再插入一个数据框。把整个云南省或者昆明、玉溪的行政区划范围放进这个小数据框里,叠加一个红色矩形框表示当前主图所在位置。操作方法是:切换到布局视图,插入 → 数据框,然后右键这个新数据框的属性,设置它的范围为主图范围,再在图层属性里把行政区划面数据的符号调成半透明。
经纬网和方里网也需要检查。在数据框属性里找到“网格”选项卡,新建经纬网,间隔要根据比例尺来定。1:10 万的地图用 0.5 度间隔通常合适,1:5 万用 0.1 度,1:25 万用 1 度。网格标注字体建议用宋体,大小和主图注记保持一致。比例尺、图例、指北针这三个东西放在图廓外,不要压住主图内容,这是出图的基本礼仪。
4.3 数据驱动页面:把整幅地形图拆成逐格出图
大范围地形图通常要分幅出图,如果手动一页一页去切,效率极低。ArcMap 的数据驱动页面就是为这个场景设计的,它的前提是先有一个分幅网格,这个网格一般用“创建渔网”工具生成。很多人问渔网分割 shp 怎么弄,其实就是这一步。
import arcpy arcpy.env.workspace = r"D:\huxi_gis\work.gdb" out_fc = r"D:\huxi_gis\work.gdb\page_grid" # 起点XY、方向点XY、格网宽高、对角点XY arcpy.CreateFishnet_management( out_fc, "350000,2690000", # 起点,左下角 "350000,2691000", # 方向点,用于确定格网的角度 "10000", "10000", # 每个格网宽、高(米) "0", "0", # 行列数,0表示根据对角点自动计算 "420000,2770000", # 对角点,右上角 "NO_LABELS", "DEFAULT", "POLYGON" )这里第一行参数是格网左下角起点坐标,第二行是用于确定方向的参考点,第三行是每个格网的宽高,第四行行数和列数设 0 可以交给工具根据范围自动计算,第五行是格网范围的右上角。生成后是一个覆盖整个滇池和抚仙湖区域的矩形网格面。
然后在 ArcMap 的菜单里找到“视图 → 数据驱动页面 → 设置页面”,勾选启用,把索引图层指定为刚才生成的 page_grid,索引字段选 OBJECTID 或者自己加的编号字段,排序选升序。这样每一页就会自动对应一个格网范围内的地图内容。
数据驱动页面设置完成后,文件 → 导出地图,格式可以选择 PDF 或者 TIFF。PDF 可以一页一页合并,TIFF 适合后续放进成果文档。这里要提醒的是,导出前务必在主视图里把比例尺调整好,因为数据驱动页面会根据各页地图范围内的要素范围自动缩放,比例尺不一致时,相邻图幅接边会很难看。
5. 避坑记录:滇池与抚仙湖矢量数据实战的五个典型坑
这些坑不是从教程里读来的,是我实际处理类似湖区数据时踩过的。每一条都按照“现象 → 原因 → 解决”来讲,方便你遇到同类问题时一条条对照。
5.1 面自相交导致面积归零
现象:打开湖面的属性表,AREA 字段值是 0,或者明显小于真实湖面面积。缩放到湖岸线局部,把符号改成空心线框,能看到边界线有回环交叉的情况。
原因:这个坑多出现在 dwg 转 shp 的路径上。CAD 里的一段封闭多段线转成 shp 面时,如果弧段方向不一致,或者两个环相交在一起,就会产生自相交几何。ArcGIS 在计算这一类几何的面积时,会把相交部分视为无效,结果自然是错的。
解决:跑一遍第 3.1 节写的 CheckGeometry 和 RepairGeometry。检查时选上 SELF_INTERSECTIONS,修复后重新计算面积字段。修复后的几何会把原本相交的环调整成有效的单环,面积字段要用字段计算器重新算一遍,不要沿用旧的 AREA 字段。
5.2 河流层悬挂线与支流漏接
现象:河流线层显示正常,但通过拓扑检查发现入湖河口处线端点离湖岸线边界差了几米,或者两条支流之间看起来已经连上,实际端点没有接触。
原因:原始数字化时没有开启端点捕捉,或者从 CAD 转出时节点的精度丢失。ArcGIS 默认的显示容差比较大,点之间差几米在屏幕上根本看不出来,但做分析时就会断连。
解决:创建拓扑,设置“不能有悬挂点”规则,把容差调到投影坐标 0.001 米的量级,然后逐条检查拓扑错误。入湖口和交汇点用编辑器里的捕捉工具手动连接,支流源头如果本来就是开放端点,要在拓扑错误上右键设为例外,避免误报。
5.3 坐标系乱套导致双湖错位几百米
现象:把湖面和河流两个 shp 同时放进 ArcMap,两个图层叠加不进,或者把在线影像底图加进来后,湖岸线整体偏离了几百米。
原因:一个图层的坐标系是 WGS84 地理坐标,另一个是 CGCS2000 投影坐标,ArcMap 默认按数据框坐标系做动态投影,如果某个图层缺少 .prj 文件,系统会默认它是 WGS84,结果就是两个图层在空间上错位。
解决:先用第 2.2 节的脚本逐个检查坐标系。没有 .prj 的文件,先用“定义投影”给它指定正确的坐标系;有坐标系但和主流不一致的,用“投影”工具转换到统一坐标系。统一之后再做一次空间位置核对,最稳的办法是加载一张在线影像,目视检查湖岸线是否贴合。
5.4 Shapefile属性表中文乱码
现象:打开属性表,中文字段显示为一串问号或者乱码,但英文和数字正常。
原因:Shapefile 的 .dbf 文件在早期版本里使用 ANSI 编码,而中文 Windows 环境需要用 OEM 或者 GBK 编码读取。当 dbf 的代码页信息丢失或者标记错误,ArcMap 就会读取失败。
解决:最稳的办法是在 ArcMap 里用“导出数据”把该图层重新导出一份,导出时选择新格式并设置字符编码为 UTF-8。如果手边有 QGIS 也可以,加载 shp 时手动选择编码 GBK 或者 UTF-8,再另存为新文件。处理完后再放回 ArcMap 里打开,中文字段就能正常显示了。
5.5 mxd打开后全图层红色感叹号
现象:双击打开 mxd,内容视图里所有图层的名称前都是红色感叹号,地图全是空白,缩略图也显示不出来。
原因:mxd 里记录的数据源路径还是压缩包制作时的目录路径。你的解压目录和它不一致,或者文件夹被改名,数据源就找不到。
解决:用第 4.1 节的findAndReplaceWorkspacePaths批量替换路径,如果替换后仍有图层断链,就用replaceDataSource手动指定新路径。处理完保存 mxd,再重新打开确认。从那以后,我每次解压数据包都会先把所有 shp 放进一个纯英文路径的文件夹,再打开 mxd,很大程度上能避免路径断链这个看似玄学的问题。
6. 进阶验证:几何复核、Web导出与DEM叠加
到这里数据基本整理干净,mxd 也能顺利出图了,但还有三个动作我每次都做,它们分别对应质量验收、数据分发和地形合理性检查。
6.1 一键验收脚本
出图之前,把全部 shp 再跑一遍几何检查和字段重算。固定写一段脚本,放在工作文件夹里,每次交付前执行一次:
# -*- coding: utf-8 -*- import arcpy arcpy.env.workspace = r"D:\huxi_gis" for fc in arcpy.ListFeatureClasses(): chk = r"D:\huxi_gis\check_{0}.dbf".format(fc.split(".")[0]) arcpy.CheckGeometry_management(fc, chk) print(fc, "检查完成")这段脚本会把每个图层的几何检查结果写入单独的 dbf 表,人工只需要打开表看有没有记录,有记录就说明有几何错误需要处理。这一步花不了两分钟,但能拦下一大批低级问题。
6.2 shp转GeoJSON给Web端
项目要上 WebGIS 或者给前端同事用的时候,shp 格式并不友好。用 GDAL 的 ogr2ogr 工具可以快速转出 GeoJSON,这是命令行下的常见做法:
ogr2ogr -f GeoJSON -t_srs EPSG:4326 lake_out.geojson lakes.shp-f GeoJSON指定输出格式,-t_srs EPSG:4326表示把坐标系重投影到 WGS84 经纬度,Web 端通用格式就是 WGS84。如果不需要重投影,把-t_srs这一段去掉即可。转完用文本编辑器打开,能看到属性字段和坐标数组一一对应,这样前端就能直接解析。
6.3 与DEM叠加看岸线合理性
最后再讲一个我比较依赖的验证方法:把 DEM 高程数据叠加到湖面 shp 下面,检查湖岸线是否落在合理的高程范围内。滇池和抚仙湖的常水位是固定的数值区间,如果湖面边界和 DEM 提取的等高线相交过于夸张,说明岸线数据可能有问题。常见做法是用公开的 DEM 数据生成等高线,再与湖区边界做一次空间叠加,目视检查湖岸线位置与等高线的切合程度。这不算一个复杂分析,但它是把矢量数据放回地形语境里验证的有效手段。
从那以后,我每次交付这一类湖区 shp 数据包,都强制走一遍“坐标系检查 → 几何修复 → 字段重算 → mxd 路径校验”的流程,麻烦确实是麻烦一点,但省掉的是后面一轮又一轮的返工和解释。希望帮到你。
本文还有配套的精品资源,点击获取