当前位置: 首页 > news >正文

使用 ArcPy 统计感兴趣区面积占比并导出 Excel

使用 ArcPy 统计感兴趣区面积占比并导出 Excel

使用 ArcPy 统计矿洞面积占比并导出 Excel

背景介绍

在地理信息系统(GIS)项目中,经常需要分析土地变化,比如矿山开采对区域的影响。通过计算每年矿洞面积占总治理区的比例,能直观看到趋势,帮助决策者评估环境风险。但手动测量每个Shapefile文件太繁琐,这个Python脚本就如一个“自动计算器”,批量处理多年数据,一键生成Excel报告,让新手也能轻松上手GIS统计。

这个教程专为编程初学者设计,聚焦实际操作,帮助你从数据文件到报告的全流程。

代码功能说明

这个脚本的核心用途是批量统计矿洞Shapefile的面积占比,解决手动计算多年数据耗时且易错的问题。它会扫描输入文件夹中的多个年份Shapefile文件,计算每个文件的矿洞总面积,除以标准栅格治理区的总面积,得出占比比例,然后整理成表格导出Excel。

适用场景包括:矿山环境监测、土地利用评估、年度报告生成——任何需要面积比例统计的矢量数据分析。运行后,你会在终端看到“✅ 完成!结果已保存到 [路径]”提示,输出Excel文件中按年份排序的表格,列出“年份”“矿洞总面积”“矿山治理区总面积”“占比”,方便直接导入PPT或进一步分析。

运行环境准备

环境准备是脚本运行的基础,就像为计算器装电池,确保一切顺畅。为什么要做这一步?因为ArcPy依赖专业GIS软件,缺少它脚本无法访问数据文件。

  • ArcGIS 版本要求:ArcGIS Desktop 10.5+ 或 ArcGIS Pro 2.5+(推荐 Pro,支持现代Python)。
    • 检查方法:启动ArcGIS,查看“帮助 > 关于”中的版本。如果未安装,从 esri.com 下载。
  • Python 环境:使用ArcGIS自带的Python解释器(通常3.9+),无需单独安装。
  • 文件准备:准备标准栅格TIF文件(定义治理区)和多个Shapefile文件(按年份命名,存入一个文件夹),确保硬盘空间充足。

这些就位后,脚本能在ArcGIS环境中稳定运行。

详细运行步骤

我们将运行过程拆分成清晰步骤,像组装家具一样逐一完成。每步附带“为什么”的解释,帮助你理解逻辑:这样操作时更有信心,不是机械复制。

  1. 环境准备
    为什么?验证工具可用,避免后期“半路抛锚”。

    • 启动ArcGIS Pro 或 Desktop,确保许可激活。
    • 准备数据:将年份Shapefile放入一个文件夹(如“mine_shps”),标准TIF文件单独保存。测试:在ArcGIS中加载TIF,确认栅格显示正常。
  2. 依赖安装
    为什么?脚本需Pandas库导出Excel,ArcGIS默认可能未含它。

    • 打开ArcGIS Python Command Prompt(从开始菜单搜索)。
    • 在终端输入:pip install pandas
    • 验证:输入 python -c "import pandas; print('OK')",看到“OK”即成功。
  3. 代码修改
    为什么?路径是示例,替换成你的才能指向正确数据,否则像寄错地址的信。

    • 新建文本文件,命名为 mine_area_stats.py,复制下方代码块内容。
    • 用记事本或VS Code打开,修改参数:
      • 注意:运行前需修改 mine_folder = r"【your_mine_folder】" 为Shapefile文件夹路径,例如 r"C:\GISData\mine_shps"
      • 注意:运行前需修改 standard_raster = r"【your_standard_raster】" 为TIF路径,例如 r"C:\GISData\study_area.tif"
      • 注意:运行前需修改 output_excel = r"【your_output_excel】" 为输出Excel路径,例如 r"C:\Output\mine_ratios.xlsx"
    • 保存文件(UTF-8编码)。
    # -*- coding: utf-8 -*-
    import arcpy
    import os
    import re
    import pandas as pdarcpy.env.overwriteOutput = True# === 参数设置 ===
    mine_folder = r"【your_mine_folder】"  # 多年份矿洞矢量文件夹
    standard_raster = r"【your_standard_raster】"  # 标准栅格
    output_excel = r"【your_output_excel】"# 获取矿山治理区总面积(以栅格像元面积累加)
    desc = arcpy.Describe(standard_raster)
    cell_area = desc.meanCellHeight * desc.meanCellWidth  # 栅格像元面积
    raster = arcpy.Raster(standard_raster)
    raster_mask = arcpy.RasterToPolygon_conversion(raster, "in_memory\\mask", "NO_SIMPLIFY")
    # 栅格转换矢量后求总面积
    total_area = 0
    with arcpy.da.SearchCursor(raster_mask, ["SHAPE@AREA"]) as cursor:for row in cursor:total_area += row[0]# === 统计矿洞面积 ===
    data_list = []for shp_file in os.listdir(mine_folder):if not shp_file.lower().endswith(".shp"):continueshp_path = os.path.join(mine_folder, shp_file)# 提取年份match = re.search(r"(20\d{2})", shp_file)if match:year = match.group(1)else:year = shp_file  # 没有年份就用文件名# 求矿洞总面积total_mine_area = 0with arcpy.da.SearchCursor(shp_path, ["SHAPE@AREA"]) as cursor:for row in cursor:total_mine_area += row[0]# 计算占比ratio = total_mine_area / total_area if total_area > 0 else 0data_list.append({"年份": year,"矿洞总面积": total_mine_area,"矿山治理区总面积": total_area,"占比": ratio})# === 输出到 Excel ===
    df = pd.DataFrame(data_list)
    df = df.sort_values("年份")
    df.to_excel(output_excel, index=False)print(f"✅ 完成!结果已保存到 {output_excel}")
    
  4. 执行命令
    为什么?这是“按下计算键”,触发脚本扫描和统计。

    • 在ArcGIS Python Command Prompt中,切换目录:输入 cd 【your_script_path】(例如 cd C:\Scripts)。
    • 运行命令:python mine_area_stats.py
    • 等待几秒(取决于文件数),终端会显示完成消息。
  5. 验证结果
    为什么?确认输出准确,像检查账单对不对账。

    • 打开指定Excel文件,用Excel查看表格:年份应排序,占比列为小数(如0.15表示15%)。
    • 随机挑一年Shapefile,在ArcGIS计算其面积,手动验证是否匹配脚本结果。
    • 如果表格完整无空行,即处理成功。

核心代码解析

脚本像一个“智能秤重机”:先称“总盘子”重量(治理区面积),然后逐年称矿洞“货物”重量,算比例,最后打包成表格。用大白话解释核心行,就如教朋友用计算器——重点在按键顺序,不深挖电路。

  • 计算总面积desc = arcpy.Describe(...)total_area += row[0]):
    这部分像“测量师”:先描述栅格“身材”(像素宽高),转成临时多边形,然后一行行累加每个片段面积,得治理区总值。为什么?栅格数据需转矢量才能精确求和,避免像素级误差。

  • 遍历Shapefilefor shp_file in os.listdir(...)):
    想象成“文件扫描仪”:逛文件夹,只挑“.shp”文件,忽略杂物。从文件名抠年份(如“2020_mine.shp”→“2020”)。为什么?批量处理多年数据,得按年分组,便于追踪变化。

  • 统计单年面积with arcpy.da.SearchCursor(shp_path, ["SHAPE@AREA"])):
    像“逐个过磅”:用光标扫每个矿洞多边形,累加其面积。为什么?Shapefile含多片矿洞,总面积是求和,确保不漏。

  • 计算占比并收集ratio = ...data_list.append({...})):
    简单除法得比例(矿洞/总面积),打包成字典存列表,像购物车加项。为什么?比例化数据易读,列表方便后期转表格。

  • 导出Exceldf = pd.DataFrame(...)df.to_excel(...)):
    把列表变表格,按年排序,存文件。为什么?Excel是报告标配,一键导出省手动抄表。

整体如流水线:测基准 → 逐年算 → 汇总表。新手看懂后,可加图表功能扩展。

常见问题解决

遇到问题别急,这些是常见“绊脚石”,配解药,能帮你快速恢复。为什么总结?调试像修车,知道零件名更快上手。

  • 路径找不到

    • 报错“No such file or directory”。
    • 解决:用 r"路径" 格式,从文件资源管理器右键复制完整路径。确认文件夹有Shapefile。为什么?路径像坐标,稍偏就迷路。
  • Pandas未安装

    • 报错“ModuleNotFoundError: No module named 'pandas'”。
    • 解决:重跑 pip install pandas,用ArcGIS Prompt。为什么?环境隔离,系统pip可能无效。
  • 面积为0或异常

    • 总面积0,或比例NaN。
    • 解决:检查TIF是否全0栅格;在ArcGIS手动计算面积验证。加 print(total_area) 调试。为什么?数据源问题常见,打印中间值易定位。
  • 年份提取失败

    • 年份显示为文件名。
    • 解决:确保Shapefile名含“20XX”格式,如“mine_2020.shp”。为什么?正则匹配靠模式,不符就fallback。
  • 其他:内存不足时分小批Shapefile处理。出错复制终端信息,搜索“ArcPy SearchCursor [错误]”。

这些技巧掌握,脚本将成为你的GIS利器。实践后,试试添加可视化图表,进一步提升报告专业度。

http://www.jsqmd.com/news/384942/

相关文章:

  • 吃豆人skills - yi
  • 7 学习
  • Linux 中parallel命令
  • 使用 ArcPy 批量处理栅格数据:重采样与矢量裁剪
  • 张兆辉专访:《夜色正浓》沈默的复杂,是成年人的生存真相
  • 大模型API:企业AI应用落地的关键路径
  • 食品X光机选购指南:主流品牌与核心技术全解析
  • ConstraintLayout写法和Box写法比较
  • 2026主流食品X光机深度测评:技术参数与选型指南
  • 大模型API实测:关键指标与选型全解析
  • 并查集进阶
  • mysql的概述
  • 【Harmonyos】开源鸿蒙跨平台训练营DAY2:多终端工程创建运行、代码提交至AtomGit平台自建公开仓库全流程(附带出现问题及解决手段)
  • 【OI】传奇鬼王——SPFA
  • 2026恶臭在线监测设备选购大盘点:实力厂家排行及采购建议 - 品牌推荐大师1
  • 日常被豆包怼
  • 21.行为型 - 状态模式 (State Pattern)
  • 基于深度学习的浅层与深层血流速率分离技术:弥散相关光谱学的Python实现
  • Netty 快速入门一则
  • 龙虾机器人(OpenClaw)本地部署完全技术指南
  • 生产环境CSS原生瀑布流来了!最佳实践与性能优化
  • 【OI】传奇脆皮王2——SPFA
  • 力扣 hot100 【洗刷耻辱】
  • 使用 Python + 百度翻译 批量翻译 ArcGIS Shapefile 字段
  • 基于SSM的中诚房屋中介管理系统[SSM]-计算机毕业设计源码+LW文档
  • STM32F1介绍 - LI,Yi
  • 开放式厨房适合用集成灶吗?选哪个牌子好?2025选购指南出炉 - 匠言榜单
  • Springboot3+vue3软件商城共享系统 软件公司的售前售后服务系统
  • 【CVPR 2025即插即用】卷积模块篇 | GBConv轻量级门控瓶颈卷积,适合图像分类、目标检测、实例分割、语义分割、图像去噪、边缘检测、医学图像分割、遥感目标检测等CV任务通用,涨点起飞
  • 使用BEiT模型进行CIFAR-100图像分类:迁移学习实战指南