☰
深圳2020年POI数据集从7z解压到DEM高程提取的完整实战流程
2026/10/7 18:03:36 网站建设 项目流程

简介:深圳2020年POI数据集是一套面向GIS从业者、城市规划研究者及数据分析师的地理信息综合包。资源整合30米分辨率DEM、行政区划边界以及shp、excel双格式POI数据,既保留矢量精度又兼顾表格统计便利,可直接用于地形分析、功能区热力图绘制、交通网络与商业选址等空间分析场景。压缩包共137个文件,主要包含shp矢量数据及其配套dbf、prj、shx等辅助文件,另有14个xlsx属性表和tif高程栅格,整体约54.04MB,目录按设施类别划分,便于分类调用。资源已有747人学习浏览。通过DEM与行政边界可快速还原深圳市基础地形与区划框架,POI数据覆盖餐饮、购物、医疗、文体等多类设施属性,适合用于城市服务设施分布统计与挖掘,并可导入常见GIS平台完成专题制图,是区域研究、规划决策和社会经济分析的高价值素材。

1. 深圳2020年POI数据集:四个文件格式拼出一套完整空间分析底稿

“深圳市2020年POI数据集,包含30M分辨率DEM、行政区划、shp格式POI、excel格式POI数据”,这类数据包在项目里出现的频率比想象中高:它把POI、DEM、行政区划和两种携带格式一次性给全,拿到手就能直接做核密度分析、设施可达性、缓冲区统计、地形叠加这类城市空间分析。适合两类人:一类是规划或GIS从业者,需要深圳底图做项目底稿;另一类是刚开始碰地理数据的开发者,想用一套能入库的数据把空间分析流程完整跑通。30米分辨率DEM精度不算高,但做宏观地形判断够用,加上shp和excel双格式的POI相互补位,省掉很多到处找数据、凑坐标系的折腾。下面按处理顺序展开:解压、坐标系对齐、清洗POI、避坑,最后把POI和DEM叠起来提取高程。

2. 先解开7z再做数据体检:文件编码、路径规划和三个命令行工具

拿到压缩包先别急着双击解压。7z格式在Windows和Linux之间流转时,最容易出问题的不是压缩包本身,而是文件名编码和解压路径。很多从业者在这上面翻过车:解压出来一堆乱码目录名,或者QGIS打不开shp,最后发现是解压路径带了中文。先把解压这一步做稳,后面能省一半排错时间。

2.1 用命令行解压7z:Linux和Windows各给一套可用命令

Linux下最常见的是p7zip工具包,Debian/Ubuntu系用apt安装,CentOS系对应yum install p7zip p7zip-plugins。命令行操作顺序很明确:先列内容、再解压、最后测试完整性。

# 安装 7z 命令行工具(Debian/Ubuntu 系) sudo apt install p7zip-full # 先列出包里有哪些文件,确认目录结构再动手 7z l 深圳市2020年POI数据集.7z # 完整解压到 /data/gis/shenzhen,注意 -o 与路径之间不能有空格 7z x 深圳市2020年POI数据集.7z -o/data/gis/shenzhen # 解压完成后测试压缩包是否有坏块 7z t 深圳市2020年POI数据集.7z

这里有个细节:-o参数后面直接跟目标路径,中间不能有任何空格,写成-o /data/gis会把路径当作解压文件名处理,命令直接报错。7z l用来预览目录结构,方便确认数据是否按DEM、行政区划、POI分目录存放,避免解压出一堆散文件。7z t是很多人忽略的一步,网盘和即时通讯传过的压缩包经常出现“解压到一半报CRC Failed”,先测试比解压失败再排查快得多。

Windows下我一般用7-Zip自带的命令行,用法和Linux一致:

7z x "深圳市2020年POI数据集.7z" -oC:\gis\shenzhen

图形界面右键解压当然可以,但只要涉及后续用QGIS或Python处理数据,解压路径就别带中文和空格。QGIS对非ASCII路径的支持一直不算好,Python某些库在读中文路径时也会莫名报错,这是很多新手打不开数据的隐性原因。如果压缩包是分卷格式,解开第一个分卷即可,7z会自动读取后续分卷。

2.2 解压后先体检:用gdalinfo、geopandas和pandas各看一眼

数据解压出来不要直接丢进ArcGIS,先用命令行和Python做一次快速体检。体检目标有三个:坐标系是什么、编码是否正常、数据量大概多少。

先看DEM的栅格元数据:

gdalinfo DEM_30m.tif

重点关注输出里的Pixel Size和Coordinate System两行。Pixel Size如果是0.00027左右的小数,说明DEM是经纬度坐标存储,分辨率按度算;如果是30.0这样的整数,说明已经是投影坐标,按米算。Coordinate System里能看到完整坐标系描述,比如WGS84或CGCS2000。这两项决定了后续要不要做重投影,以及重投影时选什么参数。

再看shp格式的POI,我用geopandas读取:

import geopandas as gpd poi = gpd.read_file("POI.shp", encoding="utf-8") print(poi.crs) # 坐标系,None 说明缺 .prj 文件 print(poi.shape) # 行数和列数 print(poi.columns.tolist()) # 字段名列表 print(poi.head(3)) # 抽查前 3 行数据

encoding参数是关键。shp的属性表是dbf格式,本身不记录编码,国内数据最常见的两种编码是UTF-8和GBK。如果上面代码输出中文乱码,把encoding换成"gbk"再读。print(poi.crs)如果输出None,说明shp包里缺了.prj投影文件,后面做投影转换前必须手动指定,这个在第3章展开。

excel格式的POI同样要抽查:

import pandas as pd df = pd.read_excel("POI.xlsx", sheet_name=0) print(df.shape) print(df.columns.tolist()) print(df.head(5))

POI的excel表头经常是中文,常见列有“名称”“经度”“纬度”“地址”“分类”。重点确认经纬度列是否存在、类型是不是数值。很多时候“经度”列里混入了文本,或者整列被读成字符串,这需要在后面清洗时用to_numeric处理。体检阶段不急着修,但要清楚数据里哪些列能直接用、哪些列要洗。

3. 坐标系统一是最大前提:把DEM和POI对齐到同一套投影

深圳这套数据里,DEM、行政区划、shp格式POI可能来自不同生产渠道,坐标系大概率不统一。最常见的情况:DEM是WGS84经纬度或CGCS2000经纬度,POI的shp文件缺投影文件,行政区划是地方测绘成果,用的是高斯投影。坐标系统一不是“选一个最精确的”,而是让所有数据在同一个空间参考下运算,避免算距离、做裁剪、采样高程时出现偏移或单位错误。

3.1 深圳数据最常见的坐标系组合与选择逻辑

深圳的经纬度范围大概在东经113.7度到114.6度、北纬22.4度到22.9度之间,正好跨越3度高斯投影的114度中央经线。这套数据里可能出现的坐标系集中在下面几个:

EPSG坐标系名称单位深圳适用性
4326WGS84 经纬度度互联网底图和免费数据常见,适合做底图
4490CGCS2000 经纬度度国内影像和部分官方数据常用
4547CGCS2000 / 3-degree Gauss-Kruger CM 114E米深圳范围推荐,投影变形小
32650WGS84 / UTM zone 50N米国际工具默认导出,也适用

判断方法很简单:投影坐标的数值范围通常很大,比如深圳在UTM 50N下X坐标约30万到40万、Y坐标约240万;经纬度坐标的范围则在90度以内,一眼就能区分。我一般会把所有矢量数据统一到EPSG:4547,栅格DEM也重投影到同一坐标系。这样做的理由很直接:后续做缓冲区、算距离、提取坡度全都以米为单位,不用反复换算。如果你用的软件里搜索EPSG:4547不方便,直接搜索“CGCS2000 3-degree CM 114E”也能找到。

不要嫌这一步繁琐。坐标系不统一,前面所有数据体检都白做——两个数据叠加看起来位置对不上,不是数据错了,是空间参考不一致。还有一类情况要特别注意:shp的crs显示为None。这是缺.prj文件导致的黑匣子状态,不能靠猜,我一般会先按EPSG:4326读取,叠加到行政区划上看位置偏差,如果整体偏移几百米再尝试换成CGCS2000或地方坐标系。

3.2 裁剪DEM到深圳行政区划:按掩膜提取和范围裁剪的区别

有了统一坐标系,接下来就是把30米DEM裁剪到深圳行政区划范围内。ArcGIS里有两个工具经常被混用:“栅格裁剪”和“按掩膜提取”,看起来都能裁剪,差别其实很大。

“栅格裁剪”(Clip)按矢量要素的外接矩形裁剪,速度快,但裁出来的DEM边缘是矩形的,边界外的区域变成NoData或默认值;“按掩膜提取”(Extract by Mask)严格按面要素边界裁剪,栅格边缘贴着行政区划边界走,边界外的像元全部设为NoData。对于深圳这种行政区划边界不规则的情况,用按掩膜提取更合适,因为后续做地形统计时不会把深圳湾或惠州范围的地形数据算进来。

命令行做法用gdalwarp一步完成:

# 把DEM裁剪到行政区划边界,-cutline 指定矢量边界 gdalwarp -cutline shenzhen_boundary.shp \ -crop_to_cutline \ -dstnodata 0 \ -overwrite \ DEM_30m.tif shenzhen_dem_30m.tif

参数说明:-cutline指定矢量裁剪边界,如果DEM和边界坐标系不一致,gdalwarp会自动重投影;-crop_to_cutline让输出栅格范围完全贴合矢量边界而不是外接矩形;-dstnodata 0把边界外的像元值设为0,防止边界外的异常值参与后续统计。

这里有一个容易被忽略的参数:重采样方法。如果DEM本身是经纬度坐标,重投影到EPSG:4547时默认用最近邻采样,地形边缘会出现明显的锯齿。对DEM这种连续表面数据,我会在命令里加-r bilinear,用双线性插值做重采样,地形过渡更平滑。裁剪后跑一句:

gdalinfo -stats shenzhen_dem_30m.tif

看STATISTICS_MINIMUM和MAXIMUM是否在合理范围。深圳陆地高程大约在0到943米之间,最高峰梧桐山接近944米。如果最小值是很大的負数,说明有异常像元或被NoData污染,需要回到裁剪步骤检查。

4. shp和excel两种POI怎么配合:shp管空间、excel管属性

这套数据包里POI给了两种格式,不是冗余,是互补。shp格式记录空间位置和少量属性,适合GIS分析和制图;excel格式承载完整属性字段,适合筛选、统计和人工核对。但shp有一个硬伤:dbf属性表的字段名长度限制在10个字符左右,中文属性经常被截断或乱码。所以操作思路是:以shp为空间骨架,用excel补全属性,最后按ID合并成一份完整数据。

4.1 读取shp格式POI:处理编码、查看字段、导出wkt

shp格式本质上是三个文件的组合:shp存储几何、dbf存储属性、shx存储索引。用geopandas读shp,第一步永远是解决编码:

import geopandas as gpd # 用 utf-8 读取,出现乱码就换成 gbk poi = gpd.read_file("POI.shp", encoding="utf-8") # 查看坐标系、行列数、字段名 print(poi.crs) print(poi.shape) print(poi.columns.tolist()) # 把几何列转成 wkt 文本,适合导入数据库或文本分析 poi["wkt"] = poi.geometry.to_wkt() print(poi[["名称", "wkt"]].head(3)) # 导出为 GeoJSON,属性完整保留 poi.to_file("POI.geojson", driver="GeoJSON")

代码逻辑说明:先读取并检查字段,geometry列通过to_wkt()转成文本格式,方便在SQLite、PostGIS或纯文本环境使用;导出GeoJSON则是为了跨平台交换,GeoJSON自带UTF-8编码,比shp的dbf编码兼容性好很多。这里会遇到的实际问题是:字段名显示不全。比如原字段叫“详细地址”,读出来变成“详细地”或乱码,大概率是dbf的字段截断造成的,不是数据损坏。这也是为什么要保留excel格式的POI。

顺带说一句,如果你打算把shp转成3dtiles做三维可视化,建议先完成坐标投影和字段清洗,否则转换工具读到的属性字段是残缺的,转出来的三维数据没法挂接业务信息。

4.2 excel格式POI转成shp:清洗经纬度、过滤异常值、导入GIS

excel格式的POI才是属性完整的源头,但它本身没有空间几何,要变成点图层得先用经纬度构造几何。这里最容易踩坑的是经纬度列脏数据:空值、字符串、坐标写反、还有“0,0”这种无效坐标。处理流程如下:

import pandas as pd import geopandas as gpd from shapely.geometry import Point df = pd.read_excel("POI.xlsx") # 把经纬度列强制转成数值,转不了的变成 NaN df["经度"] = pd.to_numeric(df["经度"], errors="coerce") df["纬度"] = pd.to_numeric(df["纬度"], errors="coerce") # 删除经纬度缺失的行 df = df.dropna(subset=["经度", "纬度"]) # 按深圳范围过滤:经度113~115,纬度22~23 df = df[(df["经度"] > 113) & (df["经度"] < 115)] df = df[(df["纬度"] > 22) & (df["纬度"] < 23)] # 从经纬度构造几何点,先按 WGS84 读入 gdf = gpd.GeoDataFrame( df, geometry=[Point(x, y) for x, y in zip(df["经度"], df["纬度"])], crs="EPSG:4326" ) # 保存为 shp,指定 utf-8 编码 gdf.to_file("POI_from_excel.shp", encoding="utf-8")

参数说明:errors="coerce"会把无法转成数值的内容变成NaN,避免Point构造时报错;经纬度范围过滤非常必要,手工整理的excel里经常出现“0,0”这种无效点,如果不过滤,后面叠加行政区划会把这些点甩到海南岛甚至赤道上。初次读入时用EPSG:4326,因为excel里记录的绝大多数是WGS84经纬度,后续再统一投影到EPSG:4547。

如果你习惯在ArcGIS里操作,10.8版本的流程是:右键Excel文件→导出为dbf→使用“XY Table To Point”工具导入,输入X字段为经度、Y字段为纬度,坐标系选EPSG:4326。操作路径不复杂,但要注意ArcMap对Excel的读取依赖驱动,遇到“Microsoft ACE OleDb”报错时,把Excel另存为xlsx再试,或者直接改用Python转成shp再导入。

4.3 按ID把shp和excel合并成一份完整数据

两种格式合流的常见做法是以shp为左表,按POI编号字段关联excel属性。前提是两份数据有共同的ID列,比如“POI_ID”或“名称”。如果没有,先用坐标模糊匹配,但坐标匹配在大批量数据上效率不高,我会优先检查数据包里是否带编号字段。

shp = gpd.read_file("POI.shp", encoding="utf-8") df = pd.read_excel("POI.xlsx") # 按编号字段关联 merged = shp.merge(df, on="POI_ID", how="left") print(merged.shape) print(merged.columns.tolist()) # 输出合并后完整数据 merged.to_file("POI_merged.shp", encoding="utf-8") merged[["名称", "经度", "纬度", "地址", "分类"]].to_excel("POI_merged.xlsx", index=False)

merge逻辑说明:how="left"保留shp里所有点,excel里没有对应属性的记录会显示为NaN,避免POI点被过滤掉。如果两份数据的字段名重复,比如都有“名称”列,合并后会自动生成“名称_x”和“名称_y”,需要先加载excel并重命名冲突列再关联。excel里如果没现成的ID列,常见的做法是用uuid或者按“区划代码+序号”生成唯一编号,但前提是shp和excel的排序逻辑一致,否则编号对不上。

5. 处理这套数据常见的5个坑:现象、原因、解决办法

这类数据包处理中的问题高度集中,基本绕不开编码、坐标系、单位、精度边界这几类。下面5条是实操中反复出现的踩坑记录,每条按现象、原因、解决展开。

5.1 文件名与属性表乱码

现象:Linux或macOS解压后,文件名变成“鏉窞甯?”,属性表中文全部乱码,ArcGIS里打开shp属性表显示问号。

原因:压缩包在Windows下用默认GBK编码记录文件名,Linux按UTF-8解码导致乱码;shp的dbf属性表本身不记录编码,软件按UTF-8读取GBK内容,中文自然显示为乱码。

解决:文件名乱码在Windows下重新解压并改名,或者在Windows里用7-Zip重新压缩一次并勾选“UTF-8文件名编码”;属性表乱码用geopandas读取时指定encoding="gbk",或者在QGIS的图层属性里手动设置数据源编码为GBK。这套组合能覆盖90%的乱码场景。

5.2 经纬度和投影坐标混用导致距离翻车

现象:在ArcGIS里用POI的字段计算器算两个点的距离,结果算出来几百甚至几千,单位看着像“米”实际是“度”。缓冲区分析同样离谱,设置500米缓冲,画出来的圆比整个深圳还大。

原因:数据是EPSG:4326经纬度坐标,单位是度,不是米。度不是固定长度单位,直接用GCS坐标算距离、面积,结果完全失真。

解决:任何距离、面积、缓冲区计算前,先把数据投影到EPSG:4547或EPSG:32650米制坐标。geopandas里可以用poi.to_crs("EPSG:4547")一步完成。判断是否已投影,看坐标值范围:深圳的投影坐标X在30万到40万之间,Y在240万附近,而经纬度坐标X在113到115之间,特征很明显。如果懒得手动选,可以调用estimate_utm_crs自动估算合适的UTM投影带。

5.3 裁剪后DEM边缘异常和重采样锯齿

现象:按行政区划裁剪DEM后,边界出现明显锯齿,或者边缘一圈高程值异常,比如突然出现-9999、0值环绕。

原因:一是重采样用了最近邻方法,边界像元被硬切;二是gdalwarp裁剪时没设置-dstnodata,边界外的无效值被保留成0或原始空值。

解决:裁剪命令里加-r bilinear做双线性重采样,加-dstnodata 0显式指定边界外值;裁剪后用gdalinfo -stats检查附加统计信息,如果最小值出现负的异常大值,说明NoData没处理好,重新执行裁剪。这个坑在ArcGIS的“按掩膜提取”里也会出现,处理方法是检查环境设置里的“NoData值”是否和原始DEM一致。

5.4 30米DEM在小地块尺度上的精度局限

现象:用这套30米DEM对一个学校、一个园区做坡度分析,结果和现场感觉完全不符,平地被算出大坡度,陡坡被算成缓坡。

原因:30米分辨率意味着每个像元覆盖900平方米,地形细节已经被平均掉了,地块尺度的分析用它必然失真。

解决:分辨率的选型遵循一个基本原则:分析尺度大于数百米用30米没问题,精确到小区、地块级别至少要换5米或1米DSM。如果手头只有30米DEM,就不要试图提取高密度等高线,10米等高距已经是它的信息量上限。反过来说,如果项目汇报需要宏观地形图、坡度分级图,30米分辨率反而比高精度数据更平滑、更好看。这是数据包本身能支撑的分析边界,提前知道省得返工。

5.5 excel里的POI坐标疑似整体偏移

现象:excel格式POI生成的点图层,叠加到shp或底图上,所有点整体偏移几百米,方向一致。

原因:Excel里的经纬度可能来自互联网地图采集,用的是坐标纠偏后的结果,不是标准WGS84坐标。shp格式的POI则通常使用标准坐标系,两者叠加自然出现固定偏移。

解决:先选取3-5个地标点(如平安金融中心、深圳北站),在excel点图层和shp图层之间做坐标比对,确认偏移方向与距离。如果确认是坐标纠偏导致,优先改用shp格式POI做空间分析;excel格式仅用于属性查询和筛选。这套数据包里两种POI格式的好处在这里体现出来——空间分析用shp,业务属性用excel,各取所长,不必强行把excel坐标纠偏到标准坐标系,那个涉及坐标系变换模型,不是30分钟能调好的。

6. 把POI叠加到DEM上:用rasterio给每个点提高程并验证

6.1 用rasterio给每个POI点提取DEM高程并验证

很多分析做到中段,会需要POI所在位置的高程值:评估易涝区商铺风险、判断基站选址是否在制高点、给外卖配送范围做坡度修正,都属于“点落地形”的需求。这个操作在ArcGIS里有现成工具,叫Extract Multi Values To Points,但用Python做更快,也方便直接和前面的geopandas流程衔接。

import geopandas as gpd import rasterio # 读取合并后的POI数据和裁剪后的DEM poi = gpd.read_file("POI_merged.shp", encoding="utf-8") dem = rasterio.open("shenzhen_dem_30m.tif") # 关键一步:把POI投影到DEM的坐标系 if poi.crs != dem.crs: poi = poi.to_crs(dem.crs) # 一次性采样所有点对应的高程值 coords = [(geom.x, geom.y) for geom in poi.geometry] poi["elevation"] = [v[0] for v in dem.sample(coords)] # 过滤边界外的无效值,看一眼统计分布 print(poi["elevation"].describe()) poi = poi[poi["elevation"] >= 0] # 输出带高程的shp和excel,方便回传业务方 poi.to_file("POI_with_elev.shp", encoding="utf-8") poi[["名称", "经度", "纬度", "elevation"]].to_excel("POI_with_elev.xlsx", index=False)

逻辑说明:dem.sample(coords)接收一组(x, y)坐标列表,返回每个坐标所在像元的数值,速度比逐行循环快一个量级,几万点也是秒级完成。采样前把POI投影到DEM坐标系是必须的,坐标系不一致时采样点会完全错位。采样完成后用describe()查看最小值最大值——深圳陆域高程0到943米之间,如果出现负数或-9999,说明点落在DEM的NoData区,直接过滤掉。

验证方面我有三个习惯:第一,随机抽20个点,在QGIS里加载DEM和POI图层,打开属性表对比高程是否合理;第二,检查填海区域(前海、深圳湾)的POI高程是否接近0到5米,如果这些区域出现几十米的异常值,说明DEM裁剪或重采样有问题;第三,对内陆道路类POI做抽查,如果出现大面积0值,要警惕是不是NoData被错误地转成了0,而不是这个位置真的海拔为0。做完这三步,带高程的POI数据才能放心进入后续分析。

顺便提醒一句:如果项目里需要的是从DEM生成等高线shp,而不是给点提取高程,30米分辨率数据建议等高距至少设到10米,再小就是纯粹的噪声,生成的等高线锯齿感会很严重。这一点和前面精度局限那条坑是同一个逻辑。

这套流程走下来,从7z解压到最终POI地形叠加,核心动作就是解压、体检、投影、清洗、采样这几步。最花时间的往往不是分析本身,而是excel里的脏坐标和坐标系不统一——这两件事处理干净,后面的每一个分析步骤都会顺畅很多。希望这次的处理路径能帮你在拿到类似数据包的第一天就少走几步弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询