空间分析工具
第十章 空间分析工具
10.1 空间分析概述
10.1.1 什么是空间分析
空间分析是GIS的核心功能,用于发现空间数据中的模式、关系和趋势:
- 位置分析:确定位置关系
- 距离分析:测量距离和可达性
- 叠加分析:组合多个图层
- 网络分析:路径和连通性
- 统计分析:空间统计和模式识别
10.1.2 QGIS分析工具来源
| 来源 | 特点 | 工具数量 |
|---|---|---|
| QGIS原生 | 高效、直接集成 | 200+ |
| GDAL/OGR | 数据处理 | 50+ |
| GRASS GIS | 强大分析 | 500+ |
| SAGA GIS | 地形分析 | 300+ |
| 第三方插件 | 特定领域 | 变化 |
10.2 矢量叠加分析
10.2.1 交集分析
提取两个图层的共同区域:
import processing
result = processing.run("native:intersection", {
'INPUT': layer1,
'OVERLAY': layer2,
'INPUT_FIELDS': [],
'OVERLAY_FIELDS': [],
'OVERLAY_FIELDS_PREFIX': '',
'OUTPUT': 'memory:'
})
output_layer = result['OUTPUT']
10.2.2 并集分析
合并两个图层的所有区域:
result = processing.run("native:union", {
'INPUT': layer1,
'OVERLAY': layer2,
'OVERLAY_FIELDS_PREFIX': '',
'OUTPUT': 'memory:'
})
10.2.3 差集分析
从一个图层中移除与另一个图层重叠的部分:
result = processing.run("native:difference", {
'INPUT': layer1,
'OVERLAY': layer2,
'OUTPUT': 'memory:'
})
10.2.4 对称差分析
提取两个图层不重叠的部分:
result = processing.run("native:symmetricaldifference", {
'INPUT': layer1,
'OVERLAY': layer2,
'OUTPUT': 'memory:'
})
10.2.5 裁剪分析
按多边形边界裁剪数据:
result = processing.run("native:clip", {
'INPUT': data_layer,
'OVERLAY': clip_polygon,
'OUTPUT': 'memory:'
})
10.3 缓冲区分析
10.3.1 基本缓冲区
result = processing.run("native:buffer", {
'INPUT': layer,
'DISTANCE': 100,
'SEGMENTS': 5,
'END_CAP_STYLE': 0, # 0=Round, 1=Flat, 2=Square
'JOIN_STYLE': 0, # 0=Round, 1=Miter, 2=Bevel
'MITER_LIMIT': 2,
'DISSOLVE': False,
'OUTPUT': 'memory:'
})
10.3.2 可变距离缓冲
from qgis.core import QgsProperty
result = processing.run("native:buffer", {
'INPUT': layer,
'DISTANCE': QgsProperty.fromExpression('"buffer_field"'),
'OUTPUT': 'memory:'
})
10.3.3 多环缓冲
result = processing.run("native:multiringconstantbuffer", {
'INPUT': layer,
'RINGS': 5,
'DISTANCE': 100,
'OUTPUT': 'memory:'
})
10.3.4 负缓冲(内缩)
result = processing.run("native:buffer", {
'INPUT': polygon_layer,
'DISTANCE': -50, # 负值
'OUTPUT': 'memory:'
})
10.4 邻近分析
10.4.1 最近邻分析
result = processing.run("native:nearestneighbouranalysis", {
'INPUT': point_layer,
'OUTPUT_HTML_FILE': '/tmp/nn_analysis.html'
})
# 输出包含:
# - 观测平均距离
# - 期望平均距离
# - 最近邻指数
# - Z得分
10.4.2 距离矩阵
result = processing.run("qgis:distancematrix", {
'INPUT': origins,
'INPUT_FIELD': 'id',
'TARGET': destinations,
'TARGET_FIELD': 'id',
'MATRIX_TYPE': 0, # 0=线性, 1=标准, 2=摘要
'NEAREST_POINTS': 0, # 0=全部
'OUTPUT': 'memory:'
})
10.4.3 最近点连接
result = processing.run("native:joinbynearest", {
'INPUT': layer1,
'INPUT_2': layer2,
'FIELDS_TO_COPY': [],
'DISCARD_NONMATCHING': False,
'PREFIX': 'nearest_',
'NEIGHBORS': 1,
'MAX_DISTANCE': None,
'OUTPUT': 'memory:'
})
10.5 空间查询
10.5.1 按位置选择
result = processing.run("native:selectbylocation", {
'INPUT': target_layer,
'PREDICATE': [0], # 0=相交
'INTERSECT': selector_layer,
'METHOD': 0 # 0=新选择, 1=添加, 2=选中部分选中, 3=从选中移除
})
# 谓词选项:
# 0=相交, 1=包含, 2=不相交, 3=相等, 4=接触
# 5=重叠, 6=在内部, 7=交叉
10.5.2 按位置提取
result = processing.run("native:extractbylocation", {
'INPUT': target_layer,
'PREDICATE': [0],
'INTERSECT': selector_layer,
'OUTPUT': 'memory:'
})
10.5.3 按表达式选择
result = processing.run("qgis:selectbyexpression", {
'INPUT': layer,
'EXPRESSION': '"population" > 1000000 AND "type" = \'city\'',
'METHOD': 0
})
10.6 网络分析
10.6.1 最短路径
result = processing.run("native:shortestpathpointtopoint", {
'INPUT': road_network,
'START_POINT': '116.4,39.9',
'END_POINT': '117.2,39.1',
'STRATEGY': 0, # 0=最短, 1=最快
'DIRECTION_FIELD': '',
'VALUE_FORWARD': '',
'VALUE_BACKWARD': '',
'VALUE_BOTH': '',
'DEFAULT_DIRECTION': 2, # 双向
'SPEED_FIELD': '',
'DEFAULT_SPEED': 50,
'TOLERANCE': 0,
'OUTPUT': 'memory:'
})
10.6.2 服务区分析
result = processing.run("native:serviceareafrompoint", {
'INPUT': road_network,
'START_POINT': '116.4,39.9',
'STRATEGY': 0,
'TRAVEL_COST': 1000, # 距离或时间
'OUTPUT': 'memory:'
})
10.6.3 OD成本矩阵
result = processing.run("native:shortestpathpointtolayer", {
'INPUT': road_network,
'START_POINT': '116.4,39.9',
'END_POINTS': destinations,
'STRATEGY': 0,
'OUTPUT': 'memory:'
})
10.7 密度分析
10.7.1 核密度估计
result = processing.run("qgis:heatmapkerneldensityestimation", {
'INPUT': point_layer,
'RADIUS': 1000,
'RADIUS_FIELD': '',
'WEIGHT_FIELD': '',
'KERNEL': 0, # 0=四次, 1=三角, 2=均匀, 3=三权, 4=Epanechnikov
'OUTPUT_VALUE': 0, # 0=原始, 1=缩放
'PIXEL_SIZE': 100,
'OUTPUT': '/tmp/heatmap.tif'
})
10.7.2 线密度
result = processing.run("gdal:griddatametrics", {
'INPUT': line_layer,
'METRIC': 4, # 线密度
'RADIUS1': 1000,
'RADIUS2': 1000,
'OUTPUT': '/tmp/line_density.tif'
})
10.8 地形分析
10.8.1 坡度
result = processing.run("gdal:slope", {
'INPUT': dem_layer,
'BAND': 1,
'SCALE': 1,
'AS_PERCENT': False,
'COMPUTE_EDGES': False,
'ZEVENBERGEN': False,
'OUTPUT': '/tmp/slope.tif'
})
10.8.2 坡向
result = processing.run("gdal:aspect", {
'INPUT': dem_layer,
'BAND': 1,
'TRIG_ANGLE': False,
'ZERO_FLAT': True,
'OUTPUT': '/tmp/aspect.tif'
})
10.8.3 山体阴影
result = processing.run("gdal:hillshade", {
'INPUT': dem_layer,
'BAND': 1,
'Z_FACTOR': 1,
'SCALE': 1,
'AZIMUTH': 315,
'ALTITUDE': 45,
'OUTPUT': '/tmp/hillshade.tif'
})
10.8.4 流域分析
# 使用GRASS
result = processing.run("grass7:r.watershed", {
'elevation': dem_layer,
'threshold': 10000,
'basin': '/tmp/basin.tif',
'stream': '/tmp/stream.tif',
'accumulation': '/tmp/accum.tif'
})
10.8.5 视域分析
result = processing.run("gdal:viewshed", {
'INPUT': dem_layer,
'BAND': 1,
'OBSERVER': '116.4,39.9',
'OBSERVER_HEIGHT': 1.75,
'TARGET_HEIGHT': 0,
'MAX_DISTANCE': 10000,
'OUTPUT': '/tmp/viewshed.tif'
})
10.9 插值分析
10.9.1 反距离权重(IDW)
result = processing.run("qgis:idwinterpolation", {
'INTERPOLATION_DATA': f'{point_layer.id()}::~::0::~::1::~::0',
'DISTANCE_COEFFICIENT': 2,
'EXTENT': extent,
'PIXEL_SIZE': 100,
'OUTPUT': '/tmp/idw.tif'
})
10.9.2 TIN插值
result = processing.run("qgis:tininterpolation", {
'INTERPOLATION_DATA': f'{point_layer.id()}::~::0::~::1::~::0',
'METHOD': 0, # 0=线性, 1=Clough-Tocher
'EXTENT': extent,
'PIXEL_SIZE': 100,
'OUTPUT': '/tmp/tin.tif'
})
10.9.3 克里金插值
# 使用GRASS
result = processing.run("grass7:v.surf.rst", {
'input': point_layer,
'zcolumn': 'value',
'tension': 40,
'smooth': 0.1,
'elevation': '/tmp/kriging.tif'
})
10.10 统计分析
10.10.1 字段统计
result = processing.run("qgis:basicstatisticsforfields", {
'INPUT_LAYER': layer,
'FIELD_NAME': 'population',
'OUTPUT_HTML_FILE': '/tmp/stats.html'
})
# 输出统计信息:
# 计数, 唯一值数, 空值数
# 最小值, 最大值, 范围
# 总和, 平均值, 中位数
# 标准差, 变异系数
10.10.2 分区统计
result = processing.run("native:zonalstatisticsfb", {
'INPUT': zones_polygon,
'INPUT_RASTER': raster_layer,
'RASTER_BAND': 1,
'COLUMN_PREFIX': 'stat_',
'STATISTICS': [0, 1, 2, 4, 5, 6], # Count, Sum, Mean, Std, Min, Max
'OUTPUT': 'memory:'
})
10.10.3 多边形内点计数
result = processing.run("native:countpointsinpolygon", {
'POLYGONS': polygon_layer,
'POINTS': point_layer,
'WEIGHT': '',
'CLASSFIELD': '',
'FIELD': 'NUMPOINTS',
'OUTPUT': 'memory:'
})
10.10.4 空间自相关(Moran's I)
# 需要Spatial Analysis Toolbox插件
result = processing.run("spatialanalysistoolbox:globalmoransi", {
'INPUT': layer,
'FIELD': 'value',
'DISTANCE_METHOD': 0,
'OUTPUT': 'memory:'
})
10.11 位置分配
10.11.1 泰森多边形
result = processing.run("native:voronoipolygons", {
'INPUT': point_layer,
'BUFFER': 0, # 0=自动
'OUTPUT': 'memory:'
})
10.11.2 德劳内三角网
result = processing.run("native:delaunaytriangulation", {
'INPUT': point_layer,
'OUTPUT': 'memory:'
})
10.11.3 凸包
result = processing.run("native:convexhull", {
'INPUT': layer,
'OUTPUT': 'memory:'
})
10.11.4 最小边界几何
# 最小外接矩形
result = processing.run("native:minimumboundinggeometry", {
'INPUT': layer,
'TYPE': 0, # 0=外接矩形, 1=外接圆, 2=凸包
'OUTPUT': 'memory:'
})
10.12 实用分析工具
10.12.1 几何验证
result = processing.run("native:checkvalidity", {
'INPUT_LAYER': layer,
'METHOD': 2, # 0=QGIS, 1=GEOS, 2=全部
'VALID_OUTPUT': 'memory:',
'INVALID_OUTPUT': 'memory:',
'ERROR_OUTPUT': 'memory:'
})
10.12.2 几何修复
result = processing.run("native:fixgeometries", {
'INPUT': layer,
'OUTPUT': 'memory:'
})
10.12.3 消除狭窄多边形
result = processing.run("qgis:eliminateselectedpolygons", {
'INPUT': layer,
'MODE': 0, # 0=最大公共边界, 1=最大面积
'OUTPUT': 'memory:'
})
10.13 小结
本章详细介绍了QGIS中的空间分析工具:
关键要点:
- 掌握叠加分析的各种方法
- 理解缓冲区分析的应用
- 熟练使用空间查询功能
- 了解网络分析的基本原理
- 掌握地形分析工具
- 能够进行空间统计分析
空间分析是GIS的核心价值所在。
上一章:第09章 地图样式与符号化
下一章:第11章 地图布局与打印

浙公网安备 33010602011771号