Django.contrib.gis.geos故障

2024-06-01 10:32:47 发布

您现在位置:Python中文网/ 问答频道 /正文

根据django文档https://docs.djangoproject.com/en/3.1/ref/contrib/gis/geos/#django.contrib.gis.geos.Polygon中的示例代码片段,当迭代多边形的线性化时,我得到一个Segfault

>>> from django.contrib.gis.geos import Polygon, LinearRing
>>> ext_coords = ((0, 0), (0, 1), (1, 1), (1, 0), (0, 0))
>>> int_coords = ((0.4, 0.4), (0.4, 0.6), (0.6, 0.6), (0.6, 0.4), (0.4, 0.4))
>>> poly = Polygon(ext_coords, int_coords)
>>> [c for c in poly]
[<LinearRing object at 0x7fa81326d610>, <LinearRing object at 0x7fa81326d810>]
>>> [c for c in poly[0]]
Segmentation fault (core dumped)

为什么这个代码会抛出一个segfault?如何让代码运行

最初,我在Python3.6.7和Django3.0.9中遇到了这个错误。我升级到Python3.8.2,希望这只是Python3.6.7和Django 3.0.9之间的兼容性问题:但是升级和设置新的virtualenv并没有解决这个错误

由于崩溃发生在对多边形的线性化进行迭代时,因此我测试了仅通过线性化循环是否会引发错误:

>>> from django.contrib.gis.geos import Polygon, LinearRing
>>> ext_coords = ((0, 0), (0, 1), (1, 1), (1, 0), (0, 0))
>>> int_coords = ((0.4, 0.4), (0.4, 0.6), (0.6, 0.6), (0.6, 0.4), (0.4, 0.4))
>>> ls1 = LinearRing(ext_coords)
>>> ls2 = LinearRing(int_coords)
>>> [c for c in ls1]
[(0.0, 0.0), (0.0, 1.0), (1.0, 1.0), (1.0, 0.0), (0.0, 0.0)]
>>> [c for c in ls2]
[(0.4, 0.4), (0.4, 0.6), (0.6, 0.6), (0.6, 0.4), (0.4, 0.4)]
>>> poly = Polygon(ext_coords, int_coords)
>>> [c for c in poly]
[<LinearRing object at 0x7f84815f6610>, <LinearRing object at 0x7f84815f6a10>]
>>> [c for c in poly[1]]
Segmentation fault (core dumped)

如示例所示,仅在上迭代线性化是可能的,但在多边形中迭代线性化会产生分段断层

编辑:我发现通过使用.coords-属性:[c for c in poly[0].coords]可以避免崩溃。但我仍然不知道,为什么原始代码会产生segfault


Tags: djangoinforobjectcoordscontribextat