0

私は現在、川沿いの場所を表す辞書を検索する再帰関数に取り組んでいます。ディクショナリは、キーとして使用して 4 つの並列配列にインデックスを付けstartます。

並列配列:

start= 累積流量が少ない終点の位置、

end= もう一方の終点の位置 (より大きな流れの蓄積を伴う)、

length= セグメントの長さ、および;

shape= 最初から最後まで実行するように方向付けられた実際の形状。

辞書:

G = {}
for (st,sh,le,en) in zip(start,shape,length,end):
    G[st] = (sh,le,en)

私の目標は、 で表される開始点の 1 つから川を下って検索し、 までp2000 メートル ( で表されるx) 間隔で場所を選択することendです。これは私がPythonで取り組んでいる再帰関数です:

def Downstream (p, x, G):
...     e = G[p]
...     if (IsNull(e)):
...         return ("Not Found")
...         if (x < 0):
...             return ("Invalid")
...             if (x < e.length):
...                 return (Along (e.shape, x))
...                 return (Downstream (e.end, x-e.length,G))

現在、入力するDownstream ("(1478475.0, 12065385.0)", 2000, G)とキーエラーが返されます。チェックkey in Gしたところ、キーは false を返しますが、検索すると、false を返すものを含めてG.keys ()表されるすべてのキーが返されます。start

たとえば、キーは(1478475.0, 12065385.0). このキーをテキストとして使用し、2 つの double 値のタプルと keyerror を両方とも返しました。

エラー:

Runtime error
Trackback (most recent call last):
 File “&lt;string>”, line 1, in <module>
 File “&lt;string>”, line 1, in Downstream
KeyError:  (1478475.0, 12065385.0)

キーエラーの原因と、この問題を解決して目標を達成するにはどうすればよいですか?

これはポリラインのシェープファイルの属性テーブルを使用しているため、ArcGIS で Python を使用しています。これは、再帰関数を使用する最初の試みです。

この質問と回答は、データを整理し、この再帰関数を作成する際に、どのようにしてこの時点に到達したかを示しています。

https://gis.stackexchange.com/questions/87649/select-points-approx-2000-metres-from-another-point-along-a-river

例:

>>> G.keys ()
[(1497315.0, 11965605.0), (1502535.0, 11967915.0), (1501785.0, 11968665.0)...

>>> print G
{(1497315.0, 11965605.0): (([1499342.3515172896, 11967472.92330054],), (7250.80302528,), (1501785.0, 11968665.0)), (1502535.0, 11967915.0): (([1502093.6057616705, 11968248.26139775],), (1218.82250994,), (1501785.0, 11968665.0)),...
4

1 に答える 1

2

関数が機能していない主な理由は次の 5 つです。

  1. 構文がオフです。Python ではインデントが重要です。
  2. p in G毎回呼び出されるかどうかをチェックしませんDownstream(最初のキーが存在する可能性がありますが、その後の再帰呼び出しはどうなりますか?)。
  3. ポイントが多すぎreturnます。たとえば、最後の行が実行されません(関数の出力はどうあるべきですか?);
  4. e = (sh, le, en)属性 ( e.end)で 3 タプルにアクセスしているようです。と
  5. 再帰的に呼び出すときに間隔の長さから減算しているため、関数はポイントがどれだけ離れているかを追跡できません.間隔と開始点からのオフセットを分離する必要があります.

代わりに、(未テスト!)のようなものが必要だと思います:

 def Downstream(start, interval, data, offset=0, out=None):
     if out is None:
         out = []
     if start in data:
         shape, length, end = data[start]
         length = length[0] 
         if interval < length:
             distance = offset
             while distance < length:
                 out.append(Along(shape, distance))
                 distance += interval
             distance -= interval
             Downstream(end, interval, data, interval - (length - distance), out)
         else:
             Downstream(end, interval, data, offset - length, out)
     return out

これにより、返されるもののリストが表示されAlongます。元の の場合start not in data、空のリストが返されます。

于 2014-03-05T17:01:13.310 に答える