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. 深入理解 Python 虚拟机:字典(dict)的实现原理及源码剖析

    深入理解 Python 虚拟机:字典(dict)的实现原理及源码剖析 在本篇文章当中主要给大家深入介绍一下在 cpython 当中字典的实现原理,在本篇文章当中主要介绍在早期 python3 当中的版 ...

  2. Java面试——开源框架知识

    一.简单讲讲 Tomcat结构,以及其类加载器流程,线程模型等 [1]模块组成结构:Tomcat 的核心组件就 Connector 和 Container,一个Connector+一个Containe ...

  3. Logoist - 适用于设计师以及初次使用者的快速制作精美 logo 工具

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/24c0f566dcf14be2aa72afaa78c87c40.png)>从简单的标识到设计开发.它只需要一点 ...

  4. window.onload / onscroll/onresize 事件

    onload当文档加载完成后执行一些操作 window.onload = function(){ console.log("页面加载完成") } onscroll当页面发生滚动时执 ...

  5. [ACM]TL-Prim

    #include<iostream> #include<cstdio> using namespace std; int main(){ int inf = 99999999; ...

  6. 随机服务系统模拟—R实现(三)

    M/M/c随机服务系统的模拟 M/M/1服务系统:(1)队列长度没有限制:(2)顾客到达的时间间隔和服务时间均服从指数分布:(3)服务台数量为c. 一.M/M/c随机服务系统的模拟 在M/M/c排队系 ...

  7. 搭建DHCP服务,实现自动分配地址

    DHCP实现原理 DHCP定义 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作.它是一种流行的Clien ...

  8. 用 Go 剑指 Offer 11. 旋转数组的最小数字

    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组 nums = [0,1,4,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [ ...

  9. .NET Core MongoDB数据仓储和工作单元模式封装

    前言 上一章我们把系统所需要的MongoDB集合设计好了,这一章我们的主要任务是使用.NET Core应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式,因为本章内容涵盖的有点多关 ...

  10. 为什么一定要用Redis?

    参考: 为什么分布式一定要有Redis? 选redis还是memcache,源码怎么说?