ARTICLE DETAIL

资讯详情

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

重庆2021矢量数据ArcGIS使用指南:WGS84坐标与shp处理避坑

重庆2021矢量数据ArcGIS使用指南:WGS84坐标与shp处理避坑 简介一套2021年重庆市综合矢量数据包涵盖路网、水网、建筑、土地利用及行政区划边界等核心要素面向GIS开发、城市规划、测绘与科研人员可直接用于ArcGIS、QGIS中的空间分析、制图与可视化数据统一采用WGS84坐标附带标准shapefile格式便于跨项目复用及坐标转换。压缩包内含40个文件由8个shp图层与对应的dbf属性表、prj投影定义、shx空间索引、xml元数据组成涉及道路、水系、铁路、居民地、建筑物、土地利用等图层其中路网与水网可支撑交通规划和水文分析土地利用及建筑数据则适用于城市扩张与生态环境研究。整体约33.68MB结构清晰解压即可加载目前已有618人学习下载数据更新至2021年覆盖重庆市全域适合作为区域研究、课程实验和项目底图的基础数据。获取后可快速叠加其他地理数据显著节省采集与配准时间。1. 为什么这份2021年重庆矢量数据值得你放进ArcGISWGS84坐标与shp的“可见即所得”做重庆项目的人都会遇到同一个尴尬网上找的shp要么不是WGS84要么缺图层要么边界对不上行政村级。2021年这份重庆矢量数据把路网、水网、建筑、土地利用和行政区划边界集中在一个包里全部是shp格式且带WGS84坐标拖进ArcGIS基本能直接显示。对做城乡规划、道路选线、ArcSWAT小流域分析的人说能省掉到处拼数据的半天时间。不过如果你觉得打开就能用那你很快会碰见坐标漂移、字段乱码、裁剪后图斑空洞这些经典问题。所以这篇按“先读懂数据再动手处理”的顺序把打开、转换、裁剪和避坑完整过一遍。2. 先读懂数据shp四件套、WGS84坐标和重庆行政区划边界的真实含义2.1 shp格式不是单个文件打开之前先认清四件套很多新手第一次下载shp看到文件夹里只有一个“.shp”以为可以像Excel一样双击打开。在ArcGIS里shapefile是一个“物理多文件”格式至少包含四个文件缺一个就翻车扩展名作用丢失后果.shp存几何图形没有核心文件完全无法打开.shx几何索引打开慢或图层识别失败.dbf属性表字段名乱码属性丢失.prj坐标系信息ArcMap按未知坐标系处理叠底错位我在处理这份重庆数据时第一件事是检查这四个文件是否齐全。如果下载包里有单独一个文件夹把整个文件夹拷贝到本地别只复制shp文件。常见做法是我会把数据放在英文路径下比如C:\GIS\CQ2021\避免中文路径导致ArcMap读prj失败。如果你的属性表字段是乱码别先去改数据先确认dbf文件存在且编码不是UTF-8而是GBK。shapefile的dbf编码不写进prj所以很多工具默认识别会出问题。这份重庆数据里路网和水网是线要素建筑和土地利用是面要素行政区划边界是面和线都有。右键图层属性切到Source可以直接看到几何类型。如果你看到的是“Polygon”或“Polyline”说明分类正常。2.2 WGS84与CGCS2000的差别为什么你的ArcMap显示乱位WGS84是GPS使用的全球地理坐标系也就是常说的经纬度单位是度。CGCS2000是2000国家大地坐标系也有经纬度版本。两者在大多数城市尺度上平面位置差异在厘米级到米级但在ArcMap里同一个数据若prj缺失后果是坐标被当成未知叠加影像底图时错位几十公里。打开这份数据前我会先确认坐标系定义。ArcMap里右键图层选择Properties - Source查看“Geographic Coordinate System”是否显示为GCS_WGS_1984。如果显示Unknown说明prj丢了。修复方式很简单使用工具“Define Projection”输入图层坐标系选 WGS_1984。如果是投影坐标不能直接套WGS必须还原原始投影。常见做法是我在拿到这类WGS84数据后会先定义一个Projected Coordinate System比如WGS 1984 UTM Zone 48N再做后续分析。如果你要用ArcSWAT之类建议统一转成CGCS2000 3 Degree GK Zone 37。这里先不展开第3章会给出具体命令。注意很多教程会建议“先投影再裁剪”。我的经验是先用地理坐标系做裁剪再投影到目标坐标系或者先投影再做空间分析。顺序不同结果都一样但效率不同。如果先裁剪的是整个重庆范围投影后裁剪速度更快因为坐标已经变成平面米。2.3 行政区划边界文件省1/省2的区别命名与选择资源包里常有“省1”和“省2”两个shp。很多人问“省界线文件省1和省2的shp文件有什么区别”。我拆过至少三份行政区划包规律比较一致省1通常是省级行政区面属性表含“省名称”“省代码”几何是Polygon用于区域填充和裁剪。省2通常是省界线或省界中心线几何是Polyline用于制图和边界提取。但不同打包者习惯不同。这份重庆数据里我建议先看属性表的字段名。如果字段里有“NAME”或“ADCODE”那是面如果有“TYPE”和“LINE”字样是线。另外可以把两个shp拖进ArcMap打开属性表统计几何类型。如果还是分不清用“要素类转面”工具试一下能转的就是面。关键踩坑不要用线要素做裁剪的“Clip要素”。ArcGIS的裁剪工具要求剪刀必须是面。如果你只有“省2”这种线得先“要素转面”得到区域。所以在做重庆路网裁剪时我一般选择省1属性表里“PAC”为500000的整个重庆市范围。3. 把数据导入ArcGIS从shp打开到投影转换的完整操作3.1 在ArcMap中正确加载shp数据启动ArcMap打开Catalog找到存放数据的目录。直接把shp文件拖进地图或者用“添加数据”按钮。如果内容列表里出现感叹号表示源路径失效这时要右键 - 修复数据源。等待渲染出现的面是土地利用线是路网和水网。如果没有显示别急着用“全图”工具先双击图层设置符号系统为“拉伸”再试。如果还是空白继续看第5章的排查。注意第一次加载WGS84数据时ArcMap不会主动提示坐标系未知只有属性表的“Source”显示Unknown。我的习惯是每次打开shp先按 CtrlR 打开ArcToolbox检查一下投影转换工具是否能正常枚举图层。为什么先检查因为投影转换是后续所有步骤的地基。3.2 投影转换WGS84转CGCS2000高斯投影假设需要把这份数据从WGS84转成 CGCS2000 3 Degree GK CM 108E。因为重庆经度范围约105°29—110°11中央经线108°基本覆盖全市。工具位置Data Management Tools - Projections and Transformations - Feature - Project。打开工具后输入要素框选“路网.shp”。输出坐标系先点“垃圾桶”图标清空再点旁边的“坐标系”按钮选择 Projected Coordinate Systems - Gauss Kruger - CGCS2000 - CGCS2000_3_Degree_GK_CM_108E。地理坐标变换栏留空或选择一种变换。WGS84和CGCS2000在省市级别使用默认转换即可。批量处理可以用ArcPy脚本来跑import arcpy from arcpy import env env.workspace rC:\GIS\CQ2021 out_srs arcpy.SpatialReference(rC:\Program Files\ArcGIS\Desktop10.8\Reference Systems\CGCS2000_3_Degree_GK_CM_108E.prj) fc_list [路网.shp, 水网.shp, 建筑.shp, 土地利用.shp] for fc in fc_list: out_fc fc.replace(.shp, _CGCS2000.shp) arcpy.Project_management(fc, out_fc, out_srs) print(完成:, out_fc)这段代码先设置工作空间再循环投影四个图层。out_srs可以替换成你机器上实际prj路径或者用arcpy.SpatialReference(4490)转成CGCS2000地理坐标系。注意脚本没有处理坐标变换参数精度要求高的项目需要下载国家参数文件。投影完成后用“添加数据”重新加载新生成的图层可以看到X坐标从度变成米范围变成几十万或几百万。3.3 按行政区划边界裁剪路网与水网现在有了坐标统一的行政区划面可以提取重庆范围内的路网。工具用“Clip”同样在 Data Management Tools - Extract。参数输入要素为“路网_CGCS2000.shp”裁剪要素为“区县边界_CGCS2000.shp”输出要素设为“路网_重庆.shp”。注意裁剪要素必须是面要素。批量裁剪的ArcPy代码如下import arcpy arcpy.env.workspace rC:\GIS\CQ2021\Projected clip_fc rC:\GIS\CQ2021\Projected\重庆市区县边界_CGCS2000.shp for fc in [路网_CGCS2000.shp, 水网_CGCS2000.shp]: out fc.replace(_CGCS2000.shp, _CQClip.shp) arcpy.Clip_analysis(fc, clip_fc, out) print(已裁剪:, out)这里的裁剪边界是《重庆市区县边界_CGCS2000.shp》。如果你下载的数据里只有“省2”线文件就得先“要素转面”否则clip工具会报“The clip features must be polygons”。默认容差不用改输出坐标系会继承输入要素的坐标系。如果发现裁剪后路网边缘出现断头路多是因为边界线没有把路网完全覆盖需要先在边界外围做Buffer。常见做法是给边界面外扩100米再裁剪避免遗漏沿界道路。4. 从dwg、KML、Excel点转到shp四类高频转换场景与参数坑4.1 dwg转shpCAD文件导入后为什么翻车很多重庆项目里的现状路网和建筑轮廓来自CADdwg转shp是常事。在ArcMap中使用“CAD转地理数据库”工具或者先把dwg拖进地图再右键图层导出要素。但直接导出经常翻车主要现象有三种单位是毫米或英寸坐标显示为几千到几十万和WGS84完全不匹配。图层属性全在“0”层要素类型是“Polyline”而不是面。文字注记被当成点要素导出来。正确做法是先打开“CAD要素数据集”查看每个要素类。明确几何类型Line和Polyline是路网Polygon是建筑轮廓或地块。设置坐标系为源CAD的实际坐标系再执行“CAD to Geodatabase”。参数里坐标单位选择“Meters”如果CAD没有已知坐标需要先做地理配准。我的血泪经验CAD转shp之前先合并多段线否则一条路可能被拆成几十段后续网络分析时无法连接。转换完成后用“要素转面”排除悬挂节点。4.2 ArcGIS shp转KML导出Google Earth底图的参数设置如果你想把重庆路网shp放到QGIS或Google地球上看需要shp转kml。ArcToolbox中“图层转KML”工具注意不是“要素转KML”。工具会先按当前图层属性符号化再输出kml。参数上必须把图层坐标系转到WGS84否则在Google地球里会偏移。步骤将“路网_CGCS2000.shp”加载到地图。右键图层 - 缩放至图层设置符号为颜色线宽。打开“图层转KML”工具输出文件名“重庆路网.kml”Layer Scale填1。完成后再用KMZ格式方便压缩分享。常见坑输出的KML在Google地球上比真实位置偏北偏东。原因是你没有把数据框坐标系设为WGS84而是保留CGCS2000。虽然图层有投影但KML输出必须在WGS84下。解决方法是先在地图文档属性里把数据框坐标系改成 WGS_1984再执行转换。4.3 Excel点转shp经纬度字段类型与坐标识别我手里有一份Excel表只有站点名称、经度、纬度。要转成shp用ArcMap的“添加XY数据”功能。注意字段类型必须是数值型不能是文本。如果Excel里经纬度是文本先选中列用分列功能改成数值。然后打开“添加XY数据”X字段选经度Y字段选纬度坐标系选“WGS_1984”。单击确定后生成一个临时事件图层。右键 - 数据 - 导出要素即可得到永久shp。导出前必须检查点位置是否落在重庆市范围内。方法事件图层属性里查看“地理坐标系”。如果X、Y字段搞反点会跑到海里此时做投影或修复几何都没有意义先检查字段对应关系。4.4 JSON转shp网站与Geoserver发布临时处理的其他方案除了桌面工具有时候手里只有GeoJSON或JSON数据。很多公开的重庆行政区划JSON来自开源项目想快速转shp却不在桌面环境时可以选择QGIS转换或者用在线JSON转shp网站。不过这类在线工具处理带中文属性字段时大概率乱码所以我不建议在上面传敏感数据。推荐本地跑一个Python小脚本用geopandas读取GeoJSON然后输出UTF-8编码的shpimport geopandas as gpd gdf gpd.read_file(rD:\data\chongqing.geojson) gdf gdf.to_crs(EPSG:4490) gdf.to_file(rD:\data\chongqing_admin.shp, encodingutf-8)这段代码会把GeoJSON重投影到CGCS2000地理坐标系再以UTF-8编码输出shp。在ArcGIS里打开时如果字段乱码再把属性表导出为dbf时选择GBK。如果你要用Geoserver发布矢量数据建议把原始shp先转成PostGIS或GeoPackageGeoserver对shp的直接发布容易遇到文件锁问题。5. 避坑我在重庆数据上踩过的六个常见问题5.1 打开shp看不到图形黑匣子一样的空白地图现象加载shp后全图显示空白坐标范围显示为0到0或者图层是“空”的。原因最常见的是缺少.prj文件ArcGIS误判坐标系导致范围不在合理区间。另一种可能是几何类型为“MultiPatch”或“体积要素”而不是普通点线面。解决先右键图层属性查看“源”。如果坐标系显示Unknown手动定义WGS84。如果源显示“Geometry Type: Object”需要用“修复几何”工具跑一遍或直接用“要素转面/线”。修复几何在Data Management Tools - Features - Repair Geometry参数留默认。5.2 属性表字段乱码shapefile的dbf编码问题现象路网名称、区县名称显示为“???”或“锘挎睙”。原因shapefile的dbf文件用GBK编码在ArcGIS 10.8里默认按UTF-8读取时错乱。解决先别改数据。用ArcToolbox里的“将表转Excel”看Excel是否能正常读。不行的话设置环境变量DEFAULT_DBF_ENCODING为GBK。具体做法是修改注册表项 HKEY_CURRENT_USER\Software\ESRI\Desktop10.8\Common\CodePage添加一个字符串值dbfDefault为GBK。改完后重启ArcMap。5.3 路网和水网坐标偏移几公里是投影没设现象把数据叠加到影像底图上道路整体偏移500-800米局部偏移数公里。原因shp本身是WGS84经纬度但ArcMap数据框被设置成了某个投影或者图层自身带了一个不正确的投影文件。解决右键图层属性 - 坐标系 - 选择GCS_WGS_1984。如果底图也是WGS84就不会偏移。如果底图是CGCS2000高斯投影则路网先投影到相同投影再叠加。不要用“移动图层”去硬拉位置那是伪造图上能看但不能做准确测量。5.4 建筑数据重叠、土地利用图斑空洞修复与拓扑检查现象土地利用shp有大量小洞建筑shp里同一栋楼有两个面重叠。原因原始数据采集时拓扑错误未净化或不同源数据合并后残留。解决先执行“修复几何”清空零长度要素再新建地理数据库用“拓扑”工具添加规则“不能重叠”和“不能有空洞”运行后导出错误面。如果是小洞可用“消除”工具合并。我一般设5平方米容差把小于一个地块精度的空洞填掉。5.5 用Shapechk修复损坏的shp现象ArcMap加载shp时提示“No features found”或直接报错“文件被锁定”但文件存在。原因非正常中断导致shp的索引损坏。解决使用小工具Shapechk绿色界面选择一个shp点击Check。它会指出shp的shape类型与外边界是否异常并提供Repair选项。修复后重新在ArcMap里验证。这个工具不是ArcGIS自带网上可以找到。如果找不到可以用开源工具ogr2ogr修复ogr2ogr -f ESRI Shapefile output.shp input.shp -skipfailures参数中的-skipfailures会跳过坏几何导出可用部分。这是命令行方案适合没有界面的时候。5.6 QGIS与ArcGIS打开同一份数据显示不同渲染与坐标系定义现象同一份重庆shp在QGIS里显示正常在ArcGIS里位置不对或反过来。原因QGIS会自动按数据声明重投影而ArcMap对未知坐标系直接按当前数据框处理。解决用QGIS XYZ链接使用wgs84坐标系的地图底图可以快速验证数据是否准确。在QGIS左侧浏览器 - XYZ Tiles - 添加OpenStreetMap底图将shp拖入对比。如果点位准确则问题在ArcMap的坐标系定义检查prj如果在QGIS里也不对说明shp本身坐标不准。从那以后我每次拿到数据都先在QGIS里过一遍底图再回到ArcMap做分析。6. 进阶把重庆数据做成ArcSWAT小流域分析的输入——三个验证习惯做ArcSWAT小流域分析时要用到的矢量数据包括流域边界、河网、土地利用和土壤数据。有人问“arcswat做小流域分析要用什么矢量数据”其实不只是路网更核心的是土地利用和水网。手头这份重庆数据正好具备。预处理步骤很简短把土地利用shp转成Land Use格式把水网作为stream把区县边界合并成一个大流域入口。ArcSWAT会自动根据DEM填洼、计算流向但你输入的矢量必须满足三个条件。第一个习惯DEM、河网、土地利用三者的坐标系必须完全一致。如果不一致SWAT生成子流域时会卡在“Overlay”环节。我会用第3章的投影脚本把所有图层先统一到CGCS2000_3_Degree_GK_CM_108E。第二个习惯用渔网分割shp检查覆盖。在ArcGIS里生成渔网“Create Fishnet”覆盖重庆市范围看哪些格网没有要素。如果河网shp在某个区县出现空白说明原始数据在那个区缺数据需要用周边路网补充。第三个习惯用“属性表选择行政区”而不是直接裁剪。打开行政区划shp属性表在“市”字段里选择“重庆市”导出新图层。裁剪工具选这个新图层避免把整个geo包都算进来速度提升很多。最后如果你打算用这份数据发布到Geoserver切记把shp的dbf编码统一转成UTF-8否则前端属性表中文会乱。我每次发布前都用ogr2ogr转一遍并打开属性表抽查。从那以后我拿到任何shp数据都会先执行三步右键看Source、QGIS叠底图、属性表抽查编码再做分析省下的返工时间够做好几个模型了。希望帮到你。本文还有配套的精品资源点击获取
返回列表