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循环甚至没有执行一次。发生这种情况的唯一方法是如果geometry.GetPointCount()返回0。因此,这是必须发生的事情。添加一个print geometry.GetPointCount()以确认。

您是否打算将if语句放在循环内,以便对几何中的每个点执行它们,并且在几何有 0 点时根本不执行?如果是这样,请正确缩进。

于 2012-04-30T18:01:06.533 回答
1

我认为您可能意味着将这些 if 语句缩进 for 循环下。正如您的代码所代表的那样,它将始终仅在最后一点上运行,或者(我想是什么导致您当前的错误)在您没有点的情况下,永远不会设置x, y, z,因为for循环将没有任何东西可以迭代。

于 2012-04-30T18:01:50.260 回答
1

我有同样的问题。我正在定义函数(使用 def)并在 def 之前声明变量并解决这个问题,我只是将声明移到函数中并解决了。

于 2019-07-07T08:39:33.170 回答
0

作为一个快速的“诊断”测试,您可以尝试在 for 循环之前进行初始化x, yz看看是否可以解决您的特定错误?

现在的情况是,如果您的 for 循环由于某种原因没有执行,x, y并且z没有被创建和分配,因此将导致您稍后在尝试使用它们时遇到错误。

另外,您的两个if语句是否应该折叠在 for 循环下?

于 2012-04-30T18:00:51.930 回答
0

问题出在函数的前两行——事实上,那里有几个问题。

x、y 和 z 在for循环中定义。如果geometry.GetPointCount()为 0,则永远不会进入该循环,因此不会分配这些变量。这大概就是这里发生的事情,因此出现错误消息。

另一方面,如果该表达式大于 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

我遇到了同样的问题,因为示例来自电子书,在某些地方似乎没有正确缩进。该函数应如下所示:

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 回答