我正在使用 cartopy 绘制一些地图。在某些情况下,当调用.set_extent()
我的轴时,我收到此错误:
Traceback (most recent call last):
File "<pyshell#315>", line 1, in <module>
ax.set_extent([bounds.X1.min(), bounds.X2.max(), bounds.Y1.min(), bounds.Y2.max()], cartopy.crs.AlbersEqualArea())
File "C:\FakeProgs\Python27\lib\site-packages\cartopy\mpl\geoaxes.py", line 587, in set_extent
projected = self.projection.project_geometry(domain_in_crs, crs)
File "C:\FakeProgs\Python27\lib\site-packages\cartopy\crs.py", line 172, in project_geometry
return getattr(self, method_name)(geometry, src_crs)
File "C:\FakeProgs\Python27\lib\site-packages\cartopy\crs.py", line 178, in _project_line_string
return cartopy.trace.project_linear(geometry, src_crs, self)
File "lib\cartopy\trace.pyx", line 109, in cartopy.trace.project_linear (lib/cartopy\trace.cpp:1135)
File "lib\cartopy\trace.pyx", line 71, in cartopy.trace.geos_from_shapely (lib/cartopy\trace.cpp:838)
OverflowError: Python int too large to convert to C long
问题是行为有点随机。不是每个调用都.set_extent()
这样做。这是一个解释器会话的摘录(bounds
是一个 pandas DataFrame,它包含我打算稍后添加到轴的各种形状的边界框坐标)。
>>> ax = pyplot.axes(projection=cartopy.crs.AlbersEqualArea())
... ax.set_extent([bounds.X1.min(), bounds.X2.max(), bounds.Y1.min(), bounds.Y2.max()], cartopy.crs.AlbersEqualArea())
# result is exception shown above
>>> [bounds.X1.min(), bounds.X2.max(), bounds.Y1.min(), bounds.Y2.max()]
[-2218681.0391451684,
-2103178.2838086924,
-195096.93292225525,
7468.2970529943705]
>>> [int(x) for x in [bounds.X1.min(), bounds.X2.max(), bounds.Y1.min(), bounds.Y2.max()]]
[-2218681, -2103178, -195096, 7468]
>>> [long(x) for x in [bounds.X1.min(), bounds.X2.max(), bounds.Y1.min(), bounds.Y2.max()]]
[-2218681L, -2103178L, -195096L, 7468L]
>>> ax = pyplot.axes(projection=cartopy.crs.AlbersEqualArea())
... ax.set_extent([bounds.X1.min(), bounds.X2.max(), bounds.Y1.min(), bounds.Y2.max()], cartopy.crs.AlbersEqualArea())
# works without problem!
相同的代码可以工作,而不会更改其间的任何变量。
此行似乎引发了错误trace,pyx
:
cdef ptr geos_geom = shapely_geom._geom
我做了一些搜索,发现了一个与某个邮件列表上提出的类似问题相关的旧提交。
我对这个问题的理解是,_geom
这些 Shapely 对象的属性存储了某种指向某个 C 库中对象的指针。如果此指针的整数值对于 C long 来说太大,则会引发错误。该错误不可重现,因为_geom
每次我创建一个 new 时都会创建一个 new GeoAxes
,并且 new_geom
可能会或可能不会太大。
不过,令人费解的是,我能找到的关于这个错误的大部分信息(例如,上面提交的提交消息)表明它应该只是 32 位系统的问题,但我使用的是 64 位带有所有库的 64 位版本的 Python 2.7。
所以我的问题是:我对正在发生的事情是否正确?如果是这样,为什么在 64 位系统上仍然会出现这些错误?有没有办法解决它?