我正在尝试做一些不同的事情......
首先,我在shapefile中的分水岭'shape'字段中有一组值。
Rarray = watershed.shape.getPart(0)
我假设流出点将是具有最低ZMin的值。因此,ZMin坐标将是流出点(p1)。
我想要做的是找到多边形数组中距离此x,y,z流出点最远的点(p2)。它应该是数组中的一个值
从那里,我试图计算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。
如果有人可以指引我完成这一点,我们将不胜感激!
答案 0 :(得分:0)
如果p1
确实是一个对象,其中包含ZMin
的流出点的x,y值,如果p2
包含x,则ZMax
最远点为y ,然后是表达式
(((p2.X-p1.X)**(2.0)) + ((p2.Y-p1.Y)**(2.0)))**(0.5)
确实是两点之间的距离。这只是Pythagorean theorem的表达式,因为两点p1和p2之间的直线是直角三角形的斜边,其基数为p2.X-p1.X,高度为p2.Y-p1.Y。注意,如果对计算平方根的几种方法感兴趣,请参阅“Which is faster in Python: x**.5 or math.sqrt(x)?”。
如果你还没有定义一个具有X和Y属性的点对象类,请单独询问或修改问题,同样如果你不知道如何找到距离某些点最远的多边形上的点其他一点。
答案 1 :(得分:0)
似乎p1
应该是流出点,但你仍然必须以某种方式确定p2
是什么,这是你的分水岭多边形中离p1
最远的点。
要查找p2
,我会假设您知道分水岭多边形的顶点。尝试列出它们,我称之为poly
。您希望在多边形边界上找到离流出点最远的点p1
:
import numpy as np
poly = np.array([(1.1,5.3),(1.5,2.3),(2.1,3.2),(4.3,4.4)]) # vertices of a polygon
p1 = np.array((1.2,3.5)) # outflow point
ds = map(norm,p1 - poly) # list of distances between p1 and each vertex of polygon
d_max = max(ds) # max of those distances
ReliefRat = (ZMax-ZMin)/d_max
如果您已经知道p2
,则可以非常轻松地找到p1
和p2
之间的距离。为了更好的可读性,我建议使用norm
中的numpy
函数,或者编写自己的函数:
from numpy import norm
ReliefRat = (ZMax-ZMin)/norm((p2.X-p1.X,p2.Y-p1.Y))
取决于格式p1
和p2
的格式(例如,作为numpy数组),可以写成:
ReliefRat = (ZMax-ZMin)/norm(p2 - p1)
答案 2 :(得分:0)
不确定我是否了解有关流域缓解率的概念等,但感觉这是关于找到点之间的距离。
我发现使用复数为此目的很方便。 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值。
如果像这样的很多节点都填充在列表中,那么迭代和搜索最大差异将是一个问题。
答案 3 :(得分:0)
如果您还将z坐标作为高程,则问题可能是几何的。找到3d空间中两点之间的直线距离需要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。