首页 > 编程语言 >基于Python和GDAL提取栅格数据相邻地物的边界

基于Python和GDAL提取栅格数据相邻地物的边界

时间:2022-12-18 17:34:40浏览次数:62  
标签:colsPin Python DataPin 栅格数据 int np rowsPin ds GDAL

摘录于 https://blog.csdn.net/weixin_43123242/article/details/93525175

1.下载第三方包

在网址 https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml下载对应python版本的whl文件。如,GDAL‑3.0.0‑cp38‑cp38m‑win32.whl。

pip install numpy
pip install GDAL‑3.0.0‑cp38‑cp38m‑win32.whl

2、代码

from osgeo import gdal, gdalconst
from osgeo.gdalconst import *
import numpy as np
import sys
np.set_printoptions(threshold = 1e6) 
#设置输入和输出参数
#参数1:输入待计算边界的原始TIFF影像
#参数2:计算的结果影像文件(TIFF文件)
#参数3:参数1中的待计算的焦点像元值
#参数4:用于计算边界像元的邻域算子窗口大小
#参数5:参数1中的待计算的邻域像元值
Input = sys.argv[1].replace('\\','/')
FocusPoint = int(sys.argv[2])
ZoneNear = int(sys.argv[3])
NeiOpe = int(sys.argv[4])
Output = sys.argv[5].replace('\\','/')
#读取栅格数据
ds = gdal.Open(Input,GA_ReadOnly)
if ds is None:
    print(Input)
cols = ds.RasterXSize
rows = ds.RasterYSize
geotransform = ds.GetGeoTransform()
geoProjection = ds.GetProjection()
pixelWidth = geotransform[1]
pixelHeight = geotransform[5]
band = ds.GetRasterBand(1)
data = band.ReadAsArray(0, 0, cols, rows)
data = data.astype(np.int)
Ordata = np.array(data,dtype = int)
#基于原始数据构造二元值
UniqueValue = np.unique(Ordata)#计算唯一像元值
OnlyFocusPoint = np.where(Ordata == FocusPoint, 0, -1)
OnlyZoneNear = np.where(Ordata == ZoneNear, 2, 0)
FZ = OnlyFocusPoint + OnlyZoneNear
ReData = np.where(FZ == -1, 0, FZ)
#拼接数据
row0 = np.zeros([1,cols], dtype = int)
col0 = np.zeros([rows+2,1], dtype = int)
rowPinRow = np.r_[row0,ReData,row0]
rowPinCol = np.c_[col0,rowPinRow,col0]
DataPin = rowPinCol
rowsPin = np.shape(DataPin)[0]
colsPin = np.shape(DataPin)[1]
outData = np.zeros([rowsPin,colsPin],dtype = np.int)
#构造切片
if NeiOpe == 8: 
    #8邻域,不包括中心像元
    outData[1:rowsPin-1,1:colsPin-1] = (DataPin[0:rowsPin-2,0:colsPin-2] + DataPin[0:rowsPin-2,1:colsPin-1] + DataPin[0:rowsPin-2,2:colsPin] + DataPin[1:rowsPin-1,0:colsPin-2] + DataPin[1:rowsPin-1,2:colsPin] + DataPin[2:rowsPin,0:colsPin-2] + DataPin[2:rowsPin,1:colsPin-1] + DataPin[2:rowsPin,2:colsPin])
elif NeiOpe == 4:
    #4邻域,不包括中心像元
    outData[1:rowsPin-1,1:colsPin-1] = (DataPin[0:rowsPin-2,1:colsPin-1] + DataPin[1:rowsPin-1, 0:colsPin-2] + DataPin[1:rowsPin-1,2:colsPin] + DataPin[2:rowsPin,1:colsPin-1])
else:
    print('Only 4 or 8')
ResultData = outData[1:rowsPin-1,1:colsPin-1]
#构造淹没
Mask = np.where(Ordata == FocusPoint, 0, np.nan)
EdgeData = np.array(Mask + ResultData)
#新建栅格用于存放EdgeData
driver = gdal.GetDriverByName("GTiff")
outDataset = driver.Create(Output, cols, rows, 1, gdal.GDT_Int16)
outDataset.SetGeoTransform(geotransform) 
outDataset.SetProjection(geoProjection)
outBand = outDataset.GetRasterBand(1)
outBand.WriteArray(EdgeData)
outBand.SetNoDataValue(0)
outDataset.FlushCache()
#至此计算指定像元值的焦点像元邻域中特地像元值的像元个数计算完成
#若计算出具体的边界长度,可用pixelWidth或pixelHeight乘以EdgeData计算即可
print('Done')

3.原图像文件&计算结果

原始图像

 

 提取边界的结果图(4领域)

 

 图3 提取边界的结果图(8领域)

 

标签:colsPin,Python,DataPin,栅格数据,int,np,rowsPin,ds,GDAL
From: https://www.cnblogs.com/suoyike1001/p/16990628.html

相关文章

  • Python__06--基本数据类型
    1常用数据类型1.1整数int0b开头二进制0o八进制0x十六进制默认十进制1.2浮点数float3.14159浮点数计算,存在小数位不精确的问题测试代码:fromdecimalimport......
  • python 爬虫 获取IP代理池
    1importrequests2fromlxmlimportetree34defrequest_header():5headers={6'User-Agent':"Mozilla/5.0(WindowsNT10.0;Win64;x6......
  • .net 类似python写法例子
    1//[3]*102Enumerable.Range(0,10).ToArray();34//[X*2forxinrange(5)ifx%3==0]5Enumerable.Range(0,5).Select(x=>x*2).ToArray();67//m......
  • python load数据时出现各种问题
    data_raw=np.load(data_path,allow_pickle=True).item() 1..  2.pickle.load的时候出现EOFError:Ranoutofinput解决方法:删掉该条数据即可。......
  • ArcGIS-ArcMap-提取栅格数据的矢量范围
    利用Arcgis软件,提取栅格数据的矢量范围面。工具位置:ArcMap工具箱(ArcToolbox→3D分析(3DAnalystTools)→转换(Conversion)→由栅格转出(FromRaster)→栅格范围(RasterDomain......
  • python控制数字精度
    python控制数字精度在我们考试的时候,总会出现让我们保留几位小数的情况,这里我们直接使用round()函数round(想保留小数的变量,保留几位小数)默认是四舍五入成整数,后面即......
  • Python-提取地形起伏度最佳分析窗口
    地形起伏度是指在一定区域范围内的最大高程与最小高程之差.反映在DEM上,就是指分析区域内,栅格最大值与最小值的差异,表示分析区域的高程起伏情况.地形起伏度的计算公......
  • 前缀树(Tire)—Python
    核心思想空间换时间,是一种用于快速减速的多叉树结构,利用字符串的公共前缀来降低时间优缺点:优点:查询效率高,减少字符比较缺点:内存消耗较大每次都会从头向下一直到字符串......
  • Python-批量计算城市热岛强度(Urban Heat Island Intensity, UHII)
    数据准备城市热岛强度(UrbanHeatIslandIntensity,UHII)表示热岛效应的发生程度,在本文中将UHII定义为建成区块平均地表温度与其缓冲区平均地表温度的差值.计算公式......
  • PYTHON 模块 - configparser
    1.1configparser模块这个模块是用于解析配置文件1.1.1配置文件的格式[section]key=valuekey=value...[section]key=valuekey=value...1.2读取信......