2

我在这里尝试做一些不同的事情..

首先,我在 shapefile 中有一组来自分水岭多边形“形状”字段的值。

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。

如果有人可以指导我完成此操作,将不胜感激!

4

4 回答 4

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之间的距离。为了更好的可读性,我建议使用from 函数,或者自己编写:p1p2normnumpy

from numpy import norm
ReliefRat = (ZMax-ZMin)/norm((p2.X-p1.X,p2.Y-p1.Y))

根据格式化方式p1p2格式(例如,作为 numpy 数组),这可以写成:

ReliefRat = (ZMax-ZMin)/norm(p2 - p1)
于 2013-03-08T17:33:50.513 回答
0

如果p1确实是一个包含流出点的 x,y 值的对象ZMin,并且如果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 的直角三角形的斜边。请注意,请参阅“<a href="https://stackoverflow.com/questions/327002">哪个在 Python 中更快:x**.5 或 math.sqrt(x)?” 如果对计算平方根的几种方法感兴趣。

如果您尚未定义具有 X 和 Y 属性的点对象类,请单独询问或修改问题,同样如果您不知道如何在距其他点最远的多边形上找到点。

于 2013-03-08T17:29:06.463 回答
0

不确定我是否理解有关流域地形等的概念,但感觉这是关于寻找点之间的距离。
我发现为此目的使用复数很方便。Python 对它有默认支持。我了解您在 ax,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 值。 在此处输入图像描述

如果像这样的很多节点都塞在一个列表中,那将是迭代和搜索最大差异的问题。

于 2013-03-08T22:51:00.073 回答
0

寻找 p2

如果您还有 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。

于 2013-03-09T18:33:48.227 回答