为了澄清,我要求多边形仅覆盖栅格的非零(或非nodata)像素,而不覆盖整个矩形栅格。到目前为止,大多数答案都给出一个覆盖数据以及非数据像素的矩形多边形。
我的图像
我检查过的工具给出的结果(例如光栅目录,各种Arcscript,答案中给出的自定义Python脚本):
我想要的结果:
#1 楼
QGIS中有一个名为Image Boundary的插件。这是一个很棒的工具。在此工具中,有一个“有效像素”选项,例如,它将忽略卫星图像的黑色边缘。[更新:此插件不再存在,如QGIS 3.12.3 。插件“图像足迹”已存在,但已弃用,似乎无法使用。]
评论
这个插件声称可以完成我想要的操作,但是在我尝试过的图像上却失败了。明天我将尝试使用我的真实数据。
–德夫达塔(Devdatta Tengshe)
2012年6月6日13:56
我发现该插件与多光谱数据配合得很好,但有时单波段大面积图像会产生奇怪的结果。
–德夫达塔(Devdatta Tengshe)
2012年6月8日14:25
我同意QGIS图像边界效果最好,但是有一个工具可以对矢量文件执行此操作,而在这些文件中我们不需要“边界框”或“足迹”,而需要一个概述数据存在的多边形。
–GeorgeC
2012年8月7日在6:07
图像边界工具很棒,但是,您提供的链接是404。我相信如果您在插件设置中允许使用实验性插件,这些工具仍然可用。也许使用此链接?:github.com/lmotta/imagefootprint_plugin
–亚伦♦
18-2-27在3:54
是否有使用图像边界的任何文档?
– Loonuh
19年1月15日在17:08
#2 楼
以下代码将获取输入栅格,获取其范围,并将该范围插入到面要素类中:import arcpy
r = arcpy.Raster(in_raster)
point = arcpy.Point()
array = arcpy.Array()
corners = ["lowerLeft", "lowerRight", "upperRight", "upperLeft"]
cursor = arcpy.InsertCursor(fc)
feat = cursor.newRow()
for corner in corners:
point.X = getattr(r.extent, "%s" % corner).X
point.Y = getattr(r.extent, "%s" % corner).Y
array.add(point)
array.add(array.getObject(0))
print len(array)
polygon = arcpy.Polygon(array)
feat.shape = polygon
cursor.insertRow(feat)
array.removeAll()
del feat
del cursor
您可以通过设置在ArcMap Python窗口中运行它将
in_raster
和fc
像这样:>>> fc = 'r_extent'
>>> in_raster = 'CaliCoast10mNED_HavCurvedPCS'
其中
r_extent
是现有的面要素类。然后只需复制代码并运行它。我知道了:评论
我已使用上面的代码对文件夹执行相同操作:gist.github.com/4162013
–杰布
2012年11月28日15:33
#3 楼
您可以为此使用gdaltindex:http://www.gdal.org/gdaltindex.html但是它将仍然在与图像相同的参考系统中创建矩形(例如4 + 1点)。但我想知道这是否真的是一个问题:您的图片有多大?
评论
gdaltindex的问题在于,它会为每个图像创建一个矩形多边形。我只对非零值像素感兴趣
–德夫达塔(Devdatta Tengshe)
2012年6月6日下午13:57
#4 楼
如果您对脚本解决方案感兴趣,请尝试使用gdal命令nearblack。您也可以使用标志-white来检索以空格为边界的数据。您可以将输出多边形化以生成栅格数据的非矩形轮廓。##run nearblack
shellcmds = "nearblack -white -o " + outpath + " " + inpath
os.system(shellcmds)
##run polygonize
shellcmds = "gdal_polygonize.py " + outpath + " -f" + """ "ESRI Shapefile" """ + outpath2 + " nearblack"
os.system(shellcmds)
#5 楼
我在QGIS中尝试了“图像边界”工具,但是它对某些栅格失败。对我有用的另一个选项是:
通过使用gdal_translate命令行将输入栅格转换为单个数字实用程序。
gdal_translate -co compress=lzw -b 1 -ot byte -scale 1 1 inp.tif out.tif
这将在inp.tif中具有非零值的所有地方创建值为1的栅格。 “多边形”工具来获取多边形(shapefile)。
输出shapefile将具有非四边形边界,并具有多个多边形顶点,并遵循图像的实际边界。
#6 楼
以前的答案适用于QGIS2.x。如果您在2020年之后阅读此内容,您会发现答案不起作用。与QGIS 3.x兼容的是名为IBAMA Processing的插件。
安装此插件,然后您将在Processing Toolbox中获得“创建图像的足迹”工具/算法。
评论
似乎创建栅格目录,即使暂时创建栅格目录也是一个很好的解决方案。您可以创建一个不受管理的目录,该目录创建一个引用表,但是将图像保留在服务器上的位置。将栅格批量导入目录很容易,而且相对较快。创建足迹后,可以将轮廓导出到新的要素类并删除栅格目录。这可能和其他选项一样快。镶嵌数据集还可以生成图像足迹。
镶嵌数据集是必经之路。非常容易实现
那么在最后一张图像中,红色框NoData或0之外的像素是吗?如果它们是0,那么您想要的区域中是否有像素也是0值?
红色边框之外的像素为无数据;但是我的多光谱数据具有0,0,0作为nodata区域的RGB值。在这两种情况下,所需区域内都没有值为0的像素。