救助比率 - 帮助寻找多边形zm中距排水口最远的点

2 投票
4 回答
964 浏览
提问于 2025-04-17 18:26

我正在尝试做几件不同的事情……

首先,我有一个数组,这个数组是从一个叫做“shapefile”的文件中提取的,里面包含了流域多边形的“形状”字段的值。

Rarray = watershed.shape.getPart(0)

我假设流出的点是ZMin值最低的那个。所以,ZMin的坐标就是流出点(p1)。

接下来,我想在这个多边形数组中找到一个点(p2),它离这个x,y,z的流出点最远。这个点应该是数组中的一个值。

然后,我想计算p1(流出点)和p2(最远的点)之间的距离,这样我就可以用这个值来计算流域的高程比,使用这个公式:

ReliefRat = (max elevation - min elevation) / Length of longest axis

到目前为止,我有这个……

Rarray = watershed.shape.getPart(0)
ReliefRat = (ZMax-ZMin)/(((p2.X-p1.X)**(2.0)) + ((p2.Y-p1.Y)**(2.0)))**(0.5)

……其中p1是流出点。我就是不知道怎么找到p2。

如果有人能帮我一步步讲解一下,我将非常感激!

4 个回答

0

如果 p1 是一个包含出流点的 x 和 y 值的对象,并且 p2 包含最远点的 x 和 y 值(对应于 ZMax),那么下面这个表达式

(((p2.X-p1.X)**(2.0)) + ((p2.Y-p1.Y)**(2.0)))**(0.5)

实际上就是这两个点之间的距离。这其实是一个关于勾股定理的表达,因为在两个点 p1 和 p2 之间的直线是一个直角三角形的斜边,底边是 p2.X 减去 p1.X,高是 p2.Y 减去 p1.Y。注意,如果你对计算平方根的几种方法感兴趣,可以看看“在 Python 中,x**.5 和 math.sqrt(x) 哪个更快?”。

如果你还没有定义一个包含 X 和 Y 属性的点对象类,可以单独问这个问题,或者修改你的问题。如果你不知道如何找到一个多边形上离某个点最远的点,也可以问这个。

0

我不太明白关于流域的 relief ratio(地形比率)等概念,但感觉这和找点之间的距离有关。
我发现用复数来做这个事情很方便。Python 默认支持复数。你可以把一个点(最低点)和一些在 x,y 坐标系统中的节点看作是这样的:

>>> # Lowest point:
... z0 = complex(5, 8)
>>> # A few nodes:
... z1 = complex(5, 10)
>>> z2 = complex(-2, 15)
>>> abs(z1 - z0)
2.0
>>> # Abs give a scalar so order is not important:
... abs(z0 - z1)
2.0
>>> abs(z2 - z0)
9.8994949366116654
>>> # The vector between lowest point z0 and node z2 was the longest axis

通过 z0.real 和 z0.imag,你可以分别提取出 x 和 y 的值。

enter image description here

如果有很多这样的节点放在一个列表里,那么你只需要遍历这个列表,寻找最大的差值就可以了。

0

寻找 p2

如果你还有 z 坐标作为高度,那么这个问题可能是几何方面的。要在三维空间中找到两个点之间的直线距离,就需要考虑 z 这个维度。假设你有一些辅助代码如下:

class P():
    """A point in 3d space."""
    def __init__(self, x = 0.0, y = 0.0, z = 0.0):
        self.x = float(x)
        self.y = float(y)
        self.z = float(z)

    def __str__(self):
        return str(self.x) + ', ' + str(self.y) + ', ' + str(self.z)

    def __repr__(self):
        return str(self.x) + ', ' + str(self.y) + ', ' + str(self.z)

def dist(p0, p1):
    """Return the straight distance in 3d space between point p0 and p1
    as an absolute value."""
    x0, y0, z0 = p0.x, p0.y, p0.z
    x1, y1, z1 = p1.x, p1.y, p1.z

    return ((x1 - x0)**2 + (y1 - y0)**2 + (z1 - z0)**2)**(1 / 2.0)

接下来,我在空间中创建了一些点:

>>> p1 = P(5, 5, -3) # Outflow point
>>> p2 = P(40, -20, 45)
>>> p3 = P(-5, 30, 40)
>>> p4 = P(-2, 25, 22)
>>> arr = [p2, p3, p4] # An array (list) of 3d points.
>>> p2find = p1 # For the search.

>>> for point in arr:
...    if dist(p1, point) > dist(p1, p2find):
...       p2find = point
... 
>>> p2find
40.0, -20.0, 45.0
>>> p2
40.0, -20.0, 45.0

所以,最远的点 p2 就应该被找到。

撰写回答