空间分析工具

第十章 空间分析工具

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中的空间分析工具:

关键要点

  1. 掌握叠加分析的各种方法
  2. 理解缓冲区分析的应用
  3. 熟练使用空间查询功能
  4. 了解网络分析的基本原理
  5. 掌握地形分析工具
  6. 能够进行空间统计分析

空间分析是GIS的核心价值所在。


上一章第09章 地图样式与符号化

下一章第11章 地图布局与打印

posted @ 2026-01-08 14:04  我才是银古  阅读(26)  评论(0)    收藏  举报