2

私はここでいくつかの異なることをしようとしています..

まず、シェープファイルの集水域ポリゴンの「形状」フィールドからの値の配列があります。

Rarray = watershed.shape.getPart(0)

ZMinが最も低い値が流出点になると想定しています。したがって、ZMin 座標は流出点 (p1) になります。

私がやろうとしているのは、この x、y、z 流出点から最も遠いポリゴン配列内の点 (p2) を見つけることです。配列内の値の 1 つである必要があります

そこから、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実際に の流出点の x,y 値を含むオブジェクトであり、最も遠い点の x,y を含むZMin場合、式はp2ZMax

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

は実際には 2 点間の距離です。2 点 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

p2を見つける

標高として Z 座標もある場合、問題は幾何学的である可能性があります。3D 空間の 2 点間の直線距離を求めるには、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 に答える
0

It seems that p1 should be the point of outflow, but you still have to somehow determine what p2 is, which is the point in your watershed polygon that's furthest away from p1.

To find p2, I'll assume you know the points that are the vertices of the watershed polygon. Try to make a list of them, which I'll call poly. You want to find the point on the polygon boundary that is furthest from the outflow point, 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

If you already know p2, you can find the distance between p1 and p2 quite easily. For better readability, I would recommend using the norm function from numpy, or else write your own:

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

depending on how p1 and p2 are formatted (e.g., as numpy arrays), this could be written as:

ReliefRat = (ZMax-ZMin)/norm(p2 - p1)
于 2013-03-08T17:33:50.513 に答える
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 に答える