实战案例与项目应用

第二十章 实战案例与项目应用

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在各领域的应用:

关键要点

  1. 掌握项目分析工作流程
  2. 了解不同领域的分析方法
  3. 学会组织和管理GIS项目
  4. 能够生成专业的分析报告

实践是掌握GIS技能的最佳途径。


上一章第19章 性能优化与最佳实践


教程总结

恭喜您完成了这20章的QGIS学习教程!通过本教程,您应该已经掌握了:

  1. 基础知识:QGIS概述、安装配置、界面操作
  2. 数据管理:数据加载、矢量栅格处理、坐标系统
  3. 可视化:符号化、标注、地图布局
  4. 分析技能:空间分析、Processing工具箱
  5. 开发能力:PyQGIS编程、插件开发
  6. 高级功能:数据库、Web服务、3D可视化
  7. 实践应用:项目案例、最佳实践

继续学习的建议:

  • 参与QGIS社区
  • 阅读官方文档
  • 实践项目应用
  • 贡献开源代码

祝您在GIS领域取得更大成就!

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