草庐IT

python gdal Warp 矢量掩膜栅格

qq_17576739 2023-04-11 原文

目录

矢量裁剪栅格代码

 cropToCutline 裁剪效果

 cropToCline 是否设置的优缺点

从矢量文件中选择部分要素,进行栅格裁剪生成与原始栅格大小相同的掩膜文件tif

其他参数对裁剪效果的影像

参考


矢量裁剪栅格代码

from osgeo import gdal,gdalconst
shppath = r'D:\Africa\Africa_city.shp'
tifpath = r'D:\regionImg\VNL_2012Africa.tif'
outtif1 = r'D:\Africa\Africa_FID0.tif'
cutlineWhere = 'FID = 2485'
ds = gdal.Warp(
outtif1,    #裁剪后图像保存的完整路径(包括文件名)
tifpath,    #待裁剪的影像完整路径(包括文件名)
format='GTiff', # 保存图像的格式
cutlineDSName=shppath, # 矢量文件的完整路径
cropToCutline=True, # 保证裁剪后影像大小跟矢量文件的图框大小一致(设置为False时,结果图像大小会跟待裁剪影像大小一样,则会出现大量的空值区域)
cutlineWhere=cutlineWhere #矢量文件筛选条件,
#dstNodata=0
)

 cropToCutline 裁剪效果

cropToCutline=True, 裁剪出的影像大小与矢量图像相近。  

边界像元若不完全在矢量图形内,则大概率被裁剪掉(这里还不确定边界像元什么条件下被裁剪掉,因为有的边界像元会被留下,有的则被裁剪掉。)。

关于掩膜像元(下图左,绿色部分),即裁剪后的栅格中不在矢量图形内的像元。若dstNodata不设置,则设为0,不作为Nodata。若dstNodata设置,则dstNodata设置的值作为Nodata的值,掩膜像元都设为nodata。dstNodata不设置,则裁剪后的栅格影像的nodata的设置取决于原始影像。此时若原始影像的nodata也没有设置,则掩膜像元值为0,否则掩膜像元为nodata,值为nodata对应的值。

cropToCutline=True (左:不设dstNodata,右:设dstNodata=-1)
dstNodata未设置
掩膜像元值为0

dstNodata=-1,掩膜像元为nodata

裁剪了两个tif

cropToCutline=False, 裁剪出的影像大小与原始栅格大小相同。不在矢量内的像元被掩膜。

cropToCutline=False (不设置dstNodata,绿色部分为掩膜像元)
裁剪后全局
缩放到矢量图像大小
FID=2473

 cropToCline 是否设置的优缺点

cropToCline=True

1)裁剪出的栅格较小,大小接近shp,裁剪速度较快,减小了后续加载、读、写、统计等的负担。

2)裁剪的栅格并不完全覆盖到矢量边界,与矢量边界之间有空隙。

cropToCline=False

1)裁剪出的栅格较大,与原始栅格相同。裁剪速度较慢。

2)裁剪的栅格也并不完全覆盖到矢量边界,有的图形裁剪会覆盖,有的没有覆盖(若上图右侧FID=2473这个图形裁剪出来的结果就没有覆盖。)

统计不同区域像素值,我会更倾向于用cropToCline=False。虽然它的计算量大,也不是所有矢量裁剪后都是全覆盖该矢量图形,但连个公共边矢量分别裁剪得到的栅格合并是无缝隙的,这样统计的结果可能更好些。而用cropToCline=True分别裁剪后进行统计,感觉统计结果会偏小一点。

从矢量文件中选择部分要素,进行栅格裁剪生成与原始栅格大小相同的掩膜文件tif

def getMaskTifByShp(shp_path,tifpath,outTifpath,sql):
    '''选择矢量文件中的部分要素,裁剪栅格,生成与输入栅格同等大小的mask.tif。
    生成结果中,像元值1为目标像元,像元值0为掩膜像元。'''
    #获取栅格信息
    inDs = gdal.Open(tifpath)
    rows = inDs.RasterYSize
    cols = inDs.RasterXSize
    geotrans = inDs.GetGeoTransform()
    proj = inDs.GetProjection()
    #创建内存栅格
    mem = gdal.GetDriverByName('MEM')
    mid_ds = mem.Create('', cols, rows, 1, gdal.GDT_Byte)
    mid_ds.GetRasterBand(1).WriteArray(np.ones((rows, cols), dtype=np.bool))
    mid_ds.SetGeoTransform(geotrans)
    mid_ds.SetProjection(proj)
    # #裁剪生成内存mask
    # mask_ds = gdal.Warp('', mid_ds, format='MEM', cutlineDSName=shp_path,cropToCutline=False,cutlineWhere=sql)
    # #输出
    # gtiff = gdal.GetDriverByName('GTiff')
    # result = gtiff.CreateCopy(outTifpath, mask_ds)
    # result.FlushCache()
    # del result,inDs,mid_ds,mask_ds
    #裁剪生成mask
    mask_ds = gdal.Warp(outTifpath, mid_ds, format='GTiff', cutlineDSName=shp_path,cropToCutline=False,cutlineWhere=sql)
    #输出
    del inDs,mid_ds,mask_ds


shp_path = r'D:\Africa_city.shp'
tifpath = r'D:\VNL_2012Africa.tif'
outTifpath = r'D:\2485.tif'
sql = 'FID = 2485'
getMaskTifByShp(shp_path,tifpath,outTifpath,sql)

 首先在内存中创建dataset,数据类型为byte。裁剪生成mask,根据format设置可以在内存中生成mask或者直接输出到硬盘。

输出结果:

白色为裁剪出的区域(白色DN=1,黑色为DN=0)

其他参数对裁剪效果的影响

1、固定cropToCline = True

1)指定裁剪后栅格的输出分辨率。

这里指定裁剪后的栅格分辨率与原始影像相同。在显示指定与不指定两种情况下,虽然输出影像的分辨率是相同的,但裁剪结果仍有差别(如下图)。

#指定xRes,yRes
mask_ds = gdal.Warp(outtifpath, tifpath, format='GTiff', cutlineDSName=shp_path, cropToCutline=True, cutlineWhere=sql,xRes=500,yRes=500)

两者叠加
未指定输出分辨率
指定输出分辨率

2)cutlineBlend  以像素为单位的剪切线混合距离。

mask_ds = gdal.Warp(outtifpath, tifpath, format='GTiff', cutlineDSName=shp_path, cropToCutline=True, cutlineWhere=sql,cutlineBlend=0.15,xRes=500,yRes=500)
cutlineBlend=None
cutlineBlend=0.1
cutlineBlend=0.5
cutlineBlend=0.2

 

参考

在内存中创建裁剪后的栅格参考自:Python3.GDAL从shp文件生成mask_碎积云-CSDN博客 

WarpOptions介绍:Python GDAL学习笔记(二)_江北20190411的博客-CSDN博客

有关python gdal Warp 矢量掩膜栅格的更多相关文章

  1. 删除doc2vec的矢量初始化的随机化 - 2

    我正在使用预先训练的DOC2VEC弓模型(AP-News)。我正在做以下操作:importgensim.modelsasgstart_alpha=0.01infer_epoch=1000model="\\apnews_dbow\\doc2vec.bin"m=g.Doc2Vec.load(model)text='thisisasampletext'vec=m.infer_vector(text,alpha=start_alpha,steps=infer_epoch)但是,如果我再次计算同一文本的VEC,那么我将获得同一文本的不同矢量表示。为什么会发生这种情况,以及我该怎么做。如果我给出完全相同的

  2. javascript - 在传单中的 map 上显示栅格数据 - 2

    我在传单map上显示栅格数据时遇到问题。有一个浮点NxM数组和RGB比例。我想用彩色瓷砖添加新层。我试着只画矩形,但显示速度非常慢。我注意到方法L.GridLayer.extend(),但我没有找到任何我想要的示例(只是简单的网格,每个图block上都有坐标文本)。有人可以举例说明通过这种或任何其他方法显示的栅格数据吗? 最佳答案 如果您查看listofLeafletplugins,您会看到很多进行逐像素光栅操作的方法,包括:L.TileLayer.BPG:extendstilelayer,loadingatilemeansrend

  3. javascript - 如何修复 d3 制图栅格重投影上的 map 边界? - 2

    我尝试使用thisexample之后的map的光栅重投影.如果我将示例kavrayskiy7投影更改为等距方位Angular投影,varprojection=d3.geo.azimuthalEquidistant().scale(90).translate([width/2,height/2]).clipAngle(180-1e-3).precision(.1);它应该将地球投影到一个圆盘上(投影图的图像)。然而,光栅重投影超出了该圆盘并用扩展图片填充整个Canvas(逆投影函数不是单射的,map上的几个x/y点对应于一个经/纬度坐标)。在原来的例子中,这应该用行来避免if(λ>180

  4. javascript - 如何获取 GeoJSON 矢量源的范围? - 2

    我有这个GeoJSON文件(polygon.geojson)...{"type":"Feature","geometry":{"type":"Polygon","coordinates":[[[73,15],[83.0,15],[83,5],[73,5],[73,15]]]},"properties":{"name":"Foo"}}...并将其用作矢量源:varvectorSource=newol.source.Vector({url:'polygon.geojson',format:newol.format.GeoJSON(),projection:'EPSG:4326',});现在

  5. javascript - 如何为使用 Raphael JS 绘制的矢量路径制作动画? - 2

    如何为使用RaphaelJS绘制的矢量路径设置动画?我有一组坐标,我想使用RaphaelJS进行连接。在网格上,坐标是(x,y集合)。我想从一端开始,并在用户观看时“连接点”。最终产品看起来像这样:Picture9.pnghttp://img213.imageshack.us/img213/8013/picture9my.png理想情况下,我希望能够使路径弯曲,这样它们看起来更像这样(添加坐标以供引用):Picture10.pnghttp://img534.imageshack.us/img534/1789/picture10fc.png坐标是:26,-614,-125,-2011,-

  6. javascript - 在 2d 环境中以百分比增量将对象从矢量 A 移动到 B - 2

    我知道向量A和B的坐标。如何计算这两个向量之间的第一个点?第一个向量X是向量A和B之间距离的1%。所以首先我将向量A中的对象移动到向量B更近1%。所以我需要计算向量X,它是对象的新向量,直到它到达向量B. 最佳答案 你想要lerp荷兰国际集团作为引用,基本公式为:x=A+t*(B-A)其中t介于0和1之间。(超出该范围的任何值都使其成为外推。)检查当t=0时x=A和t=1时x=B。请注意,我的回答没有提到矢量或二维。 关于javascript-在2d环境中以百分比增量将对象从矢量A移动到

  7. javascript - 作为矢量 map 的谷歌地图 - 2

    我在每个地方都搜索过这个,我找到的最接近的不是很令人满意(this),有没有办法让谷歌地图看起来和表现得像jvectormap?我所说的表演是指可以悬停的国家等,而我所说的外观是指矢量图具有的简洁外观。 最佳答案 正如我评论中所建议的,您可以查看如何设置map样式:https://developers.google.com/maps/documentation/javascript/styling这可以帮助您了解它的工作原理,并最终让您构建自己的:GoogleMapsStylingWizard关于FusionTables,一旦找到合

  8. javascript - 浏览器 JavaScript 是否允许 SIMD 或矢量化操作? - 2

    我想用JavaScript编写需要大量数值计算的应用程序。但是,我对客户端JavaScript中类似线性代数的高效计算的状态感到非常困惑。似乎有很多方法,但没有明确表明它们已经准备就绪。他们中的大多数似乎对允许计算的向量和矩阵的大小有限制。WebGL显然允许在GPU上进行矢量和矩阵计算,但我不清楚限制。Attemptedwrappers这个库周围似乎限制了矩阵和向量的大小。这是实际限制(浏览器不支持其他任何东西)还是开发限制(需要有人编写代码)?WebCLWebCL是提议的OpenCL浏览器级实现,但是appearstobestuckindevelopment.WebGPUApple最

  9. javascript - 如何从多个文件导入图标以 react native 矢量图标? - 2

    如果我想在同一个文件中使用来自React原生矢量图标的Ionicons和MaterialDesign图标,我应该如何导入它?importIconfrom'react-native-vector-icons/MaterialIcons';(和)importIconfrom'react-native-vector-icons/Ionicons';在同一个文件中 最佳答案 在查看原始源文件后,我发现图标是这样导出的exportdefaulticonSet因此您可以使用任意名称来导入。在这种情况下,最终代码将如下所示:importMater

  10. go - 如何使用 API 平滑地栅格化 PDF? - 2

    我想使用thesegolangbindings光栅化PDF源(在本例中为PNG,500x500像素)对于ImageMagick6。在CLI上,我可以使用convert-density5000-definepsd:fit-page=500xtest.pdf-resize500xtest.png这会产生平滑渲染的图像。我现在没有做的是使用API生成类似的东西:生成的图像具有缩放像素或模糊且大小为500x500像素,或者它是“原始”大小。这是我的playground代码的最小片段:packagemainimport"gopkg.in/gographics/imagick.v2/imagick

随机推荐