首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cartopy中的OverflowError

cartopy中的OverflowError
EN

Stack Overflow用户
提问于 2015-09-24 01:01:08
回答 1查看 114关注 0票数 2

我正在用cartopy画一些地图。在某些情况下,当在我的轴上调用.set_extent()时,我得到这个错误:

代码语言:javascript
复制
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是一个熊猫DataFrame,保存各种形状的边界框坐标,稍后我打算将其添加到轴中)。

代码语言:javascript
复制
>>> 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中的此行引发的

代码语言:javascript
复制
cdef ptr geos_geom = shapely_geom._geom

我做了一些搜索,发现与some mailing list上提出的类似问题相关的an old commit

我对这个问题的理解是,这些Shapely对象的_geom属性存储了某种类型的指针,指向某个C库中的对象。如果这个指针的整数值对于C长整型来说太大,就会引发错误。这个错误是不可重现的,因为我每次创建新的_geom时都会创建一个新的GeoAxes,并且新的_geom可能太大,也可能不太大。

然而,一个令人费解的事情是,我能找到的关于这个错误的大多数(例如,上面提交的提交消息)表明它应该只对32位系统有问题,但我使用的是64位Python 2.7和64位版本的所有库。

所以我的问题是:我对正在发生的事情的看法是正确的吗?如果是这样,为什么我在64位系统上仍然收到这些错误?有没有办法解决这个问题呢?

EN

回答 1

Stack Overflow用户

发布于 2015-09-24 15:25:22

我对正在发生的事情的看法是对的吗?

我不能明确地确认你是对的,但这看起来肯定是合理的。我以前从未见过这个问题,但同样,我也不倾向于在Windows上定期使用cartopy。

如果是这样,为什么我仍然在64位系统上得到这些错误?

您的机器可能是64位的,但是您正在使用的Python是64位的吗?

,有没有办法解决这个问题呢?

如果它看起来是随机的,解决方法可能是:

代码语言:javascript
复制
for attempt in range(10):
    try:
        ...
    except OverflowError:
        print('Failed attempt {}, retrying upto 10 times.'.format(attempt))

这当然并不美观,但可能是目前唯一的变通方法。

很明显,您发现的是一个错误,所以我认为cartopy issue tracker是找到问题的长期解决方案的正确地方。我认为提供你正在使用的软件的版本是一个好主意,理想情况下,你正在寻找的坐标会触发问题(即使是随机的)。

HTH

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32745373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档