创建 Shapely 多边形的数据框会给出“ValueError:A LinearRing 必须至少有 3 个坐标元组”

The*_*One 2 python polygon shapely valueerror

我想创建一个热图,比如中国的省级人口,我在这里找到了类似问题的指南

尽管我不得不承认我并没有完全理解它们,但我在阅读示例代码时没有问题。然而,当我试图通过使用中国的 shapefile 来模仿这个例子时,代码运行正常,直到以下

df_map = pd.DataFrame({
    'poly': [Polygon(xy) for xy in m.china],
    'ward_name': [ward['NAME'] for ward in m.china_info]})
Run Code Online (Sandbox Code Playgroud)

它产生一个错误,说

df_map = pd.DataFrame({
    'poly': [Polygon(xy) for xy in m.china],
    'ward_name': [ward['NAME'] for ward in m.china_info]})
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释是什么导致了这个错误?

War*_*ser 5

当您报告错误时,在您的问题中包含完整的错误消息通常是个好主意。Python 回溯包含比最终错误消息更多的信息,包括发生错误的模块和行号。

您的错误发生在shapely代码中。我可以通过只传递Polygon两个点的序列来重现错误消息;Polygon至少需要三点。这是一个例子。

Polygon从 shapely 库导入:

>>> from shapely.geometry import Polygon
Run Code Online (Sandbox Code Playgroud)

传递三点序列有效:

>>> p = Polygon([(0, 0), (0, 1), (1, 1)])
Run Code Online (Sandbox Code Playgroud)

但是只给出两点会导致错误:

>>> p = Polygon([(0, 0), (0, 1)])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/warren/anaconda/lib/python2.7/site-packages/shapely/geometry/polygon.py", line 229, in __init__
    self._geom, self._ndim = geos_polygon_from_py(shell, holes)
  File "/home/warren/anaconda/lib/python2.7/site-packages/shapely/geometry/polygon.py", line 445, in geos_polygon_from_py
    geos_shell, ndim = geos_linearring_from_py(shell)
  File "/home/warren/anaconda/lib/python2.7/site-packages/shapely/geometry/polygon.py", line 393, in geos_linearring_from_py
    "A LinearRing must have at least 3 coordinate tuples")
ValueError: A LinearRing must have at least 3 coordinate tuples
Run Code Online (Sandbox Code Playgroud)

显然有一个项目的m.china分数少于三分。您正在使用 ipython,因此您可以m.china在尝试创建df_map. 这应该可以帮助您确定发生了什么。