救助比率 - 帮助寻找多边形zm中距排水口最远的点
我正在尝试做几件不同的事情……
首先,我有一个数组,这个数组是从一个叫做“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 个回答
如果 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 属性的点对象类,可以单独问这个问题,或者修改你的问题。如果你不知道如何找到一个多边形上离某个点最远的点,也可以问这个。
我不太明白关于流域的 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 的值。

如果有很多这样的节点放在一个列表里,那么你只需要遍历这个列表,寻找最大的差值就可以了。
寻找 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 就应该被找到。