当前位置: 首页 > 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' 已添加,单位为平方公里。")

相关文章:

  • 语音合成之十一 提升TTS语音合成效果:低质量数据清洗、增强与数据扩增
  • 判断字符是否唯一 --- 位运算
  • C++ 外观模式详解
  • Guass数据库实验(数据字典设计、交叉表设计)
  • linux种文件名usr的含义是什么?
  • 20250505解压缩tar.xz压缩包的方法
  • Allegro23.1新功能之自动添加器件下方相邻层禁布操作指导
  • Adobe LiveCycle Designer
  • Android控件VideoView用法
  • DeepSeek-能力边界
  • 数据库的并发控制
  • USB资料摘录for后期,bus hound使用
  • 小白学习java第16天(下):javaweb
  • 凸性(Convexity)
  • Python小酷库系列:bidict,可以双向查询的dict
  • 2025年5月5日星期一的摸鱼大冒险
  • 音视频作品:AI生成音乐、短视频的邻接权保护
  • 基于yolov11的灭火器检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
  • NV287NV291美光固态闪存NV293NV294
  • Kubernetes排错(七)-节点排错
  • 中年人多活动有助预防阿尔茨海默病
  • 罗马尼亚总理乔拉库宣布辞职
  • 今年五一档电影票房已破7亿
  • 遭反特朗普情绪拖累?澳大利亚联盟党大选落败、党魁痛失议席
  • 首日5金!中国队夺得跳水世界杯总决赛混合团体冠军
  • 讲座预告|政府在人工智能研究和应用领域的作用