拓冰建站拓冰建站
首页 / 资讯中心 / 正文

GIS数据包处理:shp与json格式从解压到转换全攻略

简介青岛市行政区划GIS空间数据压缩包面向地理信息系统开发、城乡规划和地图制图人员提供一套可直接使用的基础底图数据既适合初学者认识和拆解shp、dbf、prj等常用格式也支持专业人员开展空间分析。压缩包体积仅43KB共5个文件分别采用shp、json、shx、dbf、prj五种格式。其中shp保存边界几何图形dbf记录区市名称等属性字段prj定义坐标系与投影参数shx用于空间索引加速读取json则适合Web端数据交换与前端地图展示。数据轻量且兼容性好可在ArcGIS、QGIS等主流软件中打开用于地图制作、区域面积统计、空间叠加与专题图分析目前已有688人浏览学习。获取后可快速搭建青岛市各区市边界底图也能通过叠加分析研究人口分布、交通网络、环境变化配合属性表统计面积、人口密度等指标还可作为高校GIS课程实验或规划项目初期底图的实用素材。 做GIS数据处理的人电脑里大概率都躺过几个类似“青岛市shp数据、json格式数据、shx格式数据等.zip”这种压缩包。名字取得很全shp、json、shx全都点名了乍一看拆开就能用可实际动手总会遇到一串糟心事解压出来一小堆文件不知道哪个才是“正主”拖进ArcGIS直接提示无法识别属性表打开一堆乱码坐标系还是个空的。这篇文章就把这类城市级GIS数据包讲透从shp文件族的底层逻辑、json在GIS里的真实用法到解压加载、格式互转、批量处理最后把zip报错和乱码偏移这类高频问题也一并梳理清楚。不管你是刚接触GIS的学生还是被数据整理折腾到头疼的从业者照着操作就能少踩很多坑。1. 数据包内容拆解shp家族与json格式的本质1.1 一个shp为什么是一串文件很多新手第一次解压shp数据包时都会愣住说好的一个shp文件怎么出来.shp、.shx、.dbf、.prj、.sbn、.sbx、.cpg一长串这不是打包的人粗心而是Shapefile格式从ESRI上世纪90年代设计之初就是这样——它本来就不是“一个文件”而是一组协同工作的文件集。扩展名作用是否可以缺失.shp核心文件保存要素的几何坐标必需.shx形状索引文件记录几何要素在.shp中的偏移量必需.dbf属性表文件dBASE格式要素的字段和属性值都在这里必需.prj坐标系描述文件用WKT文本记录投影或地理坐标系信息建议保留.cpg字符编码说明文件标明.dbf用的是UTF-8还是GBK等建议保留.sbn/.sbx空间索引文件由ArcGIS在创建和查询时自动生成可缺失打一个比方把一套shp数据想象成一本工具书.shp是正文.shx是目录.dbf是书后面的附表.prj是扉页上的版式说明.cpg则是告诉你这本书是用中文还是英文写的标注。缺了正文和附表信息就不完整缺了.cpg内容虽然还在但读取时会乱码缺了.prj几何数据可能还在但位置就说不清楚了。所以判断一份shp数据是否完整第一眼看这套文件是否齐全。最核心的“.shp .shx .dbf”三者缺一不可.prj尽量保留.cpg能带上最好。像“青岛市shp数据”这类正规数据包一般还会把同一套数据打成zip里面往往同时包含市县边界、乡镇街道边界以及POI点数据等不同图层图层命名通常带行政区划代码或类别标识解压后按名字区分即可。1.2 json在GIS中的身份GeoJSON与前端的桥梁数据包里同时放json格式通常是为了WebGIS或前后端数据交换准备的。JSON作为通用数据交换格式大家都很熟地理数据里对应的标准是GeoJSON——一种用JSON描述点、线、面几何对象和属性的轻量级格式。{ type: FeatureCollection, features: [ { type: Feature, properties: { name: 某街道, code: 370203000000 }, geometry: { type: Polygon, coordinates: [ [ [120.3, 36.0], [120.5, 36.2], [120.6, 36.1], [120.3, 36.0] ] ] } } ] }GeoJSON最常用的场景是Leaflet、Mapbox、Cesium这类Web地图库的渲染以及各类API接口的数据返回。桌面GISArcGIS、QGIS直接编辑GeoJSON不是长项但都能加载和转换。把GeoJSON拖进QGIS就和打开shp一样方便ArcGIS Pro也支持原生读取。反过来如果前端开发要拿shp里的数据往往需要先把shp转成GeoJSON再发布成服务或直接交给前端解析。一句话区分shp适合桌面端存储分析和传统GIS软件互通json/GeoJSON适合网页端渲染和接口交换。数据包里两个都放基本就是为了让桌面分析和Web开发拿到同一套基础边界数据各取所需。2. 拿到压缩包后的标准处理流程2.1 解压前的完整性与编码检查我之前拿到“青岛市shp数据...zip”这类包的习惯是先双击打开压缩包在不解压的情况下看看内部文件清单。重点看三件事文件大小是否合理。行政区划边界shp一般几MB到几十MB如果整个包只有几百KB那大概率不是完整数据。是否有文件夹嵌套。有的包解压后直接摊开一堆文件有的包内还有一个“青岛市”文件夹。建议统一用“解压到指定文件夹”而不是“解压到当前文件夹”避免文件散落。是否带.cpg或编码说明。没有.cpg时后续属性表中文乱码概率很高提前做好心理准备。解压工具有讲究。Windows自带的资源管理器解压大zip超过4GB或文件数量非常多时容易出现“目标路径太长”或性能问题这种场景我一般用7-Zip或Bandizip。解压路径也有讲究尽量用纯英文路径比如D:\GISData\Qingdao不要放在“新建文件夹\青岛市数据”这种带中文和空格的目录下。原因很简单ArcGIS对中文路径的兼容性虽然比旧版本好但很多Python脚本、模型构建器在遍历文件时中文路径依然会出现编码错误不如一开始就规避掉。2.2 加载进ArcGIS/QGIS的正确姿势与坐标系确认解压完成后就能直接加载了吗别急先做三件事。第一件确认坐标系。在ArcGIS Pro里添加数据后第一步永远是右键图层打开“属性-源”看“空间参考”里写的什么。如果.prj文件存在这里会显示CGCS2000、WGS84、Xian80、GCJ02等坐标系名称如果显示“未知坐标系”或“未定义”后面所有叠加分析、面积计算都可能出错。QGIS用户在图层属性里看“信息”和ArcGIS同理。青岛区域常用坐标系一般是CGCS2000或高斯-克吕格投影如果数据包没提供.prj尽量联系数据来源方确认坐标定义不要凭感觉乱猜。第二件加载数据。ArcGIS中直接把这个.shp文件拖进地图视窗即可菜单方式是在“目录”窗格连接到解压目录然后右键添加。QGIS更简单通过“图层-添加图层-添加矢量图层”或直接把.shp拖到面板里。加载时如果弹窗问“选择子图层”通常是数据里包含多个几何类型或注记类要素按需选择就行。第三件快速跑一遍属性表。右键图层打开属性表扫一眼字段和记录数确认没有乱码、没有空字段、要素数量和数据包描述一致。这是最省心的验收动作比后面做完了再发现数据不对要高效得多。3. 格式转换与批量处理实操3.1 shp与json自由互转三种落地方法场景很常见手里是青岛市shp边界Web前端想要GeoJSON或者别人给了一个GeoJSON但领导就认shp。三种方法都比较成熟。方法一QGIS图形化操作。加载shp右键图层-导出-另存为格式选GeoJSON指定文件名和坐标系就完成了反向操作同理。QGIS对中文兼容好适合不想写代码的人也是我最推荐的方式。方法二ArcGIS的转换工具。ArcGIS Pro提供“地理处理-转换工具-转为JSON”和“JSON转要素”两个工具功能上是可靠的但要注意ArcGIS转出来的JSON是它自己的Esri JSON格式不是标准GeoJSON。如果目标是给Web开发用建议用“导出要素”对话框里的GeoJSON选项或者干脆用QGIS或Python省得绕弯子。方法三Python的geopandas适合批量转换和自动化流程。import geopandas as gpd # shp转GeoJSON gdf gpd.read_file(D:/GISData/Qingdao/qingdao_district.shp) gdf.to_file(D:/GISData/Qingdao/qingdao_district.geojson, driverGeoJSON, encodingutf-8) # GeoJSON转shp gdf2 gpd.read_file(D:/GISData/Qingdao/qingdao_district.geojson) gdf2.to_file(D:/GISData/Qingdao/qingdao_district_new.shp, encodingutf-8)需要注意三点。第一to_file时不指定driver会按扩展名推断第二shp的字段名被限制在10个字符以内太长的字段在转换时会自动截断GeoJSON则没有这个限制第三编码务必指定utf-8否则中文属性大概率乱码。3.2 结合热搜扩展批量裁剪、渔网分割、3dtiles、kml/dwg转换热搜词里有一大串和shp相关的操作挑几个高频场景展开都是拿到青岛市这类市级边界后经常要做的。先讲“arcgis根据shp批量裁剪影像”。市级行政区数据经常要配合影像图用。单要素裁剪很简单用“按掩膜提取”或“栅格裁剪”工具就行要按每个区县边界分别裁出对应的影像得用模型构建器加迭代器。操作思路构建一个ModelBuilder放一个“迭代要素选择”迭代器输入shp图层迭代器前面接“裁剪”工具后面接“复制栅格”输出把输出路径字段设为内嵌变量跑一次就能每个区县自动生成一张裁剪影像。关键点在于输出路径命名要引用区县名称字段否则后一张会覆盖前一张。再讲“渔网分割shp”这是把大范围数据按网格切碎的高频操作。ArcGIS的“创建渔网”工具可以生成自定义大小的格网比如500m乘500m。生成渔网后用“按空间位置选择”把每个格网内的待分割要素选出来再导出成独立shp如果数据量大同样建议用模型构建器或Python脚本批量执行。典型用途是分块处理POI数据、分块发布服务或分块做空间统计每一步结果都保留原始属性便于后续合并。“shp转3dtiles”这两年非常火尤其城市白模、建筑体块展示。思路分两路一是用商业工具CesiumLab导入shp要求shp带高度字段或楼层数属性内部有高度拉伸逻辑输出3dtiles目录之后可直接放Cesium加载二是开源方案用py3dtiles或通过PostGIS和Cesium生态链实现。需要特别提醒普通shp里如果有大范围面要素直接转3dtiles会导致模型体量巨大需先化简几何再按LOD分层处理不然前端会卡成PPT。“kml转shp”和“dwg转shp”也常被问到。kml转shpQGIS直接打开kml文件-打开右键导出为shpArcGIS里用“KML转图层”工具输出的是一个图层组要再右键导出。注意KML默认是WGS84坐标转本地投影坐标系时要做一次投影转换。dwg转shpArcGIS用“CAD转地理数据库”工具一步到位CAD里的注记会变成点要素图层名、线型、块名会保留在字段里QGIS可以先用“导入DWG”或借助ODBC连接但复杂图纸还是ArcGIS更稳。3.3 shp转txt与坐标报备场景热搜词里“shp转txt”“shp转txt插件国土报备”指向的是土地报批、勘测定界场景。这类业务里经常需要把项目区边界坐标以txt文本形式上报不同地区模板还不一样有“点号, X, Y”的有“J1, X1, Y1”的还有带小数位限定的。做法不复杂先在属性表里添加X字段和Y字段右键字段计算器选“计算几何”分别算取每个要素的重心点坐标或折点坐标再把属性表全选复制到Excel拼成目标模板格式后另存为txt。如果要求的是边界折点坐标那就要把面转成线再转成点然后在点图层上计算X、Y。量大时建议直接写Python脚本遍历要素几何把每个环的坐标按顺序输出步一步可控且不容易漏点。最关键的还是先对着报备要求文档核对数据格式别辛苦导出来再被窗口打回来。4. 常见问题与排查技巧实录4.1 zip解压报错“could not find EOCD”的排查流程热搜里那句“导入失败caused by: invalid zip archive: could not find eocd”我见过太多次了。EOCDEnd of Central Directory Record是zip文件末尾的中央目录结尾标记相当于zip的最后一道“封条”。报这个错几乎都是同一个原因文件没有下载完整或者文件根本不是zip。排查就三步用十六进制工具如HxD打开文件看开头两个字节。zip文件头固定是“PK”十六进制50 4B如果文件头不是PK这文件大概率是网页下错、网盘下成html或txt改名重新下载即可。看文件大小和来源站标注是否一致。很多网盘下载器会把文件截断尤其是超过2GB的大包。用7-Zip“测试压缩包”功能能通过基本就没问题不能通过就重下不要尝试在损坏基础上硬解容易解出半残数据后面加载反而莫名报错。4.2 属性表中文乱码与坐标系偏移乱码的本质是编码不匹配。shp属性表.dbf默认的字符集在Windows中文系统下ArcMap会偏向GBK读取但很多新整理的数据包用的是UTF-8两下一对就乱。解决路径有两类QGIS方案设置-选项-数据处理-要素属性把“属性表数据源编码”改为UTF-8或GBK重新加载数据即可。 ArcGIS方案ArcMap老版本需要改注册表CodePage路径是HKEY_CURRENT_USER\Software\ESRI\Desktop10.x\Common\CodePage加一个dbf_default字符串值并填UTF-8用ArcGIS Pro的话通常在选项里设置DBF默认编码即可。坐标系偏移是另一类高频问题表现是要素能加载但和底图、影像叠加时位置差几十到几百米。原因基本是.prj缺失或者数据本身是WGS84但被当成了CGCS2000。处理思路先用“定义投影”工具把数据匹配到真实坐标系再用“投影”工具转到目标坐标系。切忌对未定义的数据直接做投影转换那等于一层错导二层错。4.3 关于密码保护zip与数据安全提示热搜里有“zip压缩包密码破解工具”“zip密码移除”这类词这里多说一句。如果数据包本身加了密码正规路子是先找数据来源方要解压密码很多数据交换项目都会通过线下渠道提供密码。网上所谓的“密码破解工具”一方面成功率很低另一方面有安全风险——这类工具的安装包经常捆绑木马和广告程序为解一份数据搭进去一台机器完全不划算。拿到内部数据包后也要注意不要随意把没有加密的shp/json数据传到公网网盘边界数据和敏感点位数据一旦泄露影响比丢个文档大得多。最后分享一点我的个人习惯每次拿到“XX市shp数据、json格式数据等.zip”这种包我都会先建一个固定模板文件夹里面分“原始数据”、“处理后数据”、“转换结果”三个子目录压缩包原样保留在“原始数据”解压出来的标准数据放“处理后数据”做实验、裁剪或转换后的结果再单独放“转换结果”。这套习惯看起来不起眼但在项目周期长、数据版本变动频繁时能帮你少掉很多头发。希望这篇内容能让你在处理城市级GIS数据包时顺利不少。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门