ARTICLE DETAIL

资讯详情

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

宁波建筑物及高程shp数据wgs84坐标系处理全攻略

宁波建筑物及高程shp数据wgs84坐标系处理全攻略 简介这份资源是面向GIS从业者、城市规划研究人员及地理信息相关专业学生的宁波建筑物与高程空间数据集采用WGS84全球通用坐标系可直接与GPS及其他WGS84数据叠加分析适用于城市扩张研究、地形变化监测、防洪规划与地图制作等场景。压缩包共8个文件约7.2MB以SHP格式为核心包含shp几何数据、dbf属性数据、shx索引数据、prj投影信息及xml元数据等各文件协同构成完整的空间数据体系解压后可直接在ArcGIS、QGIS等软件中加载查看。目前已有670人学习下载具备一定参考价值。读者可借助该数据直观获取宁波地区建筑物的位置、形状与高程信息开展空间匹配、可视化表达与地形分析为城市研究与规划决策提供基础数据支撑。1. 宁波建筑物及高程 shp 数据 wgs84 坐标系这份数据到底能干什么拿到一份「宁波建筑物及高程 shp 数据 wgs84 坐标系.zip」很多人第一反应是解压看看里面有几个文件然后卡在第一步ArcGIS 里拖进去地图上什么都没有或者位置飘到几百公里外。这不是数据坏了而是 shp 这种格式本身不带坐标系定义它靠一个同名 .prj 文件告诉软件「我的坐标是什么」。wgs84 是地理坐标系单位是度不是米直接拿它算面积、做缓冲区结果全是错的。这份数据的价值在于建筑物面 高程点/等高线是城市三维建模、洪水淹没分析、日照模拟、容积率核算的基础底料。适合做 GIS 分析、城市规划、遥感验证、三维可视化的人。但前提是你得先把它从「经纬度坐标」转成「投影坐标」否则后面每一步都是坑。下面按我实际处理这类数据的顺序把坐标系确认、投影转换、高程处理、常见翻车点讲清楚。2. 先搞清 shp 里到底装了什么文件清单与坐标系确认2.1 解压后必须检查的 6 类文件shp 不是单个文件是一组。少一个ArcGIS 或 QGIS 打开就报错或者属性丢失。拿到 zip 先解压然后按下面这张表核对文件后缀作用缺失后果.shp几何图形点/线/面完全打不开.shx几何索引能打开但无法查询、编辑.dbf属性表没有字段只剩空壳图形.prj坐标系定义坐标未知位置乱飘.cpg字符编码中文属性乱码.sbn/.sbx空间索引可选不影响打开影响查询速度宁波这份数据如果包含建筑物面和高度字段通常 .dbf 里会有楼层数、层高、建筑高度、结构类型等字段。先别急着做分析用 QGIS 或 ArcGIS 打开属性表看一眼字段名确认高程是存在属性字段里还是单独一个点 shp。2.2 用 Python 一次性读出坐标系和字段命令行里跑一段比在软件里点来点去快得多。需要geopandas和pyprojimport geopandas as gpd from pyproj import CRS # 读取建筑物面数据注意路径改成你解压后的实际路径 gdf gpd.read_file(宁波建筑物.shp) # 打印坐标系信息 print(当前坐标系:, gdf.crs) # 打印字段名和类型 print(字段列表:) print(gdf.dtypes) # 打印前3行属性看高程字段长什么样 print(gdf.head(3))逻辑说明gdf.crs返回的是 pyproj 的 CRS 对象如果输出EPSG:4326说明是 wgs84 地理坐标系如果输出None说明 .prj 缺失或无效这时候不能直接转投影得先手动指定。gdf.dtypes帮你快速定位高程字段是 float 还是 objectobject 类型说明里面混了文字后面数值计算会报错。参数说明read_file默认用 Fiona 引擎遇到中文路径报错就加encodingutf-8。如果 .dbf 里有中文乱码先确认 .cpg 文件内容是不是UTF-8不是的话用gdf.to_file(..., encodingutf-8)重写一遍。2.3 坐标系未定义时怎么手动补上ArcGIS 里经常遇到「坐标系未定义」的提示QGIS 里图层坐标显示为Unknown。这时候不要直接点「定义投影」随便选一个先判断数据实际是什么坐标。宁波在 wgs84 下的经纬度范围大约是东经 121.5°~122.0°北纬 29.5°~30.0°。打开属性表看第一个点的坐标如果 X 是 121 开头、Y 是 29 开头那就是 wgs84 地理坐标直接指定 EPSG:4326。# 坐标系缺失时手动指定为 wgs84 gdf gdf.set_crs(epsg4326, allow_overrideTrue) # 确认 print(gdf.crs)注意set_crs只是给数据「贴标签」不改变坐标数值。如果数据实际是投影坐标比如 X 是 6 位数、Y 是 7 位数你硬贴 4326位置会飞到非洲去。所以贴标签前一定先看数值范围。3. 从 wgs84 到宁波本地投影建筑物面积才算得准3.1 为什么不能直接在 wgs84 下算面积wgs84 的单位是度1 度纬度约 111 公里但 1 度经度在宁波北纬 30°只有约 96 公里。你用gdf.area算出来的是「平方度」这个数字没有任何物理意义。更麻烦的是同一个建筑物在不同纬度算出来的平方度还不一样。做容积率、建筑密度、拆迁面积核算必须转成投影坐标系单位是米。宁波常用的投影是 CGCS2000 3 度带中央经线 121.5°EPSG:4547或 122°EPSG:4548。CGCS2000 和 wgs84 在米级精度上差异很小日常城市分析够用。如果数据要跟当地规划部门的 CAD 图套合先问清楚他们用的中央经线是多少。3.2 投影转换的完整代码与参数解释import geopandas as gpd # 读取 wgs84 建筑物数据 gdf gpd.read_file(宁波建筑物.shp) # 确认当前是 wgs84 assert gdf.crs.to_epsg() 4326, 当前不是 wgs84先检查 .prj # 转换到 CGCS2000 3度带 中央经线121.5度 gdf_proj gdf.to_crs(epsg4547) # 计算投影后的面积单位平方米 gdf_proj[area_m2] gdf_proj.geometry.area # 按面积降序看最大的几个建筑物 print(gdf_proj[[建筑高度, area_m2]].sort_values(area_m2, ascendingFalse).head(10)) # 保存为新的 shp坐标系已经是投影坐标 gdf_proj.to_file(宁波建筑物_投影.shp, encodingutf-8)逻辑说明to_crs做的是真正的坐标变换不是贴标签。它会把每个经纬度点通过椭球参数换算成平面米坐标。area在投影坐标系下直接返回平方米。保存时encodingutf-8防止中文字段乱码。参数说明epsg4547对应 CGCS2000 / 3-degree Gauss-Kruger CM 121.5E。如果你要跟宁波市区的其他数据套合先确认对方用的 EPSG 代码。ArcGIS 里对应的是「CGCS2000_3_Degree_GK_CM_121.5E」。如果数据范围跨了 121.5° 和 122° 两个带建议统一用 121.5° 带边缘变形在可接受范围内。3.3 高程数据的两种处理方式高程 shp 通常是点要素属性表里有一个elevation或height字段。处理方式取决于你要做什么做地形分析用 QGIS 的「栅格化」工具把点转成 DEM像元大小设 5 米或 10 米插值方法选 IDW 或 TIN。做建筑高度统计直接读属性表按建筑物面做空间连接把高程点的高程值赋给最近的建筑物。# 高程点转 DEM 的 Python 方式需要 rasterio 和 scipy import geopandas as gpd import numpy as np from scipy.interpolate import griddata import rasterio from rasterio.transform import from_origin # 读高程点 pts gpd.read_file(宁波高程点.shp).to_crs(epsg4547) x pts.geometry.x.values y pts.geometry.y.values z pts[elevation].values # 定义栅格范围像元10米 res 10 xmin, ymin, xmax, ymax x.min(), y.min(), x.max(), y.max() grid_x, grid_y np.mgrid[xmin:xmax:res, ymin:ymax:res] # IDW 插值 grid_z griddata((x, y), z, (grid_x, grid_y), methodcubic) # 写出 GeoTIFF transform from_origin(xmin, ymax, res, res) with rasterio.open(宁波DEM.tif, w, driverGTiff, heightgrid_z.shape[0], widthgrid_z.shape[1], count1, dtypegrid_z.dtype, crsEPSG:4547, transformtransform) as dst: dst.write(grid_z, 1)逻辑说明先把高程点转到投影坐标保证 x/y 单位是米。griddata的cubic方法适合点密度较高的数据点稀疏时改用linear或nearest。from_origin定义栅格左上角坐标和像元大小写出的 GeoTIFF 可以直接在 ArcGIS 里跟建筑物面叠加。参数说明res10表示 10 米分辨率宁波市区高程点如果密度是每平方公里 100 个点以上10 米够用如果点很稀改成 30 米。cubic插值在数据边缘会外推出现异常值写文件前用np.clip(grid_z, z.min(), z.max())截断一下。4. 避坑与排查坐标系和 shp 处理中最容易翻车的 5 个地方4.1 现象ArcGIS 里拖进去位置飘到非洲原因.prj 文件缺失或内容错误ArcGIS 默认按无坐标系处理或者你手动「定义投影」时选错了 EPSG。宁波的经纬度是 121°E、29°N如果被当成 0° 附近就会飘到赤道几内亚湾。解决先用 Python 读坐标数值范围确认是经纬度还是投影坐标。经纬度就指定 EPSG:4326投影坐标就查当地 EPSG。不要用 ArcGIS 的「定义投影」盲选选错了要重新来。4.2 现象转投影后面积变成负数或零原因几何图形本身有问题比如自相交、空几何、坐标顺序反了经纬度写成了纬度经度。wgs84 数据从某些来源导出时X 和 Y 会颠倒。解决转投影前先跑gdf.is_valid检查无效的用gdf.buffer(0)修复。坐标顺序反了的话用gdf.geometry gdf.geometry.map(lambda geom: Point(geom.y, geom.x))交换回来再重新指定坐标系。4.3 现象中文属性表乱码字段名变成问号原因.dbf 文件的字符编码不是 UTF-8常见的是 GBK 或 GB2312。QGIS 能自动识别一部分ArcGIS 经常直接显示乱码。解决用 Python 读的时候指定encodinggbk然后另存为 UTF-8。或者直接改 .cpg 文件内容为UTF-8再用 QGIS 打开。注意改 .cpg 不会转换已有数据的编码只是告诉软件用什么编码读如果原数据是 GBK改 .cpg 反而更乱。4.4 现象建筑物面和底图对不上偏移几百米原因底图用的是 Web 墨卡托EPSG:3857你的 shp 是 wgs84 地理坐标两者在 ArcGIS 里叠加时ArcGIS 会动态投影但动态投影的基准面转换参数如果没设对就会有偏移。宁波地区 wgs84 到 CGCS2000 的偏移通常在米级但到 Web 墨卡托的偏移会随纬度变化。解决统一坐标系。做底图叠加时把 shp 转成跟底图一样的 EPSG:3857或者把底图转成 wgs84。不要依赖软件的动态投影尤其是做精确量算的时候。4.5 现象shp 转 KML 后 Google Earth 里位置不对原因KML 强制使用 wgs84 地理坐标。如果你的 shp 是投影坐标转 KML 时没有先转回 wgs84或者转了但基准面没选对就会偏移。解决转 KML 前先to_crs(epsg4326)然后用 QGIS 的「另存为 KML」或ogr2ogr命令。ArcGIS 的「图层转 KML」工具会自动处理但前提是数据框坐标系是 wgs84。5. 进阶用这份数据做建筑高度分级与三维拉伸验证拿到建筑物面和高度字段后最直接的进阶用法是做高度分级统计然后导出到三维软件里验证。这一步能帮你判断数据质量到底能不能支撑后续分析。先按高度字段做分级统计每个区间的建筑物数量和总面积import geopandas as gpd import pandas as pd gdf gpd.read_file(宁波建筑物_投影.shp) # 按建筑高度分级边界根据宁波实际调整 bins [0, 10, 20, 50, 100, 200, 1000] labels [0-10m, 10-20m, 20-50m, 50-100m, 100-200m, 200m以上] gdf[高度分级] pd.cut(gdf[建筑高度], binsbins, labelslabels) # 统计 summary gdf.groupby(高度分级).agg( 建筑物数量(建筑高度, count), 总面积平方米(area_m2, sum), 平均高度(建筑高度, mean) ).reset_index() print(summary)逻辑说明pd.cut按指定边界把连续高度切成离散区间groupby后同时统计数量、面积和均值。这一步能快速看出数据里有没有异常值比如高度 999 米的建筑物大概率是字段错误。参数说明bins的边界要根据宁波实际情况调。宁波市区多层住宅一般 6 层约 18 米小高层 11 层约 33 米高层 30 层约 90 米。如果统计结果里 200 米以上的建筑物数量异常多先检查高度字段单位是米还是分米。接下来做三维拉伸验证。QGIS 里用「拉伸」符号化ArcGIS Pro 里用「图层属性 → 拉伸」。拉伸前确认高度字段单位是米拉伸倍数设 1。如果拉伸后建筑物高度明显不对比如 6 层楼拉成了 60 米说明字段单位是分米除以 10 再用。我自己的习惯是拿到任何一份带高程的 shp先跑一遍分级统计再看最小值和最大值。最小值如果是 0 或负数说明有地下建筑或数据错误最大值如果超过 500 米宁波目前没有这么高的建筑肯定是字段问题。这一步花不了五分钟但能省掉后面几小时的返工。希望帮到你。本文还有配套的精品资源点击获取
返回列表