ARTICLE DETAIL

资讯详情

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

粤港澳大湾区shp数据处理全指南:从坐标系修复到三维可视化

粤港澳大湾区shp数据处理全指南:从坐标系修复到三维可视化 简介面向城市规划、GIS 数据分析与区域研究场景这份粤港澳大湾区shp文件提供了完整的矢量地理数据覆盖广州、深圳、珠海等珠三角九市及港澳地区可清晰呈现城市边界、水系、交通网络与行政区划等要素。资源共8个文件压缩包约785KB包含.shp主文件、.shx索引、.dbf属性表、.prj投影信息、.sbn/.sbx空间索引以及.cpg编码和.xml元数据格式规范便于直接导入ArcGIS、QGIS等主流平台进行制图、查询与空间分析。目前已有736人学习下载。通过该数据集使用者可开展区域规划、资源管理、环境监测、灾害评估等多领域应用政府机构可辅助制定区域发展战略企业可优化资源配置研究者可分析大湾区一体化发展态势为政策制定与基础设施建设提供数据支撑。 做粤港澳大湾区相关项目时最容易被卡住的往往不是分析模型而是最基础的底图数据——边界shp从哪来、坐标系对不对、字段能不能直接用。我前段时间帮一个产业协同研究的项目整理底图光找数据就折腾了半天。网上搜粤港澳大湾区shp弹出来的链接不是网盘失效就是数据源坐标系混乱下载下来整个面层的位置飘了几百米。这篇博客我把实际处理这些数据的过程和教训整理出来覆盖数据获取、预处理、以及搜索里反复出现的那堆shp转来转去操作希望能帮同路人少走几步弯路。1. 大湾区shp数据的来源与选型先界定范围再谈下载渠道1.1 “粤港澳大湾区”在shp数据里到底指哪一层做数据之前得先明白一个现实问题粤港澳大湾区不是一个行政区划单位而是一个区域概念。在shp数据层面它通常对应三种粒度最小必要集珠三角9个城市广州、深圳、佛山、珠海、东莞、中山、惠州、江门、肇庆的市级边界扩展集加上香港和澳门两个特别行政区的边界精细集下钻到区县级比如深圳的福田区、南山区广州的天河区、海珠区等。不同粒度对应不同应用场景。做宏观产业布局、交通网络分析市级边界基本够用做城市规划或者地块分析就必须要区县级甚至要街道/镇界。我建议你先明确项目要落到哪个粒度再去选数据源否则下载一个全省边界回来自己裁剪反而增加工作量。1.2 几个实测可靠的免费数据渠道我这些年用过的大湾区shp来源可以从可靠程度依次排序天地图国家地理信息公共服务平台提供省级、市级、区县级的行政区划GeoJSON数据坐标系是CGCS2000精度最靠谱。下载方式是在天地图官网找数据下载或通过API按行政区域代码拉取注册实名后一般都能拿。OpenStreetMapOSM适合拿路网、水系、建成区轮廓。虽然行政区划边界精度不如官方但胜在开放、更新快。通过Geofabrik下载中国区域数据包然后在QGIS里按行政区名称筛选这个链路最常用。GitHub上整理好的开源数据集搜china province boundary geojson或china admin boundary shp能找到不少热心人整理过的全国省市县边界数据。优点是一次下载包含全部层级缺点是坐标系和字段命名五花八门甚至有些数据是街道级。使用前务必检查精度和属性表。专业GIS社区/njmap等地图数据站一些导航地图数据社区会有整理好的shp包通常包含POI、道路网、公交线等。我建议只在这些地方补充路网或POI类数据行政区划尽量不从这里取。注意百度网盘里那种大湾区shp合集.zip下载前先看文件属性里有没有投影信息.prj文件和字段说明很多是从老地图矢量化出来的边界已经和现状差很多做分析会出大问题。1.3 判断一份shp数据能不能用的两个关键特征在ArcGIS Pro或QGIS里加载数据后我第一时间看两样东西坐标系。优先选CGCS2000国家2000坐标系的数据其次WGS84尽量不要用西安1980或北京1954历史坐标系。如果你发现shp文件没有.prj投影文件那坐标值可能就是纯粹的经纬度加载后显示范围不对。这种情况可以用定义投影工具手动指定WGS84再转投影坐标系。字段结构。一份完整的行政区划shp属性表里至少要有名称name/NAME/省/市/区、行政代码adcode/adm_code两个字段。只有geometry没有属性字段的面数据往往来源不明边界验证也很麻烦。行政区代码是判断边界版本是否最新的一个重要依据比如区划调整后代码会变化如果adcode对不上现行区划标准那这份数据大概率不是最新的。2. 数据到手先别急着出图坐标系和几何是两个必须提前填平的坑2.1 坐标系三步检查法避免位置偏移几百米在大湾区这种跨度不大的区域做分析坐标系混用最典型的症状是面边界和影像底图对不上整体偏了几百米到一两公里。我自己的检查习惯是这样的在ArcGIS Pro的目录里选中图层右键图层属性看源选项卡里的坐标系描述。如果显示GCS_WGS_1984说明是地理坐标系单位是度如果显示CGCS2000_3_Degree_GK_Zone_39或Mercator之类说明是投影坐标系单位是米。双击图层看范围Extent的数值。如果范围在113到115之间经度跨度说明数据是WGS84或CGCS2000的经纬度坐标如果范围是8位数左右的大数值则是投影坐标。记住东经113°到115°是大湾区的经度带这个区间是最直观的判断条件。如果需要统一到同一个投影坐标系在ArcGIS Pro里用投影工具Project在QGIS里用导出→另存为→设置CRS。大湾区常用CGCS2000 3度带高斯投影中央经线选114°E或者117°E具体根据数据覆盖范围来。我见过一个实际案例同事用WGS84的数据叠加到CGCS2000的影像底图上做分析结果路网跟影像明显错位所有建筑边界都往西偏了差不多500米。这在高精度应用里是致命的。2.2 字段清理与几何简化让shp瘦身也避免后续工具报错拿到一份包含几百个字段的行政区shp是常有的事。字段多了不仅拖慢加载速度很多处理工具比如Dissolve、Spatial Join还会因为字段类型冲突直接报错。我的常规操作是在ArcGIS Pro里用删除字段工具只保留name、adcode和geometry用融合(Dissolve)工具把相邻的碎面按行政区字段合并比如把多个岛礁面融合成一个大面使用简化(Simplify)工具把边界线的顶点数量降下来。如果只是做区域统计、出图展示简化容差可以设到100米甚至200米如果要做地块级分析容差控制在10米以内否则边界形态会失真。这一步做完shp文件体积通常能缩小一半以上后面加载和裁剪影像的速度也会明显变快。还有一个经验处理完的数据最好重新导出成一个新shp文件名带_clean后缀避免在原文件上反复编辑手滑改坏。3. 高频格式转换实操kml/geojson/dwg/wkt转shp还有国土报备的shp转txt3.1 kml转shp、geojson转shp能批量就不要手动kml和geojson转shp是搜索里问得最多的操作大概率是因为很多在线地图和手机采集工具默认导出这两种格式。ArcGIS Pro路径直接把kml或geojson文件从目录面板拖到地图里然后在内容列表中右键该图层→数据→导出要素→选择shapefile。注意kml文件拖进来后可能是一个图层组包含点和线面多个子图层需要逐个子图层导出。如果kml是ArcGIS的图层包格式.kmz先在ArcGIS Pro里用KML转图层工具转换。QGIS路径最简单——直接把文件拖进QGIS右键图层→导出→保存要素为格式选ESRI Shapefile坐标系在这里可以顺手进行投影转换。QGIS对kml和geojson的支持比ArcGIS更稳几乎没有乱码问题。如果文件很多不要一个个右键导出。在ArcGIS Pro里用模型构建器或者Tasks工具写一个循环或者直接用Python的arcpy.FeatureClassToFeatureClass_conversion函数批量处理。下面这个脚本我经常用跑一遍就能把所有kml图层导出为独立shpimport arcpy, os arcpy.env.workspace rD:\kml_folder out_folder rD:\shp_output for kml in arcpy.ListFiles(*.kml): layer arcpy.KMLToLayer_conversion(kml, out_folder, os.path.splitext(kml)[0]) print(f{kml} 转换完成输出至 {layer})3.2 dwg转shp和wkt转多边形shp两个容易踩坑的格式dwg转shp比kml麻烦一些。CAD图纸里通常有大量辅助线、标注、填充面直接转shp会把垃圾要素全带进来。我的做法是先在CAD里把要转的图层比如用地红线层、建筑轮廓层单独保留删除标注和辅助实体再另存为DXF或DWG。然后在ArcGIS Pro里用CAD转地理数据库工具批量导入到要素集再从要素集导出shp。关键点是转完一定要清理几何CAD里很多闭合多段线在GIS里会变成线要素而不是面要素需要用要素转面工具把它们闭合起来再用修复几何工具检查自相交、空几何等问题。wkt转多边形shp这个需求通常是给用户提供单个地块边界或缓冲区比如从数据库里查出一个多边形WKT字符串POLYGON ((113.5 22.8, 113.6 22.8, 113.6 22.9, 113.5 22.9, 113.5 22.8))我用QGIS最快图层→添加图层→添加分隔文本图层文件类型选CSV把WKT字段指定为几何字段坐标参考系选WGS84。如果不用QGIS还可以用Python的shapely库一两行就搞定from shapely import wkt import geopandas as gpd poly wkt.loads(POLYGON ((113.5 22.8, 113.6 22.8, 113.6 22.9, 113.5 22.9, 113.5 22.8))) gdf gpd.GeoDataFrame(geometry[poly], crsEPSG:4326) gdf.to_file(polygon.shp, encodingutf-8)3.3 shp转txt国土报备场景下的字段与编码细节shp转txt这个需求很大一部分来自国土报备、用地预审等行政流程。这种场景下txt不是给人看的纯文本而是要给报备系统导入的特定格式表格。不同地区对txt的字段顺序、分隔符、坐标系格式要求可能不一样但有几个通用的底线导出的txt必须包含坐标列常用格式是经度,纬度或X,Y坐标系要明确标注用逗号或Tab分隔不要用空格避免解析错乱文件编码统一用UTF-8带坐标数据的中文shp用ANSI编码经常在提交系统里乱码。在ArcGIS Pro里最直接的操作是打开属性表→全选记录→右键复制然后粘贴到Excel里另存为txt或者用表转Excel导出再另存为制表符分隔的txt。QGIS里更方便导出要素时格式选CSV注意在图层选项里勾选包括几何列并选择WKT或经度/纬度字段。提示如果你处理的是报备系统的txt建议先导出一个样例文件手工核对前3行数据再批量提交。因为报备系统对字段名极为敏感比如地块编号多一个空格都可能报错。4. 裁剪、渔网分割和批量裁剪影像空间分析里的高频操作链路4.1 arcgis裁剪shp指定区域与渔网分割两个方向要分清arcgis裁剪shp指定区域有两个常见含义一是用另一个面图层做掩膜裁剪Clip二是按字段值筛选单个区域Select by Attribute。前者我经常用来把全国边界裁出大湾区范围后者则是从全市区县边界里单独挑出某个区。具体操作分别对应ArcGIS Pro里的裁剪工具和按属性选择功能。渔网分割shp是另一个高频需求我猜很多人是想要格网统计图。比如把大湾区boundary按5km×5km的网格切分然后做某个POI点数据的格网密度统计。操作链路是用创建渔网(Create Fishnet)工具设置输出范围为大湾区shp的包围盒像元宽度和高度设5000米勾选创建标注点或创建面要素其中一个一般要面要素用相交(Intersect)工具把渔网和大湾区边界相交去掉范围外的格子用空间连接(Spatial Join)把POI点挂到格网上统计每个格子里的数量。这里有个经验渔网会延伸到包围盒之外直接拿渔网做统计会出现大面积无数据区域所以一定要先和大湾区边界做裁剪或相交只保留有效范围内的格子。4.2 模型构建器批量kml转shp迭代器的正确用法用模型构建器批量转格式遇到最多的问题是为什么只处理了第一个文件就停了。原因通常是迭代器类型选错了。在ArcGIS Pro的模型构建器里如果你想遍历文件夹下所有kml文件要用的不是迭代栅格而是迭代要素类或者更准确说在有些版本里需要添加KML转图层工具然后让模型的输入参数设置为多个文件。我自己的模型结构是这样的添加KML转图层工具把输入参数设为多值添加要素类转要素类工具作为下一步处理设置输出路径为%Workspace%\输出名称_%名称%.shp这种动态命名确保每次循环生成不同文件设置模型为并行处理勾选允许并行执行。模型构建器最难调试的不是工具本身而是变量名和数据环境的传递。建议先手动把单个文件跑通再放到模型里迭代否则错误信息会淹没在循环输出里。4.3 arcgis根据shp批量裁剪遥感影像Extract by Mask的正确打开方式arcgis根据shp批量裁剪影像是做遥感分析很常见的一步。需求一般是手上有大湾区的Landsat或Sentinel影像想按区县边界裁剪成十几个小影像再分别做后续处理。我用两种方式方式一Extract by Mask按掩膜提取。这是最简单的方式掩膜数据选shp面层输入栅格选影像输出为一个裁剪后的栅格。如果shp有多个面要素可以先用分割栅格工具按要素类别批量输出或者用按掩膜提取配合循环遍历每个区县要素。方式二arcpy批量脚本。如果shp里的要素很多用下面这个arcpy代码最省事import arcpy arcpy.env.workspace rD:\admin_shp out_ws rD:\clipped_imagery img rD:\imagery\landsat8.tif for row in arcpy.SearchCursor(dawanqu.shp): name row.getValue(name) where name {}.format(name) arcpy.Select_analysis(dawanqu.shp, tmp_selected.shp, where) arcpy.gp.ExtractByMask_sa(img, tmp_selected.shp, out_ws f\\{name}.tif) print(批量裁剪完成)这个脚本会遍历大湾区shp里的每个区县生成对应名称的裁剪影像。需要注意影像和shp的坐标系必须一致否则裁剪结果会整体偏移或全黑。遇到全黑结果优先检查投影是否匹配。5. 从二维shp到三维可视化3dtiles转换与白模加载的实操链路5.1 大湾区shp转3dtilesCesium场景下的完整参数建议shp转3dtiles是把二维行政区划或建筑轮廓搬到Web三维场景里的常见需求。CesiumLabCesium实验室出的转换工具是目前最顺手的方案免费版就够用。转换流程大体是在CesiumLab的数据处理页面新建一个转换任务输入shp文件确认shp坐标系通常需要是WGS84或CGCS2000经纬度设置输出坐标系为Cesium默认的Web Mercator或WGS84按需选择点击转换生成tileset.json和对应的b3dm/pnts文件。一个实测的建议如果shp是建筑轮廓面数据建议在shp里带上建筑高度字段比如height或者层数字段CesiumLab可以按字段拉伸成白模。如果shp里没有高度字段可以在转换前先在ArcGIS Pro里按建筑面积或楼层数估算新增一个浮点型字段再导出。另一个容易踩的坑是shp的文件目录不能有中文和特殊字符否则CesiumLab读取会直接失败并且生成3dtiles要配置好Cesium ion或自己的Web服务器否则模型不会显示。注意转换后的3dtiles要放到支持CORS跨域的静态服务器目录里直接在本地双击index.html打开是看不到模型的。如果放在Nginx里需要在配置中增加add_header Access-Control-Allow-Origin *;。5.2 图新地球加载白模shp先把高程和属性整明白图新地球LocaSpaceViewer加载城市白模shp是目前做城市更新、规划展示非常常用的操作。我自己实测下来用图新地球加载shp白模有几个前提条件shp里必须包含高度字段。图新地球默认读取字段名是Height或高度如果字段名不对模型不会被拉伸。坐标系建议使用WGS84经纬度图新地球内置的影像底图是Web Mercator但加载shp时会自动识别经纬度直接用WGS84最不容易出问题。如果是多层建筑建议单独提供底部高程字段否则建筑会从地面零高程直接拔起遇到地形起伏大的区域会出现悬空或陷入地下的情况。加载操作很简单图新地球→工具→加载本地数据→选择shp文件→设置高度字段名→确认坐标系→确定。加载完成后用鼠标滚轮缩放建筑白模会跟着地形起伏自动显示。如果要导出到Cesium可以先在图新地球里把shp转成KML或3D模型再统一处理这是目前我试过比较稳的链路。5.3 顺手说下GIS Pro中shp文件的存储与查找逻辑搜索词里有gis pro的shp文件在哪里这类问题其实大多不是找不到文件而是搞混了ArcGIS Pro的工程和文件系统。ArcGIS Pro的工程文件.aprx并不存储shp数据它只是记录数据源路径。所以你的shp文件在磁盘上还是原来的位置ArcGIS Pro只是引用了它。如果在ArcGIS Pro目录面板里看到shp前有感叹号说明数据源路径失效了需要右键图层→属性→数据源→重新指向正确的shp文件。这个机制很容易让人误以为文件丢了实际上是路径变了。要养成把shp和数据一起放进工程文件夹、相对路径存储的习惯避免换台电脑就全部断链。结尾一点个人操作体会我做这类数据整理踩过最大的坑就是拿到数据后不检查坐标系就往下做分析结果做出来的统计图位置全偏又回炉重来。所以现在我做任何shp处理前都会先花两分钟看坐标系和字段然后再动手。另外送大家一个习惯处理完的shp统一加后缀命名_wgs84、_cgcs2000、_clean项目做久了你就知道这个命名规范有多救急。粤港澳大湾区这类自带热度的话题数据源和工具链路网上零散资料多但真正合起来能跑通的流程就这么几套照着我上面写的方式处理应该能少走不少弯路。本文还有配套的精品资源点击获取
返回列表