尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

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

陕西各级公路shp处理全攻略:坐标系、乱码、裁剪与3dtiles转换

陕西各级公路shp处理全攻略:坐标系、乱码、裁剪与3dtiles转换 简介在GIS数据处理中shapefileshp是最常见的矢量数据格式之一尤其在路网规划、物流可达性分析和专题制图等工程应用中掌握其底层原理与处理技巧至关重要。面对陕西各级公路shp数据许多初学者常因坐标系缺失、属性编码乱码或文件结构不完整而陷入困境。本文从shp文件的多文件构成与属性编码机制切入系统讲解如何识别和修复坐标系如CGCS2000、WGS84解决中文乱码与cpg文件缺失问题并延伸至按省界裁剪、按属性拆分、shp转3dtiles、shp转CAD、shp转txt等高频操作场景。无论是ArcGIS还是QGIS用户都能从中建立一套从数据预处理到三维可视化的完整技术路径减少踩坑提升路网数据的使用效率。 做GIS的人应该都懂这种尴尬拿到一份陕西各级公路shp文件以为双击打开就能开干结果要么属性表里一堆乱码要么图层直接跑到非洲西海岸要么按省界一裁剪路网断成了几千段。这份数据本身的价值其实很高高速公路、国道、省道、县道、乡道摆得明明白白能做路网规划、物流可达性分析、专题制图甚至还能转成3dtiles丢到三维地球里。但你要是没把坐标系、编码、属性结构这些底子收拾干净后面每一步都在给前面的坑填土。这篇就围绕陕西各级公路shp文件从数据构成、坐标处理、裁剪拆分到转3dtiles、转CAD、转txt这些高频操作完整捋一遍。不管你是ArcGIS老手还是QGIS新手只要跟路网数据打过交道这篇文章都值得花十分钟看完。1. 陕西各级公路shp到底是什么值得折腾吗1.1 公路分级在数据里怎么体现先搞清楚各级公路这四个字。常规的陕西路网数据会把道路分成几个等级高速公路、国道、省道、县道、乡道再往下还有村道。实际操作中这些级别会以两种形式存在一种是一个图层里放所有道路属性表里用一个字段区分等级字段名可能是等级TYPECLASSROAD_TYPE值可能是汉字、拼音缩写或者数字代码。另一种是每个等级单独一个shp图层比如文件命名是陕西省高速.shp陕西省国道.shp这种反而省事导入的时候一眼就知道是什么。如果数据来自OpenStreetMap这类开放数据源字段又不一样了。OSM里常用highway字段存道路类别motorway对应高速trunk对应国道或城市快速路primary对应省道或者重要干线secondary对应县道tertiary对应乡道。这里要注意OSM的分类是按国际习惯来的跟国内五级体系不是严格对应转出来之后最好再结合ref字段道路编号比如G30、S107一起判断。我拿到这种数据第一步永远是打开属性表统计一下等级字段的分布看看到底有几种值再决定后续怎么处理。还有一种情况是数字代码比如1高速、2国道、3省道、4县道、5乡道。如果数据说明书丢了这种就要小心别把数字当成普通数值直接用建议新建一个文本字段用字段计算器做一遍映射把代码转成中文符号化的时候会舒服得多。1.2 shp文件不是“一个文件”我见过太多只拷贝一个.shp文件给别人的人。shapefile说是“一种格式”实际上是一组文件的集合缺哪一个都会出幺蛾子。一个完整的陕西公路shp数据包至少应该包含这几个文件文件名后缀作用缺少时会怎样.shp要素几何信息线、面、点都在这不叫shapefile打不开.shx几何索引帮助软件快速定位要素可能能打开但性能差.dbf属性表数据公路名称、等级都在这里地图有了属性全没了.prj坐标参考系描述软件不认坐标系经常显示到错误位置.cpg属性表字符编码标识如UTF-8、GBK中文属性大概率乱码.sbn / .sbx空间索引可选大数据量操作变慢.xml元数据可选不影响使用但丢失元数据这里我想重点说的是.cpg。很多人不知道这个文件是干嘛的也没关注过但陕西公路shp里的道路名称、等级这些中文属性乱不乱码基本就看它。ArcGIS在读取dbf的时候如果找不到.cpg文件会按照系统默认语言环境来猜编码简体中文Windows上一般是GBK。如果实际dbf存的是UTF-8那属性表里看到的就全是锟斤拷。这个问题我后面专门写一节怎么处理。另外.prj文件丢了也是大麻烦。陕西的坐标范围大概在东经105度到111度、北纬31度到39度附近如果图层显示坐标是上百、上千的值说明是经纬度如果是几百万、几千万的值说明是投影坐标。判断完才能补坐标系不能瞎指一个。2. 开工第一步坐标、编码和属性表的收拾2.1 坐标系选错后面的分析全白搭陕西各级公路shp拿到手后第一件事不是急着做符号化而是看坐标系。很多项目的痛苦都源于坐标参考系不一致不同来源的shp叠加在一起差了几百米路网对不上行政边界后续做缓冲区、做叠加分析全是错的。国内常用的坐标系就那几个CGCS2000国家大地坐标系2000当前国内官方基准大部分新鲜数据都是它。WGS84全球定位系统用的经纬度值跟CGCS2000几乎一致但严格说有微小差异。西安80老数据常见跟CGCS2000差几十米到上百米不能直接叠加。Web墨卡托EPSG:3857互联网地图常用做看图和Web展示没问题但算面积、量长度误差很大。处理思路也简单先看.prj文件如果缺失或错误就用Define Projection工具重新指定。但这里有个前提——坐标数值本身必须是正确的如果坐标系丢了坐标数字没变那指定正确坐标系就好了如果坐标系被强行设成另一个坐标数字也跟着变了那得用Project或者Transform工具转换回去不是Define一下就能解决。对于陕西这种南北跨度较大的省份真要算路网密度、道路里程我建议转成适合的投影坐标系。常用的有高斯-克吕格投影西安周边用CGCS2000 3度带中央经线108度或111度具体看数据覆盖区域。如果是做全省展示也可以用Albers等积投影这样算面积不会偏太多。千万不要拿Web墨卡托直接统计长度那个误差在陕西这个维度上能大到让你怀疑人生。2.2 中文乱码和cpg文件的坑乱码这个事几乎每个处理陕西公路数据的人都会碰到。表现就是属性表里公路等级、名称全是锟斤拷烫烫烫只能用拼音和数据字典去猜。排查思路是这样如果身边有QGIS先把shp拖进去看右下角编码设置。如果图层属性显示编码UTF-8但乱码就切成GBK试试反之亦然。QGIS里右键图层选图层的属性然后改编码设置马上能看到变化。找到编码正常的那一个直接把图层另存为一个新的shpQGIS会自动生成.cpg文件新的shp用QGIS设的编码保存后面ArcGIS打开就没问题了。如果只有ArcGIS也不想装QGIS可以尝试用特性类转储选择“地理数据库”作为输出有时候能绕开编码问题但并不能根治dbf编码本身。经验之谈最好在数据入库的时候就直接统一成UTF-8并且确保shp旁边有.cpg文件写上UTF-8。这样不管在ArcGIS还是QGIS里至少在编码上少折腾一次。还有一点dbf的字段长度是有限制的以前很多数据源在创建字段时用默认长度10中文道路名称放不下导进去就截断了。建议添加字段时文本长度直接给50到100路上名字再长也够了。如果已经截断那就只能按fclass、编号等字段反查补全。2.3 按陕西边界裁剪和按字段拆分拿到一份覆盖整个西北甚至全国的路网shp时需要先提取出陕西部分。这个操作看起来简单但里面有讲究。优先推荐属性筛选而不是直接裁剪。如果属性表里有省份字段直接按省份陕西查询导出要素这样道路在省界处不会被打断。裁剪工具Clip是针对几何的会把跨越边界的路在省界处切断产生一堆碎段之后统计里程会出现很多不合理的短小线路。当然很多时候手头的数据没有省份字段那就只能用边界去裁。这里我习惯用陕西省界的矢量面做clip。裁完以后建议马上检查一下属性表看看有没有大量长度异常的短线段。如果有可以做一步dissolve按道路编号或名称字段合并把碎线粘回去。再说拆分。热搜里老有人问arcgispro怎么把shp拆分其实拆分场景很多比如按地市把陕西公路拆成各个市的独立shp或者按公路等级拆成高速、国道、省道单独一个文件。按属性拆分ArcGIS Pro里可以直接用Split By Attributes工具选一个字段作为拆分标准自动批量输出多个要素类。按图形拆分比如按地市边界可以用Select By Location Export Features循环或者用ArcToolbox里的Split按要素拆分输入路网图层和面图层它会按面要素把线切碎又会产生切边问题。QGIS里更简单用“按字段分割矢量图层”工具批量导出到文件夹。有一点要提醒拆分前最好先备份原始数据。拆分过程中一旦坐标系、属性、字段名出了问题找原始文件重新来比修修补补要省事得多。3. 把公路shp玩出花3dtiles、CAD、txt、SU全流程3.1 shp转3dtiles路网数据上三维地球最近很多人在问shp转3dtiles因为项目汇报、展示都开始卷三维了。陕西省各级公路shp转3dtiles核心问题在于shp是二维线数据而3dtiles是三维场景里用的必须给线一个“高度”和“体量”才能看得见。常规做法在ArcGIS或QGIS里先把线要素转成带高度的三维线或者先做道路缓冲面把线变成面再给面一个拉伸高度。用CesiumLab这类工具直接转换shp到3dtiles工具会自动把矢量转成gltf几何体并且保留属性字段方便CesiumJS里点击查询。如果没有CesiumLab也可以用开源的3d-tiles-tools但路径比较折腾先转geojson再转b3dm。非开发人员不推荐。这里有三个实操要点分等级转换高速、国道、省道最好分开转或至少在属性表里保留等级字段这样在三维场景里能按等级设置颜色、线宽甚至做LOD分层显示。属性精简陕西全省道路的属性字段可能特别多转3dtiles之前建议把没用的字段删掉只保留编号、名称、等级、里程这些关键信息。属性字段越多生成的3dtiles越大加载越慢。坡度问题公路是沿地形走的如果只是平铺在地表在Cesium里会跟地形产生穿模。最好带高程数据或者使用Cesium的地形贴合功能让线跟着地形起伏。我个人的建议是如果只是做演示不用追求一次生成全省所有的路网先拿高速和国道做一版体量小加载快效果也足够惊艳。3.2 批量shp转CAD跟规划对接不费劲做路网规划、施工图交底、规划评审的时候甲方和设计院经常要求提供CAD文件这时候就要把shp转成dwg或dxf。很多人第一次转CAD导出来一看图层全乱了道路线宽也没了坐标也不对。用ArcGIS转CAD路径是ArcToolbox Conversion Tools To CAD Export to CAD。这个工具支持同时选多个shp图层一起导出正好满足“批量多个shp转cad”的需求。但要在导出前做三件事设置好坐标系导出结果会继承图层的坐标系如果shp没有.prjCAD里打开后坐标就是未知或错误的。建议先定义好投影再导。设置图层字段CAD的图层名可以用属性字段控制。比如原始shp里有个字段叫“等级”值是高速、国道、省道你可以在导出设置里把“等级”字段映射为图层名这样CAD中自然分好图层不用后期手动分色。关闭不需要的符号系统ArcGIS导出CAD不会完全保留线型、线宽它更偏向把几何结构带过去。线宽、颜色可以在CAD里用图层或对象属性批量调整。QGIS用户转CAD更简单图层右键导出格式选AutoCAD DXF然后勾选“使用符号图层符号”。这个选项会把你在QGIS里配好的符号颜色、线宽导出到DXF里虽然有时候会有小瑕疵但总体比ArcGIS更贴合设计师需求。还有个小技巧如果甲方只接受dwg不接受dxf你还需要用CAD再打开dxf另存为dwg或者用转换工具批量转。别急着说做不到这个流程很成熟。3.3 shp转txt坐标提取和野外放样热搜里还有个高频问题“shp转txt”。这个需求通常来自两拨人一拨是搞测量的需要把陕西省公路的控制点坐标导成txt格式放到全站仪或RTK手簿里另一拨是做数据分析的想快速拿到坐标点列表做其他程序处理。先说通用方法给shp的线要素提取折点然后输出文本。ArcGIS里可以这样用Feature Vertices To Points把线要素的所有折点转成点要素。为点要素新增X、Y字段用计算几何Calculate Geometry把每个点的经纬度或投影坐标写进字段。用Table To Text工具导出txt或者用Excel中转再另存为txt。如果是“测定界 shp 转 txt 工具.tbx”这种专业需求一般是勘测定界软件里自带的工具专门处理界址点、界址线的坐标提取并按照默认格式输出点名、纬度、经度。这类工具还能自动识别圆弧点、界址点号等信息。如果你手头没有这个工具用Python写个ArcGIS工具箱也完全可行核心就是遍历要素几何的每个顶点格式化输出。对于陕西公路shp来说转txt还有一个常见变种把道路的桩号、里程、坐标一起输出。这时可以先用Locate Features Along Routes工具把线要素和路由关联起来再按距离采样点坐标最后导出。做道路病害分析时这个功能特别好用。3.4 顺手解决shp导入SU和渔网分割“su怎么导入shp”这个热搜也是老问题了。SketchUp本身不直接支持shp但可以通过DXF、KML等格式中转。我常用的路径是shp转DXF在SU里选择导入DWG/DXF格式导入时单位选米坐标值大了要先平移到原点附近。因为陕西公路shp的投影坐标动辄几百万米SU对这种大坐标数字容易产生建模精度问题。做法是先在GIS里把要素整体平移使坐标落在原点附近建模完再整体移回去。如果你要建模的是道路缓冲区、道路断面最好先在GIS里用Buffer生成道路面再转DXF比SU里面自己描线要准得多。至于“渔网分割shp”这其实是空间统计里一个非常常见的操作。比如想分析陕西各区域的道路密度先生成1公里乘1公里的渔网格网然后用Intersect把公路线和网格相交最后按网格统计道路长度。这样就能做出一张路网密度热力图。注意渔网范围要跟陕西省界重叠裁剪掉没用的网格统计长度的时候一定要用投影坐标系否则长度全是错的。4. 我踩过的坑陕西公路shp常见问题排查手册4.1 打开shp一片空白先查prj不管是ArcMap还是ArcGIS Pro打开shp后地图窗口什么都没有第一反应不要觉得数据坏了。这种情况八成是坐标系信息丢失或者数据本身没有在正确范围内。排查方法很简单右键图层选择“缩放到图层”Zoom to Layer看视图跳到哪。如果停在(0,0)附近说明没有有效的坐标参考系或者数据几何坐标本身就是无效的。打开属性表看看要素总有几个。如果属性表有几百行但地图上不显示大概率是几何坐标异常比如Z值不可用、坐标过大或为空。要是确认几何坐标没问题只是坐标系丢了就用Define Projection工具根据坐标范围判断正确坐标系。陕西公路shp经纬度范围大致在东经105到111度、北纬31到39度投影坐标一般是六位到七位的数值。注意如果你不懂坐标系别乱指定先找数据来源的说明文件或者用QGIS打开看它的当前CRS让QGIS做“自动猜测”也比瞎选稳。4.2 没有cpg文件中文变乱码这个话题前面提过两次但因为它太经典了值得专门放一条排查记录。症状属性表里的道路名称、等级字段全是“锟斤拷”、“問题”之类的乱码但数字和英文正常。原因dbf文件内存储的字符串是UTF-8编码ArcGIS因为找不到.cpg默认按本地代码页GBK解析两边一错位就变乱码。解决用QGIS打开shp右键图层 属性 数据源 图层编码切换成UTF-8如果正常再在QGIS里另存一份确保生成.cpg文件。如果只有ArcGIS可以试着手动创建一个.cpg文本文件文件名和shp同名后缀.cpg内容就是UTF-8。右键编辑保存为无BOM的UTF-8放到shp同目录。这个方法能在很多情况下让ArcGIS正常读取但也不保证100%。如果数据已经入库到地理数据库gdb编码问题就不存在了gdb对Unicode支持很完善。我的建议是做项目之前统一把来源shp全部转成gdb或GeoPackage格式别再跟一串. shp、.shx、.dbf、.cpg较劲。4.3 裁剪后碎线太多里程统计失真陕西公路shp跟行政边界做裁剪时碎线问题特别突出。原因很简单一条高速跨越多个县或市用面边界去裁线每个县边界都会在公路上切一刀。切出来的结果虽然每条线都在某个县界内但汇总全县道路里程时你会发现很多路段长度只有几十米甚至几米全是切出来的边角料。几个解决办法不用Clip改用Select By Location选择“与边界相交”或者“完全位于边界内”的道路要素直接导出不切几何。缺点是有部分跨越边界的公路会被整体归属于某个县看你要什么效果。裁剪后用Dissolve融合按道路编号或名称合并几何这样县界处的小段会重新拼成整条路然后再做后续面积计算和里程统计。干脆用“线转路由”再加动态分段把道路按真实里程建立路由在任意点截取里程不破坏原始线。日常做陕西全省路网统计我一般先用属性筛选全省高速、国道、省道再按区县做空间连接这样既保留完整线又能统计出每个区县包含哪些路段比直接裁剪可靠得多。4.4 加载超慢要素太多怎么优化陕西全省各级公路shp如果包含村道要素数量动辄几十万条普通电脑打开和缩放能卡到心态爆炸。这里分享几个我实测有效的优化习惯建空间索引右键shp的文件夹在ArcCatalog或Pro里计算空间索引能明显加快浏览速度。使用定义查询在图层属性里设置定义查询比如只显示等级高速或国道减少屏幕绘制量。切分数据按地市或按等级拆成多个shp日常操作只加载需要的部分而不是一上来就全量加载。换成GeoPackage或File Geodatabase同样的要素gdb的读取效率比shp高不是一个量级尤其是缩放平移时。强烈建议把常用的陕西公路数据导入gdb或者GeoPackage再干活。QGIS下还可以开启“仅绘制可见区域”或使用矢量瓦片但大部分时候前面的方法已经够用了。数据量大不能省判断是卡在渲染还是卡在查询。如果只是符号化卡就简化符号如果是每次点选、框选都卡多半是没建索引。我做陕西路网分析这几年最深的一点体会就是拿到陕西各级公路shp之后不要急着出图先花十分钟检查坐标系、编码和字段结构。这三样东西过关了后面不管是裁剪、拆分、转3dtiles还是转CAD都顺畅很多。尤其是cpg和prj这两个小附件平时不显眼丢了一个就能让你折腾半天。如果你在消化这套流程的时候还遇到其他奇奇怪怪的问题欢迎按照这篇里的思路再走一遍大概率能定位到具体是哪一步出了岔子。本文还有配套的精品资源点击获取
返回列表