简介这份资源是面向GIS初学者、地理信息专业学生及城市规划从业者的青岛市区域划分地理数据包可用于地图制作、空间分析与规划决策等场景。压缩包共5个文件约43KB包含shp主数据文件存储几何形状、dbf属性表记录行政区域名称等信息、prj投影文件定义空间参考系统、shx索引文件加速数据读取以及json格式数据便于网络传输与程序交互各文件配套使用可完整描述青岛地理对象及其属性。目前已有689人学习下载。读者可借助ArcGIS、QGIS等软件直接打开处理开展人口分布、交通网络、环境变化等叠加分析也可结合json数据与Web应用交互展示动态地图服务是理解GIS多格式协作与空间数据组织方式的实用入门素材。1. 青岛市 shp 数据、json 格式数据、shx 格式数据等.zip拿到压缩包之后先别急着解压你从某个渠道拿到一个名为「青岛市shp数据、json格式数据、shx格式数据等.zip」的压缩包双击之后大概率会看到一堆同名不同后缀的文件.shp、.shx、.dbf、.prj可能还混着.json、.cpg。很多人第一反应是「shp 文件下载到手了直接拖进 ArcGIS 打开就行」结果要么提示缺少投影、要么属性表全是乱码、要么干脆打不开。问题不在数据本身而在于 shp 从来不是单个文件它是一组必须成套出现的文件集合zip 只是把它们打包在一起。这篇笔记就围绕这个压缩包讲清楚三件事shp/shx/json 各自是什么、怎么正确解压和校验、怎么在 ArcGIS Pro、QGIS 和代码里把它跑通以及那些让人翻车的坑。适合刚接触 GIS 矢量数据、需要把青岛市行政边界或 POI 落到地图上的从业者。2. 先搞懂 shp、shx、json 到底谁是谁拆开压缩包看文件家族2.1 shp 不是「一个文件」而是一套必须成套的矢量格式Shapefile 是 ESRI 在上世纪 90 年代定的一套格式它的设计思路是「一个几何文件配一堆辅助文件」。你解压后看到的.shp只存几何形状点、线、面它自己单独存在时是残缺的。真正让一份数据能用的是下面这套组合后缀作用缺失后果.shp存储几何图形坐标串没有几何什么都画不出来.shx几何索引记录每个要素在 shp 中的偏移部分软件能靠重建索引打开但大文件会报错.dbf属性表存字段和记录打开后没有属性只剩空壳图形.prj投影坐标系定义WKT 文本坐标数值还在但不知道是什么坐标系叠加会错位.cpg属性表字符编码如 UTF-8、GBK中文属性乱码所以标题里单独点出「shx 格式数据」是有道理的——.shx缺失是 shp 打不开的高频原因之一。判断一份 shp 是否完整最直接的办法是看同名文件是否齐全。青岛市这种市级行政边界数据通常还会带.sbn、.sbx空间索引有更好没有也能用。2.2 json 格式数据在 GIS 里通常指 GeoJSON别和普通 json 搞混压缩包里如果带.json在 GIS 语境下大概率是 GeoJSON——一种用文本描述地理要素的格式结构上就是标准 JSON只是遵循了 GeoJSON 规范。它和 shp 的核心差别在于GeoJSON 把几何和属性写在同一个文件里天然自包含不需要配套文件坐标系默认是 WGS84EPSG:4326。这也是为什么热词里「json转shp网站」「shp转json」搜索量一直很高——两者互转是日常操作。一个最小的 GeoJSON 长这样{ type: FeatureCollection, features: [ { type: Feature, properties: { name: 市南区, code: 370202 }, geometry: { type: Polygon, coordinates: [[[120.38, 36.06], [120.40, 36.06], [120.40, 36.08], [120.38, 36.08], [120.38, 36.06]]] } } ] }FeatureCollection是要素集合features数组里每个Feature由properties属性和geometry几何组成。注意坐标顺序是「经度, 纬度」和很多人直觉相反写反了图形会跑到南极去。2.3 为什么青岛市这类数据会同时给 shp 和 json 两种格式这不是冗余而是面向不同使用场景。shp 是桌面 GISArcGIS、QGIS和很多规划、国土系统的通用交换格式字段类型严格、体积小json/GeoJSON 是 Web 地图Leaflet、Mapbox、ECharts和前后端接口的常用格式浏览器和 JavaScript 直接能读。同一份青岛市边界做桌面制图用 shp做网页可视化用 GeoJSON各取所需。理解了这一点你就知道解压后不该只留 shp 而把 json 删掉。3. 解压与完整性校验从 zip 到能打开的 shp 只差这几步3.1 用命令行解压并检查文件是否成套Windows 上很多人用「压缩为 zip」右键菜单但遇到中文文件名或加密包容易出问题。稳妥做法是用命令行。Linux/macOS 下# 解压到指定目录-O 指定编码避免中文文件名乱码 unzip -O GBK 青岛市shp数据、json格式数据、shx格式数据等.zip -d qingdao_data # 列出解压结果确认 shp/shx/dbf/prj 是否同名成套 ls -l qingdao_dataWindows 的 PowerShell 里可以用Expand-Archive -Path 青岛市shp数据.zip -DestinationPath qingdao_data -Force Get-ChildItem qingdao_data | Select-Object Name, Length-O GBK是关键参数很多国内数据包用 GBK 编码打包不加这个参数解压出来的中文文件名会变成乱码。解压后重点看同名.shp和.shx、.dbf是否都在.prj是否存在。如果只有.shp没有.shx先别删后面有补救办法。3.2 用 ogrinfo 快速体检比打开 ArcGIS 快十倍装好 GDAL 之后ogrinfo是检查矢量数据最省事的工具不用启动笨重的桌面软件# 查看数据概览图层名、几何类型、要素数量、坐标系 ogrinfo -so -al qingdao_data/qingdao.shp # 只看坐标系 ogrinfo -so qingdao_data/qingdao.shp qingdao | grep -i PROJCRS\|GEOGCRS\|EPSG-so表示只输出摘要不输出要素-al表示所有图层。输出里重点看三行Geometry是 Polygon 还是 Point、Feature Count要素数量对不对、Layer SRS坐标系是什么。如果Layer SRS显示unknown说明.prj缺失或损坏需要手动指定坐标系青岛市数据一般是 CGCS2000 或 WGS84。3.3 缺失 shx 时的重建办法如果压缩包里真的只有.shp没有.shx别慌QGIS 和 GDAL 都能重建索引。用 QGIS 打开时它会提示「缺少 shx是否重建」点确认即可。命令行下可以用# 用 ogr2ogr 重新导出一次会自动生成配套的 shx ogr2ogr -f ESRI Shapefile qingdao_fixed.shp qingdao_data/qingdao.shpogr2ogr读原文件、写新文件写的过程中会补齐.shx、.dbf、.prj。这是处理残缺 shp 最通用的手段比手动找文件靠谱。注意如果原.dbf也缺失导出的就只有几何没有属性需要另找属性数据。4. 在 ArcGIS Pro、QGIS 和 Python 里把青岛市数据跑起来4.1 ArcGIS Pro 里加载 shp 并处理坐标系ArcGIS Pro 加载 shp 很直接Catalog 面板里定位到解压目录把.shp拖进地图即可。但有两个高频问题。第一如果.prj缺失Pro 会按地图当前坐标系强行显示图形位置可能偏到几千公里外。解决办法是右键图层 → Properties → Source看坐标系是否为 Unknown然后用 Define Projection 工具手动指定。第二热词里「arcgispro shp合并」很常见——青岛市下辖多个区市如果数据是按区拆分的多个 shp用 Merge 工具合并Geoprocessing → Merge Input Datasets: 选中所有区市 shp Output Dataset: qingdao_merged.shp Field Map: 确认各区字段能对齐字段名不一致的会丢属性Merge 之前务必检查各文件的字段结构是否一致字段名不同会导致合并后属性错位这是血泪经验。4.2 QGIS 里做投影转换和格式导出QGIS 免费且对坐标系处理更宽容。加载后如果发现图形位置不对右键图层 → Export → Save Features As在 CRS 下拉里选目标坐标系比如从 CGCS2000 转到 WGS84Layer → Save As Format: ESRI Shapefile 或 GeoJSON CRS: EPSG:4326 - WGS 84 File name: qingdao_wgs84.geojson导出成 GeoJSON 后就能直接喂给前端地图库。QGIS 的「另存为」本质上就是一次重投影加格式转换比在 ArcGIS 里找 Project 工具更顺手。注意导出 GeoJSON 时如果属性里有中文编码选 UTF-8否则网页端会乱码。4.3 用 Python 读取 shp 和 json 并做互转代码里处理矢量数据主流是geopandas底层依赖 GDAL。读取和转换import geopandas as gpd # 读取 shp注意指定编码中文属性常用 GBK 或 UTF-8 gdf gpd.read_file(qingdao_data/qingdao.shp, encodingutf-8) # 查看坐标系和字段 print(gdf.crs) print(gdf.columns.tolist()) print(gdf.head()) # 如果坐标系缺失手动指定青岛市常用 CGCS2000EPSG:4490 if gdf.crs is None: gdf gdf.set_crs(epsg4490) # 转成 WGS84 并导出 GeoJSON gdf_wgs84 gdf.to_crs(epsg4326) gdf_wgs84.to_file(qingdao.geojson, driverGeoJSON, encodingutf-8)read_file的encoding参数决定属性表中文是否乱码读出来乱码就换gbk再试。set_crs是「声明」坐标系to_crs是「转换」坐标系两者别搞反——对没有.prj的数据用to_crs会直接报错必须先set_crs声明再转。导出 GeoJSON 时driverGeoJSON固定写法encodingutf-8保证网页端正常显示。4.4 用 json 转 shp 的两种路径热词里「json转shp网站」搜索很多但线上转换工具对数据量和隐私都不友好本地做更稳。如果 json 是 GeoJSON直接用 geopandasimport geopandas as gpd # GeoJSON 转 shp gdf gpd.read_file(qingdao.geojson) gdf.to_file(qingdao_from_json.shp, driverESRI Shapefile, encodingutf-8)如果 json 不是标准 GeoJSON而是自定义结构比如坐标存在lng/lat字段里需要先构造几何import geopandas as gpd import pandas as pd from shapely.geometry import Point df pd.read_json(points.json) # 假设字段是 lng 和 lat geometry [Point(xy) for xy in zip(df[lng], df[lat])] gdf gpd.GeoDataFrame(df, geometrygeometry, crsEPSG:4326) gdf.to_file(points.shp, driverESRI Shapefile, encodingutf-8)关键点是crsEPSG:4326必须显式指定否则导出的 shp 没有.prj别人拿到又得猜坐标系。这一步是很多人转完发现「位置对不上」的根源。5. 避坑与排查青岛市 shp 数据最常见的 5 个翻车现场5.1 打开后图形跑到国外或空白现象把 shp 拖进 ArcGIS 或 QGIS地图上什么都看不到或者图形出现在非洲西海岸附近。原因坐标系缺失或错误软件按默认坐标系解释坐标数值。解决先用ogrinfo -so看Layer SRS如果是 unknown用 Define Projection 指定为 CGCS2000EPSG:4490或 WGS84EPSG:4326再重新加载。青岛市经度约 120°、纬度约 36°如果图形出现在 0° 附近基本就是坐标系没定义。5.2 属性表中文全是问号或方块现象打开属性表name字段显示成????或乱码。原因.dbf的编码和软件读取时用的编码不一致国内数据常见 GBK 被当成 UTF-8 读。解决在 QGIS 里右键图层 → Properties → Source → Data Source Encoding改成 GBK 或 UTF-8 试代码里read_file加encodinggbk。如果.cpg文件存在打开看里面写的是什么编码以它为准。5.3 只有 shp 没有 shx软件报「无法打开」现象ArcGIS 提示「Could not open the specified file」或「缺少索引文件」。原因.shx缺失软件无法定位几何记录。解决用 QGIS 打开触发自动重建或用ogr2ogr重新导出一次生成配套文件。如果连.dbf都没有导出的只有几何属性需要另找来源。5.4 多个区市 shp 合并后属性错位现象Merge 之后某些要素的name变成了别的区的名字。原因各 shp 字段顺序或字段名不一致Merge 按位置匹配字段。解决合并前用ogrinfo -so逐个检查字段列表字段名统一后再合并或者在 geopandas 里用pd.concat手动对齐列名import geopandas as gpd import pandas as pd files [shinan.shp, shibei.shp, laoshan.shp] gdfs [gpd.read_file(f, encodingutf-8) for f in files] merged gpd.GeoDataFrame(pd.concat(gdfs, ignore_indexTrue), crsgdfs[0].crs) merged.to_file(qingdao_merged.shp, driverESRI Shapefile, encodingutf-8)pd.concat按列名对齐比 Merge 工具更可控字段名不一致时会自动补 NaN方便你发现哪份数据缺字段。5.5 从 zip 直接读数据导致失败现象不解压直接用代码读xxx.zip里的 shp报错或读出来是空。原因GDAL 虽然支持/vsizip/虚拟路径读 zip但要求 zip 内部文件成套且路径正确中文文件名还容易出问题。解决老老实实先解压到本地目录再读。虚拟路径写法是/vsizip/路径/包.zip/内部文件名.shp但兼容性不稳定生产环境不建议用。6. 进阶把青岛市数据做成可复用的自动化处理脚本前面都是单次操作实际项目里你往往需要反复处理同类数据。我一般会写一个脚本把「解压 → 校验 → 重投影 → 导出 GeoJSON」串起来下次拿到新的城市数据直接改路径就能跑import os import zipfile import geopandas as gpd def process_city_zip(zip_path, out_dir, target_epsg4326, src_epsg4490): # 1. 解压 os.makedirs(out_dir, exist_okTrue) with zipfile.ZipFile(zip_path, r) as z: z.extractall(out_dir) # 2. 找到所有 shp shp_files [f for f in os.listdir(out_dir) if f.endswith(.shp)] if not shp_files: raise FileNotFoundError(压缩包里没有 shp 文件) results [] for shp in shp_files: path os.path.join(out_dir, shp) gdf gpd.read_file(path, encodingutf-8) # 3. 坐标系兜底没有 prj 就按源坐标系声明 if gdf.crs is None: gdf gdf.set_crs(epsgsrc_epsg) # 4. 统一转到目标坐标系 gdf gdf.to_crs(epsgtarget_epsg) # 5. 导出 GeoJSON out_name os.path.splitext(shp)[0] .geojson gdf.to_file(os.path.join(out_dir, out_name), driverGeoJSON, encodingutf-8) results.append((shp, len(gdf), gdf.crs)) return results if __name__ __main__: info process_city_zip(青岛市shp数据.zip, output) for name, count, crs in info: print(f{name}: {count} 个要素, 坐标系 {crs})这个脚本的价值在于把「坐标系兜底」和「统一重投影」固化成流程。src_epsg4490是青岛市数据的常见源坐标系target_epsg4326是 Web 地图通用坐标系两个参数按实际数据改。set_crs只在gdf.crs is None时触发避免对已有正确坐标系的数据做多余声明。跑完打印每个文件的要素数和坐标系一眼就能看出哪份数据有问题。验证脚本是否跑对最直接的办法是把导出的 GeoJSON 拖进 geojson.io 或 QGIS看图形是否落在青岛位置、属性是否完整。我自己的习惯是每次处理完新数据先随机抽一个区用ogrinfo看要素数再和官方公布的行政区划数量对一下对不上就说明数据有缺失或重复。这个习惯帮我拦下过好几次「看起来正常、实际少了一半要素」的坑。处理这类打包数据最省心的做法永远是先解压、再校验、后转换别指望一步到位。希望帮到你。本文还有配套的精品资源点击获取