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

python计算shp中每个区域的面积

目录

  • 简介
  • 具体代码

简介

如果我们拿到一个区域的shp后想对其增加一个面积字段并写入对应小区域的面积,可以在arcgis中用字段计算器完成,但是步骤相对比较繁琐,而且如果需要批量处理多个shp的话会显得更加不方便。这里提供一个python代码可以一站式解决这个问题。

具体代码

from osgeo import ogr, osr
import os# 输入shapefile路径
input_shp = r"D:\your.shp"# 打开数据源
driver = ogr.GetDriverByName("ESRI Shapefile")
datasource = driver.Open(input_shp, 1)  # 1表示可写入if datasource is None:print("无法打开输入的shapefile文件")exit(1)# 获取图层
layer = datasource.GetLayer()# 获取图层的空间参考
source_srs = layer.GetSpatialRef()
print(f"源坐标系统: {source_srs.ExportToWkt()}")# 创建等面积投影坐标系统(适合面积计算)
# 使用Lambert Azimuthal Equal Area投影,中心点设置为数据范围的中心
# 获取数据的范围
extent = layer.GetExtent()
x_center = (extent[0] + extent[1]) / 2  # (minX + maxX) / 2
y_center = (extent[2] + extent[3]) / 2  # (minY + maxY) / 2target_srs = osr.SpatialReference()
target_srs.SetProjCS("Lambert Azimuthal Equal Area")
target_srs.SetWellKnownGeogCS("WGS84")
target_srs.SetLAEA(y_center, x_center, 0, 0)  # 纬度, 经度, 假东, 假北# 创建坐标转换
transform = osr.CoordinateTransformation(source_srs, target_srs)# 检查字段是否存在
layer_defn = layer.GetLayerDefn()
field_index = -1
for i in range(layer_defn.GetFieldCount()):if layer_defn.GetFieldDefn(i).GetName() == "AREA_KM2":field_index = ibreak# 如果字段不存在,则添加
if field_index == -1:field_defn = ogr.FieldDefn("AREA_KM2", ogr.OFTReal)field_defn.SetWidth(12)field_defn.SetPrecision(4)layer.CreateField(field_defn)# 遍历所有要素,计算面积
feature_count = layer.GetFeatureCount()
print(f"开始计算 {feature_count} 个要素的面积...")for i in range(feature_count):feature = layer.GetFeature(i)geometry = feature.GetGeometryRef()# 克隆几何对象并转换到等面积投影projected_geometry = geometry.Clone()projected_geometry.Transform(transform)# 计算面积(平方米)并转换为平方公里area_m2 = projected_geometry.GetArea()area_km2 = area_m2 / 1000000.0# 更新字段feature.SetField("AREA_KM2", area_km2)layer.SetFeature(feature)# 清理feature = Nonegeometry = Noneprojected_geometry = None# 显示进度if (i + 1) % 100 == 0 or i + 1 == feature_count:print(f"已处理: {i + 1}/{feature_count}")# 保存并关闭
datasource = Noneprint("面积计算完成,字段 'AREA_KM2' 已添加,单位为平方公里。")
http://www.xdnf.cn/news/290449.html

相关文章:

  • Linux 怎么使用局域网内电脑的网络访问外部
  • android-ndk开发(6): 查看反汇编
  • 《算法导论(第4版)》阅读笔记:p7-p8
  • 售前赢单评分是越权吗?
  • 第二章-猜数游戏
  • 数据集-目标检测系列- 牙刷 检测数据集 toothbrush >> DataBall
  • 分析strtol(),strtoul()和strtod()三个函数的功能
  • 字符串哈希专题
  • 架构进阶:什么是数据架构,如何理解数据架构?(华为)
  • 从0开始学习大模型--Day01--大模型是什么
  • 什么是开放数据湖(Open Data Lake)?
  • 十大排序算法全面解析(Java实现)及优化策略
  • Kotlin 作用域函数全解析:let、run、with、apply、also 应该怎么选?
  • C++演讲比赛案例代码
  • [人机交互]理解与概念化交互
  • 小工具功能强大,非常优秀!​
  • 「Mac畅玩AIGC与多模态20」开发篇16 - 使用结构化输出字段控制后续流程示例
  • 基于STM32F103C8T6驱动WS2812彩灯模块点亮RGB灯
  • 布隆过滤器
  • Qt学习笔记
  • SVD降维详解
  • 领略算法真谛: 多源bfs
  • 设一个测试情境,新用户注册后显示的名字不完整,测试思路是怎么样的?
  • 项目实战-基于信号处理与SVM机器学习的声音情感识别系统
  • 【Bootstrap V4系列】学习入门教程之 组件-按钮组(Button group)
  • MAC地址与帧结构
  • ICLR2024 | GNS-HFA | 通过梯度归一化缩放和高频适应增强视觉Transformer的可迁移对抗攻击
  • WMS仓库管理系统:Java+Vue,含源码及文档,集成仓储全流程管控,实现库存精准、作业高效、数据透明
  • Visual Studio 项目转Qt项目
  • 用网页显示工控仪表