查找基于矢量点的最近栅格像元值?


9

我在ArcGIS中有两层:一层是矢量点,另一层是栅格层。我想将栅格数据网格的值附加到矢量点。问题在于矢量点远离任何具有值的现有栅格网格,因此命令“ Sample”不为这些矢量点返回任何值。

所以我的问题是:如何在给定矢量点的情况下找到最近的栅格像元并从像元中提取值?

实际上,我需要做两件事:

  1. 识别测距仪内的轮廓绘制器(通常距离我现有的栅格1-2个像元)
  2. 如果它们在范围内,则从最近的栅格中为其分配一个值

编辑:我有大约3000矢量点,我的问题是: 在此处输入图片说明

我需要根据位置将栅格值附加到矢量点上。我使用了“样本”工具,它在大多数情况下都适用。

但是,有这样的情况 在此处输入图片说明

右边的点可以从栅格中获取值(“ Sample”有效),但是左边的点由于对齐问题而不能。

栅格转多边形不起作用,因为出现错误消息,因为它们不在域之内,所以无法将它们转换为矢量。我也有这样的观点在此处输入图片说明

这些高点不应获得任何值,因为它们离栅格太远。

我想到了一些解决方法:

步骤1.首先进行“采样”

步骤2.在“样本”操作之后选择空值

步骤3.根据零点构造缓冲区(小数点后1位以内)

步骤4.使用区域统计???或其他工具来遍历缓冲区中的所有栅格像元,找到最接近的栅格像元,提取其值并将其放在矢量点中。

我陷入了第4步。我不知道我可以使用ArcSDK中的哪个工具来实现此功能。

否则...您有更好的主意应对吗?

我有20个这样的栅格图层,我想自动制作(使用模型生成器和arcobject)。


@whuber:您的方法听起来很聪明。我的问题是我正在全球范围内处理数据,如何确定轮廓栅格的x0和x1?
看到

将其添加到项目后,检查其属性。
ub

1
区域统计是死胡同。根据您的编辑,有一个简单的直接解决方案:稍微扩展其边界周围的栅格并对扩展的栅格进行采样。有很多方法可以做到这一点,但是它们都需要一点点的栅格计算功能。最简单的方法之一是扩大分析范围,计算焦点平均值,然后(使用“ con”)将其值粘贴到NoData边界区域中。这会将附近栅格值的平均值分配给每个非栅格样本位置。
ub

@whuber还有一个问题是我不知道大纲显示在哪里。因此,在我的过程中实际上有2个过程:识别大纲并为其指定值。
看到

什么是“外人”?如果该点未包含在栅格值中,那么您将不禁找到它们:这些点将在您应用该Sample工具时不接收任何值。
ub

Answers:


8

栅格轮廓占据一个矩形,该矩形的左下角由原点界定,坐标为(例如)(x0,y0),右上角为(x1,y1):这些是任何栅格中容易发现的属性。您可以使用此信息将栅格范围之外的任何点移至栅格边界上的最近点,并在新位置提取栅格值。

这样的任务通常很容易通过考虑较小的尺寸来解决。一维栅格的范围只是一个数字区间,例如从x0到x1> x0,通常写为[x0,x1]。假设您要在此间隔中找到最接近给定数字x的点。共有三种情况:x <x0(x在左边),x0 <= x <= x1(x在间隔中)和x1 <x(x在右边)。显然,最接近的点分别是x0,x和x1。此结果的公式是

x->最小值(max(x,x0),x1),

正如您通过分别考虑这三种情况所看到的。

因为栅格的范围是两个间隔的笛卡尔积[x0,x1] * [y0,y1],所以相同的公式在二维中有效。 只需将其应用于每个间隔。因此,可以将投影点的坐标计算为(例如,在Field Calculator中)

(x,y)->(min(max(x,x0),x1),min(max(y,y0),y1)。

这是一个有效的公式,其中100个点随机分布在网格范围内和范围内:

数字

虚线在视觉上将范围外部的点关联到它们将要移动的位置。

从这些计算出的坐标创建一个点图层,然后应用该Sample工具提取栅格值。将结果连接回原始点图层。

实际上,为避免浮点舍入可能使新点不位于网格范围内的问题,明智的做法是使x0和y0略大于真实原点(您可以将像元大小加一半)同样,使x1和y1略小。

总而言之,工作流包括在原始点图层的表中计算两个字段(新坐标),从这些新坐标创建点事件层,运行Sample工具以及执行数据库联接(而非空间联接)。


如果向量点多于栅格中的像元,则应首选@celenius(他建议将栅格转换为点并使用空间连接)给出的解决方案。不过,通常情况下,栅格中有很多像元-数百万至数十亿-转换为点既费时又费磁盘,因此应谨慎处理。

另外,您可以通过使用栅格计算来制作沿其边界具有值的整数网格来加快Celenius的解决方案。将转换为点图层是快速,容易的,因为它将只有很少的点。我们称其为“边界层”。在边界层点对网格进行采样,从而将网格值复制到边界层的属性表中。Sample使用原始点图层运行后,删除成功获取样本的所有点。在空间上将边界层连接到其余点以完成采样过程。

制作仅沿其边界具有值的网格的一种方法是应用沿边界失败的焦点邻域操作:示例包括查找坡度,山体阴影,3 x 3邻域焦点统计信息。这将创建一个具有单单元格的网格NoData在其边缘周围的粗环。使用IsNull和SetNull检测NoData像元并在NoData和数据像元之间转换会产生一个边界以外充满NoData值的网格。)


总而言之,工作流包括在原始点图层的表中计算两个字段(新坐标),从这些新坐标创建点事件层,运行示例工具以及执行数据库联接(而非空间联接)。 您能否详细说明如何执行此操作?(您可以查看我的照片了解我的问题)。谢谢!
看到

我大约有15%的积分有这个问题。如何确定每个点的x0和x1?
看到

1
@看到x0,y0,x1,y1用于网格。 点坐标(x,y)可以按ArcGIS帮助中所述在“字段计算器”中进行计算,也可以在此站点上的多个线程中进行计算。有一些菜单项用于制作XY点图层和数据库连接:这些是标准的基本操作。
ub

4

您可以将栅格转换为点(ref),然后对这些点(从栅格)到该点进行空间连接。

(我刚刚了解到,昨天可以在空间上连接点了)


1
+1是一种聪明的方法。对于无法实现的大型栅格,仅将栅格的边界像元转换为点。(我在回信末尾描述了如何。)
呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜呜还将把把最好的男人做主

我每个栅格图层都有成千上万个像元,而我有20个像这样的图层...所以将它们变成矢量点非常耗时...
看到

另外,当我尝试对多边形进行栅格化时,收到错误消息,错误为ERROR 000864输入栅格:输入不在定义的域内。错误000863:无效的GP数据类型
看到

将栅格转换为点时会出错吗?
djq 2011年

@celenius可以,但是花了很长时间。
看到

1

您可以使用“栅格转多边形”工具将栅格图层转换为多边形,然后运行空间连接(右键单击点图层并选择“连接和关联-接合”,在第一个下拉列表中选择空间连接选项,然后选择最接近的或使用“附近”工具。


如何使用空间连接的结果来提取适当的栅格值?
ub

@whuber,在“连接数据”对话框中,选择“最接近”选项时,空间连接将选择最近的多边形要素(从“栅格转多边形”工具获得的结果)并将此属性信息添加到点要素。这是您的问题要问的吗?我的最初答复是在他进行编辑之前发布的。我猜测Seen的栅格可能太大,无法转换为多边形?
艺术品21年

这个想法不是要找到最近的栅格。确实,需要的是一种超出其原始范围外推栅格值的方法。该问题提出了一种最接近的邻居方法:在栅格上不在附近的任何点上,找到栅格中最近的像元并使用该像元的值。
ub

重新阅读您的最后一条评论后,似乎您可能打算将栅格不是变成“多边形”,而是变成一个多边形层,每个像元(或相邻的一组像元)具有一个多边形。如果是这样的话,它可能会在很小的栅格上成功,但是为什么您建议这样做-这是一个复杂,昂贵的操作(并且仅适用于整数网格),而不是像以前那样提供类似但更有效的@celenius解决方案?您的解决方案提供什么优势?
ub

@whuber,多边形层是正确的。是的,celenius方法将花费更少的内存。
Artwork21年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.