我想创建一个中国省级人口的热图,我在这里找到了类似问题http://sensitivecities.com/so-youd-like-to-make-a-map-using-python-EN.html#.Ut3k7bS-thF的指南。
我通过示例代码没有问题,但我不得不承认我并没有完全理解它们。但是当我试图通过使用中国的shapefile来模仿这个例子时,代码运行正常,直到下面的
在[6]中:
df_map = pd.DataFrame({
'poly': [Polygon(xy) for xy in m.china],
'ward_name': [ward['NAME'] for ward in m.china_info]})
它会生成一个错误
ValueError:LinearRing必须至少有3个坐标元组
有人可以向我解释导致此错误的原因吗?
答案 0 :(得分:2)
在报告错误时,通常最好在问题中包含完整的错误消息。 Python回溯包含的信息多于最终错误消息,包括发生错误的模块和行号。
您的错误发生在shapely
代码中。我可以通过传递Polygon
一个只有两个点的序列来重现错误消息; Polygon
至少需要三分。这是一个例子。
从整齐的库中导入Polygon
:
>>> from shapely.geometry import Polygon
传递三个点的序列有效:
>>> p = Polygon([(0, 0), (0, 1), (1, 1)])
但只给出两分导致错误:
>>> 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
显然,m.china
中有一项少于三分的项目。您正在使用ipython,因此您可以在尝试创建m.china
之前打印df_map
。这应该可以帮助您确定发生了什么。