4

このコードを実行しようとしていますが、

import osgeo.ogr

def findPoints(geometry, results):
    for i in range(geometry.GetPointCount()):
        x,y,z = geometry.GetPoint(i)
    if results['north'] == None or results['north'][1] < y:
        results['north'] = (x,y)
    if results['south'] == None or results['south'][1] > y:
        results['south'] = (x,y)
    for i in range(geometry.GetGeometryCount()):
        findPoints(geometry.GetGeometryRef(i), results)

shapefile = osgeo.ogr.Open("../../Data/tl_2009_us_state/tl_2009_us_state.shp")
layer = shapefile.GetLayer(0)
feature = layer.GetFeature(53)
geometry = feature.GetGeometryRef()

results = {'north' : None,
           'south' : None}

findPoints(geometry, results)

私は常にこのエラーを受け取ります。

Traceback (most recent call last):
  File "identify_northsouth_point.py", line 22, in <module>
    findPoints(geometry, results)
  File "identify_northsouth_point.py", line 8, in findPoints
    results['north'] = (x,y)
UnboundLocalError: local variable 'x' referenced before assignment

グローバルと非ローカルを試しましたが、うまくいきません。関数の外部から入力を取得しないため、とにかくグローバルまたは非ローカルは必要ありません。

4

7 に答える 7

5

エラー メッセージには、変数xに値がないことが示されています。ループで(繰り返し)割り当てられているため、これはループが一度も実行されていないことforを意味します。forそして、これが起こる唯一の方法は if geometry.GetPointCount()returns0です。したがって、これは起こっているに違いありません。を追加しprint geometry.GetPointCount()て確認します。

ジオメトリの各ポイントに対してステートメントが実行され、ジオメトリのポイントが 0 の場合はまったく実行されないifように、ステートメントをループに入れるつもりですか? その場合は、適切にインデントしてください。

于 2012-04-30T18:01:06.533 に答える
1

forループの下にifステートメントをインデントすることを意味していると思います。あなたのコードが立っているように、それは常に最後のポイントでのみ動作するか、(現在のエラーの原因を想像しています) ポイントがない場合はx, y, zforループが反復するものが何もないため、決して設定されません。

于 2012-04-30T18:01:50.260 に答える
0

簡単な「診断」テストとして、 for ループの前に初期化x, yzて、特定のエラーが修正されるかどうかを確認できますか?

現在の状況では、for ループが何らかの理由で実行されず、作成も割り当てもさx, yzないため、後でそれらを使用しようとしたときにエラーが発生します。

また、2 つのifステートメントを for ループの下に折りたたむ必要がありますか?

于 2012-04-30T18:00:51.930 に答える
0

問題は関数の最初の 2 行にあります。実際、いくつかの問題があります。

x、y、z はforループ内で定義されます。が 0 の場合geometry.GetPointCount()、そのループには入らないため、それらの変数は割り当てられません。それがおそらくここで起こっていることなので、エラーメッセージが表示されます。

一方、その式が 0 より大きい場合、x、y、z はそのループのたびに再定義されますが、これはあまり意味がないように思えます。最終的には前回の値だけを取得することになります。

于 2012-04-30T18:01:15.627 に答える
0
x,y,z = geometry.GetPoint(i)

実行されることはありませんfindPoints()

これは がgeometry.GetPointCount()0 を返すため、forループが実行されないためです。

于 2012-04-30T18:02:17.607 に答える
0

いくつかの場所で正しくインデントされていないように見える eBook の例と同じ問題がありました。関数は次のようになります。

def findPoints(geometry, results):
    for i in range(geometry.GetPointCount()):
        x,y,z = geometry.GetPoint(i)
        if results['north'] == None or results['north'][1] < y:
            results['north'] = (x,y)
        if results['south'] == None or results['south'][1] > y:
            results['south'] = (x,y)
    for i in range(geometry.GetGeometryCount()):
        findPoints(geometry.GetGeometryRef(i), results)
于 2014-05-30T08:42:58.793 に答える