GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。

        Python的GDAL库作为栅格数据的处理转换库,其支持几百种栅格数据格式,如常见的TIFF、ENVI、HFA、HDF4等。因为遥感影像大部分都是栅格数据,所以GDAL库非常适合处理遥感影像、如光谱指数计算、波段合成、批量下载、栅格转面等。

一、导入所需要的库

os库用来判断文件是否存在,gdal库用来打开栅格数据并实现栅格转换,osr库用于定义投影,ogr库用于创建并编辑矢量。

var code = "3085904e-43cb-46ec-b554-3611f7b23acb"
import os
from osgeo import gdal, osr, ogr

二、栅格转面

栅格转面是指将栅格数据转换为连续的面状要素,通常在GIS数据分析和空间建模中使用。其主要意义包括:

  1. 提高数据精度:栅格数据是离散的,而面状要素是连续的,将栅格数据转换为连续的面状要素可以提高数据的精度。

  2. 便于空间分析:栅格数据在进行空间分析和建模时存在不足,而面状要素具有更强的可视化和解释性,便于空间分析和建模。

  3. 方便数据交换:在不同GIS软件和平台之间,栅格数据的格式和处理方式可能存在差异。将栅格数据转换为面状要素可以方便数据的交换和共享。

1.读取栅格数据

# 栅格转面
ds_raster = gdal.Open(different_data) # 读取路径中的栅格数据
band_raster = ds_raster.GetRasterBand(1) # 获取需要转为矢量的波段

2.创建投影驱动,并导入投影信息

proj_raster = osr.SpatialReference()
proj_raster.ImportFromWkt(ds_raster.GetProjection())
# 将栅格数据的投影信息赋值给矢量

3.创建矢量驱动,并创建新的属性字段

driver = ogr.GetDriverByName("ESRI Shapefile")
polygon = driver.CreateDataSource(out_shp) # 创建数据资源
layer_polygon = polygon.CreateLayer("Shp", srs=proj_raster, geom_type=ogr.wkbMultiPolygon) # 创建图层,定义多面
new_field = ogr.FieldDefn('value', ogr.OFTReal) # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
layer_polygon.CreateField(new_field)

4.执行栅格转面函数并关闭数据驱动

gdal.FPolygonize(band_raster, None, layer_polygon, 0)  # 核心函数,执行的就是栅格转矢量操作
polygon.SyncToDisk()
polygon = None

5.完整代码

def Grid_faceting(different_data, out_shp):
"""
:param different_data: 输入需要转换的栅格数据
:param out_shp: 输出矢量的路径
:return:
"""
print("正在栅格转面。。。")
# 栅格转面
ds_raster = gdal.Open(different_data) # 读取路径中的栅格数据
band_raster = ds_raster.GetRasterBand(1) # 获取需要转为矢量的波段
proj_raster = osr.SpatialReference()
proj_raster.ImportFromWkt(ds_raster.GetProjection())
# 将栅格数据的投影信息赋值给矢量
driver = ogr.GetDriverByName("ESRI Shapefile")
if os.path.exists(out_shp): # 若文件已经存在,则删除它继续重新做一遍
driver.DeleteDataSource(out_shp)
polygon = driver.CreateDataSource(out_shp) # 创建数据资源
layer_polygon = polygon.CreateLayer("Shp", srs=proj_raster, geom_type=ogr.wkbMultiPolygon) # 创建图层,定义多面
new_field = ogr.FieldDefn('value', ogr.OFTReal) # 给目标shp文件添加一个字段,用来存储原始栅格的pixel value
layer_polygon.CreateField(new_field)
gdal.FPolygonize(band_raster, None, layer_polygon, 0) # 核心函数,执行的就是栅格转矢量操作
polygon.SyncToDisk()
polygon = None

三、计算矢量面积

1.创建数据驱动,打开数据

driver = ogr.GetDriverByName("ESRI Shapefile")  # 创建数据驱动
ds = driver.Open(path_shp, 1) # 创建数据资源

2.创建新字段“Area”用来保存计算得到的面积

layer = ds.GetLayer()
new_field = ogr.FieldDefn("Area", ogr.OFTReal) # 创建新的字段
new_field.SetWidth(32)
new_field.SetPrecision(16)
layer.CreateField(new_field)

3.循环图层内的所有要素,并计算面积

for feature in layer:
geom = feature.GetGeometryRef()
geom2 = geom.Clone()
area = geom2.GetArea() # 默认为平方米
# area = area / 1000000 # 转化为平方公里
feature.SetField("Area", area)
# feature.GetField('Area')
layer.SetFeature(feature)

4.完整代码

def Get_polygon_area(path_shp):
"""
:param path_shp: 输入矢量文件
:return:
"""
print("正在获取矢量面积。。。")
driver = ogr.GetDriverByName("ESRI Shapefile") # 创建数据驱动
ds = driver.Open(path_shp, 1) # 创建数据资源
layer = ds.GetLayer()
new_field = ogr.FieldDefn("Area", ogr.OFTReal) # 创建新的字段
new_field.SetWidth(32)
new_field.SetPrecision(16)
layer.CreateField(new_field)
number = 0
for feature in layer:
geom = feature.GetGeometryRef()
geom2 = geom.Clone()
area = geom2.GetArea() # 默认为平方米
# area = area / 1000000 # 转化为平方公里
feature.SetField("Area", area)
# feature.GetField('Area')
layer.SetFeature(feature)
ds = None

  

        本文章主要是分享个人在学习Python过程中写过的一些代码。有些部分借鉴了前人以及官网的教程,如有侵权请联系作者删除,大家有问题可以随时留言交流,博主会及时回复。

【Python&GIS】GDAL栅格转面&计算矢量面积的更多相关文章

  1. Python之NumPy实践之数组和矢量计算

    Python之NumPy实践之数组和矢量计算 1. NumPy(Numerical Python)是高性能科学技术和数据分析的基础包. 2. NumPy的ndarray:一种对位数组对象.NumPy最 ...

  2. (数据科学学习手札147)Python GIS利器shapely全新2.0版本一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,我写过很多篇介绍geopand ...

  3. PostGIS计算矢量切片(二)--按值渲染

    方案背景     今年三月份写了一篇postgis计算矢量切片,参考了网上资料给出了一份很粗糙的相关方案(文章写的更粗糙).当时的方案中只能针对gis形状进行渲染,而不能用属性渲染.针对这个情况,本文 ...

  4. python学习笔记(2):科学计算及数据可视化入门

    一.NumPy 1.NumPy:Numberical Python 2.高性能科学计算和数据分析的基础包 3.ndarray,多维数组(矩阵),具有矢量运算的能力,快速.节省空间 (1)ndarray ...

  5. Python之进度条及π的计算

    Python之进度条及π的计算 文本进度条 1.  简单的开始 这是利用print()函数来实现简单的非刷新文本进度条.它的基本思想是按照任务执行百分比将整个任务划分为100个单位,每执行N%输出一次 ...

  6. Unbuntu 18.04 LTS 环境下Python安装GDAL组件

    Unbuntu 18.04 LTS 环境下Python安装GDAL组件 // 非必要 sudo add-apt-repository ppa:ubuntugis/ppa sudo apt-get up ...

  7. ArcGIS应用——四种计算图斑面积的方法

    ArcGIS中有多种方法可计算出图斑面积,本文总结了四种方法,是否可堪称史上最全? 1.计算几何 本人认为这是最适合非专业人士的方法,直接利用ArcGIS中的计算几何功能进行计算. a.首先添加一do ...

  8. 计算平面面积和斜面面积-ArcGIS案例学习笔记

    计算平面面积和斜面面积-ArcGIS案例学习笔记 联系方式:谢老师,135_4855_4328,xiexiaokui#139.com 数据:实验数据\Chp8\Ex5\demTif.tif 平面面积= ...

  9. google map 计算地图面积方法

    花了几个小时把js的google计算地图面积的算法改成了c# 的. class Program { static void Main(string[] args) { // a = new qq.ma ...

  10. OpenJudge计算概论-计算三角形面积【海伦公式】

    /*============================================== 计算三角形面积 总时间限制: 1000ms 内存限制: 65536kB 描述 平面上有一个三角形,它的 ...

随机推荐

  1. Tomcat启动JSP项目,搞起来了

    虽然有点复古,但是还是有很多小伙伴在使用的,小编来一篇保姆级教程 1.用idea打开jsp项目 2.添加tomcat配置 3.点击后会出现配置框,这里画框的地方都选上,版本选择1.8,其他的信息内容默 ...

  2. 30张图说清楚 TCP 协议

    大家好,我是风筝 前两天分享了 20张图说清楚 IP 协议 今天,继续来网管的自我修养之TCP协议,这可是除 IP 协议外另一个核心协议了. TCP 协议是网络传输中至关重要的一个协议,它位于传输层. ...

  3. java 实现文件夹上传(springBoot 框架)

    有时我们后台管理等服务可能会有这样一个简单需求,就是根据文件夹将整个文件夹下的所有资源都上传到我们的服务器上,本人也是搜索了大量资料,最终以最简单便捷的方式实现该功能,具体操作步骤如下 一.前端如何设 ...

  4. 全网最详细中英文ChatGPT-GPT-4示例文档-智能编写Python注释文档字符串从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...

  5. Low-Code,一定“low”吗?

    作者:京东保险 吴凯 前言 低代码是一组数字技术工具平台,基于图形化拖拽.参数化配置等更为高效的方式,实现快速构建.数据编排.连接生态.中台服务.通过少量代码或不用代码实现数字化转型中的场景应用创新. ...

  6. pysimplegui之进度表one_line_progress_meter

    我们的代码中都有循环.'等待,看着文本窗口中滚动过去的计数器不是很快乐吗?一行代码如何获得一个进度表,其中包含有关您的代码的统计信息? one_line_progress_meter(title, c ...

  7. abp(net core)+easyui+efcore实现仓储管理系统——模块管理升级(六十)

    Abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统--ABP总体介绍(一) abp(net core)+ ...

  8. TEMP_FAILURE_RETRY宏的用法

    #define TEMP_FAILURE_RETRY(expression) \     (__extension__\      ({ long int __result;\          do ...

  9. 【Ubuntu】5. 根目录结构+常用指令

    根目录结构 /:根目录,是所有目录的起始点,所有文件和目录都在根目录下. /bin:重要的二进制应用程序,如ls.cp.mv等. /boot:启动配置文件,如内核.引导加载器等. /dev:设备文件, ...

  10. Centos环境下部分中间件“rabbitmq、rocketmq、clickhouse”部署

    部分中间件部署 目录 部分中间件部署 docker部署rabbitmq docker部署rocketmq 单机部署clickhouse docker部署rabbitmq # 拉镜像 docker pu ...