实战案例与项目应用
第二十章 实战案例与项目应用
20.1 案例一:城市服务设施分析
20.1.1 项目背景
分析城市中学校、医院、公园等公共服务设施的覆盖范围和服务能力。
20.1.2 数据准备
- 行政区划边界
- 服务设施点位
- 道路网络
- 人口分布栅格
20.1.3 分析步骤
步骤1:创建服务区
import processing
# 为学校创建500米服务区缓冲
result = processing.run("native:buffer", {
'INPUT': schools_layer,
'DISTANCE': 500,
'DISSOLVE': False,
'OUTPUT': 'memory:'
})
school_buffers = result['OUTPUT']
步骤2:服务区人口统计
# 分区统计
result = processing.run("native:zonalstatisticsfb", {
'INPUT': school_buffers,
'INPUT_RASTER': population_raster,
'RASTER_BAND': 1,
'COLUMN_PREFIX': 'pop_',
'STATISTICS': [1, 2], # Sum, Mean
'OUTPUT': 'memory:'
})
步骤3:识别服务空白区
# 合并所有服务区
result = processing.run("native:dissolve", {
'INPUT': school_buffers,
'OUTPUT': 'memory:'
})
merged = result['OUTPUT']
# 从行政区中减去服务区
result = processing.run("native:difference", {
'INPUT': district_layer,
'OVERLAY': merged,
'OUTPUT': 'memory:'
})
gaps = result['OUTPUT']
步骤4:结果可视化
# 设置分级渲染
renderer = QgsGraduatedSymbolRenderer('pop_sum')
renderer.setClassificationMethod(QgsClassificationJenks())
renderer.updateClasses(school_buffers, 5)
school_buffers.setRenderer(renderer)
20.1.4 输出成果
- 服务设施覆盖率统计表
- 服务空白区分布图
- 人口服务能力评估报告
20.2 案例二:土地利用变化分析
20.2.1 项目背景
分析两个时期的土地利用变化情况。
20.2.2 数据准备
- 2010年土地利用图
- 2020年土地利用图
- 行政区划
20.2.3 分析步骤
步骤1:叠加分析
# 相交分析获取变化
result = processing.run("native:intersection", {
'INPUT': landuse_2020,
'OVERLAY': landuse_2010,
'INPUT_FIELDS': ['type_2020'],
'OVERLAY_FIELDS': ['type_2010'],
'OUTPUT': 'memory:'
})
change_layer = result['OUTPUT']
步骤2:计算变化统计
# 添加变化类型字段
change_layer.startEditing()
change_layer.addAttribute(QgsField('change_type', QVariant.String))
change_layer.commitChanges()
# 更新变化类型
change_layer.startEditing()
for feature in change_layer.getFeatures():
type_2010 = feature['type_2010']
type_2020 = feature['type_2020']
if type_2010 == type_2020:
change_type = '未变化'
else:
change_type = f'{type_2010}→{type_2020}'
change_layer.changeAttributeValue(
feature.id(),
change_layer.fields().indexOf('change_type'),
change_type
)
change_layer.commitChanges()
步骤3:生成转移矩阵
import pandas as pd
# 统计各类型面积
areas = {}
for feature in change_layer.getFeatures():
key = (feature['type_2010'], feature['type_2020'])
if key not in areas:
areas[key] = 0
areas[key] += feature.geometry().area()
# 创建转移矩阵
types = list(set([k[0] for k in areas.keys()]))
matrix = pd.DataFrame(index=types, columns=types, data=0.0)
for (from_type, to_type), area in areas.items():
matrix.loc[from_type, to_type] = area
20.2.4 输出成果
- 土地利用变化图
- 转移矩阵表
- 变化统计报告
20.3 案例三:洪水淹没分析
20.3.1 项目背景
根据DEM和水位预测洪水淹没范围。
20.3.2 数据准备
- 数字高程模型(DEM)
- 河流网络
- 居民点分布
- 历史洪水记录
20.3.3 分析步骤
步骤1:水位情景设置
water_levels = [10, 15, 20] # 不同水位情景(米)
步骤2:淹没范围计算
for level in water_levels:
# 栅格计算器
result = processing.run("gdal:rastercalculator", {
'INPUT_A': dem_layer,
'BAND_A': 1,
'FORMULA': f'A<{level}',
'OUTPUT': f'/output/flood_{level}m.tif'
})
# 转为矢量
result = processing.run("gdal:polygonize", {
'INPUT': f'/output/flood_{level}m.tif',
'BAND': 1,
'FIELD': 'flooded',
'OUTPUT': f'/output/flood_polygon_{level}m.shp'
})
步骤3:影响评估
# 统计受影响居民点
for level in water_levels:
flood_polygon = QgsVectorLayer(f'/output/flood_polygon_{level}m.shp', '', 'ogr')
result = processing.run("native:extractbylocation", {
'INPUT': settlements_layer,
'PREDICATE': [0], # Intersects
'INTERSECT': flood_polygon,
'OUTPUT': 'memory:'
})
affected = result['OUTPUT']
print(f"水位{level}m: 受影响居民点{affected.featureCount()}个")
20.3.4 输出成果
- 不同水位情景淹没范围图
- 受影响区域统计
- 风险等级图
20.4 案例四:选址分析
20.4.1 项目背景
为新建商业设施选择最佳位置。
20.4.2 分析因子
- 人口密度
- 交通可达性
- 竞争对手距离
- 土地价格
- 基础设施
20.4.3 分析步骤
步骤1:因子标准化
def normalize_raster(input_path, output_path):
"""0-1标准化"""
result = processing.run("gdal:rastercalculator", {
'INPUT_A': input_path,
'BAND_A': 1,
'FORMULA': '(A-min)/(max-min)',
'OUTPUT': output_path
})
步骤2:权重叠加
# 设置权重
weights = {
'population': 0.3,
'accessibility': 0.25,
'competition': 0.2,
'land_price': 0.15,
'infrastructure': 0.1
}
# 加权求和
formula = ' + '.join([f'{w}*{f}' for f, w in weights.items()])
result = processing.run("gdal:rastercalculator", {
'INPUT_A': 'population_norm.tif',
'INPUT_B': 'accessibility_norm.tif',
'INPUT_C': 'competition_norm.tif',
'INPUT_D': 'land_price_norm.tif',
'INPUT_E': 'infrastructure_norm.tif',
'FORMULA': '0.3*A + 0.25*B + 0.2*C + 0.15*D + 0.1*E',
'OUTPUT': 'suitability.tif'
})
步骤3:筛选最佳位置
# 提取高适宜度区域
result = processing.run("native:reclassifybytable", {
'INPUT_RASTER': 'suitability.tif',
'RASTER_BAND': 1,
'TABLE': [0, 0.7, 0, 0.7, 1, 1], # 0.7以上为适宜
'OUTPUT': 'suitable_areas.tif'
})
# 转为矢量
result = processing.run("gdal:polygonize", {
'INPUT': 'suitable_areas.tif',
'FIELD': 'suitable',
'OUTPUT': 'suitable_areas.shp'
})
20.4.4 输出成果
- 适宜性评价图
- 推荐选址点位
- 因子分析报告
20.5 案例五:生态廊道分析
20.5.1 项目背景
识别和规划野生动物迁徙廊道。
20.5.2 数据准备
- 土地覆盖
- 道路网络
- 河流水系
- 保护区边界
- 物种分布点
20.5.3 分析步骤
步骤1:阻力面生成
# 不同土地类型的阻力值
resistance_values = {
'forest': 1,
'grassland': 2,
'farmland': 5,
'urban': 100,
'water': 50,
'road': 80
}
# 重分类土地覆盖
result = processing.run("native:reclassifybytable", {
'INPUT_RASTER': landcover,
'TABLE': [...], # 分类表
'OUTPUT': 'resistance.tif'
})
步骤2:成本距离分析
# 从核心栖息地计算成本距离
result = processing.run("grass7:r.cost", {
'input': 'resistance.tif',
'start_points': habitat_cores,
'max_cost': 0,
'output': 'cost_distance.tif',
'outdir': 'cost_direction.tif'
})
步骤3:廊道识别
# 最低成本路径
result = processing.run("grass7:r.drain", {
'input': 'cost_distance.tif',
'direction': 'cost_direction.tif',
'start_points': destination_points,
'output': 'corridors.shp'
})
20.5.4 输出成果
- 生态阻力面图
- 潜在廊道网络图
- 廊道优先级评估
20.6 项目工作流模板
20.6.1 数据准备阶段
def prepare_data(input_dir, output_dir):
"""数据准备工作流"""
# 1. 数据检查
check_data_quality(input_dir)
# 2. 坐标系统一
reproject_all(input_dir, output_dir, target_crs='EPSG:4326')
# 3. 数据格式转换
convert_to_gpkg(output_dir)
# 4. 创建空间索引
create_spatial_indexes(output_dir)
return True
20.6.2 分析阶段
def run_analysis(data_dir, params):
"""分析工作流"""
# 加载数据
layers = load_layers(data_dir)
# 执行分析
results = {}
for step in analysis_steps:
result = step.execute(layers, params)
results[step.name] = result
return results
20.6.3 输出阶段
def generate_outputs(results, output_dir):
"""输出生成工作流"""
# 导出数据
export_layers(results, output_dir)
# 创建地图
create_map_layouts(results, output_dir)
# 生成报告
generate_report(results, output_dir)
return True
20.7 项目文档模板
20.7.1 项目说明文档
# 项目名称
## 1. 项目概述
- 背景
- 目标
- 范围
## 2. 数据说明
| 数据名称 | 格式 | 来源 | 时间 | CRS |
|---------|------|------|------|-----|
| ... | ... | ... | ... | ... |
## 3. 分析方法
- 方法描述
- 参数设置
- 工具选择
## 4. 结果说明
- 主要发现
- 图件说明
- 数据解读
## 5. 注意事项
- 数据局限
- 方法假设
- 使用建议
20.8 小结
本章通过实际案例展示了QGIS在各领域的应用:
关键要点:
- 掌握项目分析工作流程
- 了解不同领域的分析方法
- 学会组织和管理GIS项目
- 能够生成专业的分析报告
实践是掌握GIS技能的最佳途径。
上一章:第19章 性能优化与最佳实践
教程总结
恭喜您完成了这20章的QGIS学习教程!通过本教程,您应该已经掌握了:
- 基础知识:QGIS概述、安装配置、界面操作
- 数据管理:数据加载、矢量栅格处理、坐标系统
- 可视化:符号化、标注、地图布局
- 分析技能:空间分析、Processing工具箱
- 开发能力:PyQGIS编程、插件开发
- 高级功能:数据库、Web服务、3D可视化
- 实践应用:项目案例、最佳实践
继续学习的建议:
- 参与QGIS社区
- 阅读官方文档
- 实践项目应用
- 贡献开源代码
祝您在GIS领域取得更大成就!

浙公网安备 33010602011771号