空间分析基础:空间数据类型、坐标系、常用空间分析操作与应用场景
做空间分析,你第一件要搞清楚的事就是:你到底在跟什么类型的数据打交道。我见过不少新手,拿到数据就往上怼分析工具,结果跑出来一堆莫名其妙的结果。说白了,空间数据就两大类,搞懂了它们,后面坐标系、操作什么的才能聊得开。
空间数据的两大家族:矢量与栅格
矢量数据,你可以理解成“画出来的”。点、线、面,每个都有自己的坐标。比如一个井盖是一个点,一条路是一根线,一个小区是一个面。我习惯用一个比喻:矢量就像用钢笔在纸上精确地画形状,位置准、边界清。
栅格数据,就是“拍出来的”照片。每个格子(像元)存一个值,像卫星影像、DEM高程图。你放大到一定程度就能看到像素块。两类型的关键差异我列个表,方便你对照。
| 特征 | 矢量 | 栅格 |
|---|---|---|
| 数据结构 | 点、线、面 + 属性表 | 二维像元矩阵,每个像元一个值 |
| 精度 | 高,边界精确 | 取决于分辨率,容易有锯齿 |
| 存储 | 相对紧凑,尤其简单要素 | 分辨率越高体积越大 |
| 典型格式 | Shapefile、GeoJSON、GeoPackage | GeoTIFF、IMAGINE、NetCDF |
| 分析强项 | 叠加、缓冲区、网络分析 | 表面分析、插值、分类 |
| 我踩过的坑 | 属性表乱码、坐标缺定义 | 投影信息丢失、像元对齐问题 |
我个人习惯是:如果数据要强调精确边界和关系,用矢量;如果要算地表连续变化(坡度、温度),用栅格。但很多项目是混着用的,比如用栅格做核密度,再转成矢量做叠加。
坐标系:为什么GIS里最坑人的就是它?
坐标系这事儿,说白了就是地球的“地址簿”。地球是个椭球,你非要用平面坐标去描述,就得投影。我记得第一次做项目,甲方给了两个数据,一个用WGS84经纬度,一个用北京54高斯投影,我一拉进去就叠不上。后来我焊死在数据源头就做坐标定义校验。
坐标系分两大类:
- 地理坐标系:用经纬度,单位是度。比如WGS84、CGCS2000。全球通用,但度量距离、面积不方便,因为一度在不同的纬度长度不一样。
- 投影坐标系:把地球表面展开到平面,单位是米。比如UTM、高斯-克吕格。适合计算长度、面积,但会有变形(面积、形状、距离只能保一个)。
核心原则:分析前必须确保所有数据使用同一个坐标系。否则你做的缓冲区、叠加重采样全白费。我在Docker镜像里一定预装gdalinfo和projinfo,用来快速查看坐标定义。
如何查看和转换?最简单的工具是GDAL和PROJ库。以下是我常用的一条命令,检查图层的坐标系:
gdalinfo shape.shp | grep "Coordinate System"
# 或者用ogrinfo更简洁
ogrinfo -al -so shape.shp | grep "EXTENT\|SRS WKT"
如果需要转换,我用ogr2ogr,一步到位:
ogr2ogr -t_srs EPSG:4326 output.shp input.shp
EPSG代码是国际通用坐标系编号。4326就是WGS84经纬度,3857是Web墨卡托(谷歌地图用的)。我建Docker容器时会专门写一个脚本,自动校验数据坐标系,不一致就报错并打印转换建议。
常用空间分析操作
说几个我几乎每两周就要用到的操作,也是课程后面Docker化要反复出现的。
- 缓冲区分析:给每个要素画一个固定半径的“安全区”。我做过一个化工厂选址项目,对着每个居民点做500米缓冲区,看污染影响范围。
- 叠加分析:把两个图层叠在一起,找交集、并集、差集。比如拿地块和洪水风险区叠加,挑出高风险地块。
- 裁剪:用一个区域切另一张图。我经常用国家边界把全球森林数据裁剪成国内区域,不然数据量太大跑不动。
- 距离与邻接:计算最近的医院、道路、河流。PostGIS里用
ST_Distance和ST_Nearest就能搞定。 - 表面分析:从DEM算坡度、坡向、山体阴影。栅格操作,常用GDAL的
gdaldem slope。
经验之谈:在Docker里部署分析流程时,我习惯先把中间结果用GeoTIFF或GeoPackage保存,这样一旦容器崩溃还能从断点继续。特别是处理几百GB的栅格数据时,分段处理比一次跑完稳得多。
应用场景:你手里的数据到底能干啥
空间分析不是炫技,每个操作背后都有明确业务。我给你列几个常用场景,回头你做项目时可以直接套框架。
| 场景 | 使用数据 | 核心操作 | 产出物 |
|---|---|---|---|
| 选址分析 | 土地利用、交通路网、POI | 缓冲区 + 叠加 + 适宜性评分 | 最佳位置分级图 |
| 交通可达性 | 道路网、人口分布 | 网络分析(最短路径) | 等时圈、服务区 |
| 环境监测 | 遥感影像、监测点 | 栅格分类、变化检测 | 植被覆盖变化图 |
| 灾害评估 | 地形、河流、建筑 | 洪水淹没模拟、缓冲区 | 风险区域地图 |
| 商业网点规划 | 人口普查、竞争者位置 | 核密度、叠加、热力图 | 潜力热力图 |
你看,核心就是那几个操作排列组合。我曾经帮物流公司做送货点优化,就靠叠加和距离计算,把配送效率提升了20%。
避坑指南:坐标系与数据交接
我曾经犯过的错:从网上下了一个全球0.25°格网的栅格数据,以为是WGS84,直接跟矢量做加法,结果发现位置偏移了半个像素——原来原始数据用的是WGS84 + 旋转坐标参考,GDAL默认没读对。从那以后我强制在Docker入口脚本里写一段校验:
if [ "$(gdalinfo -json input.tif | jq -r '.coordinateSystem.wkt' | grep -c 'GCS_WGS_1984')" -eq 0 ]; then
echo "坐标系可能有问题,请检查"
exit 1
fi
切记:矢量数据的属性表编码也可能出幺蛾子。Shapefile的.dbf默认Latin1,中文会乱码,我习惯用-lco ENCODING=UTF-8导出GeoJSON。另一个坑是栅格重采样时的插值方法,最近邻快但精度低,双线性适合连续表面(DEM),三次卷积适合影像。你自己试试看不同方法怎么影响结果。
嗯,这张图把整个章节的主线连起来了——从数据类型到坐标统一,再到操作和应用。你可以把它贴在工位旁边,后面学Docker化流程时随时回头对照。
作业思考:找两个公共数据集(比如OpenStreetMap路网和SRTM高程),检查它们的坐标系是否一致。如果不一致,试试用ogr2ogr或gdalwarp转换到同一个投影。写一条Docker指令自动化这件事。