использование qgis и ошибка формы: GEOSGeom_createLinearRing_r вернул указатель NULL - PullRequest
4 голосов
/ 29 мая 2020

Я попытался создать шейп-файл многоугольника в QGIS и прочитал его в python shapely. Пример кода выглядит следующим образом:

import fiona
from shapely.geometry import shape
multipolys = fiona.open(somepath)
multi = multipolys[0]
coord = shape(multi['geometry'])

EOSGeom_createLinearRing_r вернул нулевой указатель. Я проверил, действителен ли многоугольник в QGIS, и об ошибках не сообщалось. Фактически, это не работает даже для простого треугольника, созданного в QGIS. Кто-нибудь знает, как это решить?

Спасибо

Ответы [ 2 ]

1 голос
/ 15 июля 2020

У меня была аналогичная проблема, но с shapely.geometry.LineString. Ошибка, которую я получил:

ValueError: GEOSGeom_createLineString_r returned a NULL pointer

Я не знаю причины этого сообщения, но есть два способа ее избежать:

  1. Сделайте следующее:

    ...
    from shapely import speedups
    ...
    
    speedups.disable()
    

    Импортируйте модуль ускорения и отключите его. Это нужно сделать, так как по умолчанию они включены. Из метода инициализации shapelys ускорения:

    """
    The shapely.speedups module contains performance enhancements written in C.
    They are automaticaly installed when Python has access to a compiler and
    GEOS development headers during installation, and are enabled by default.
    """
    

    Если вы отключите их, вы не получите исключение NULL Pointer Exception, потому что вы не используете реализацию C, а не обычную реализацию.

  2. Если вы вызываете python в командной оболочке, введите:

    from shapely.geometry import shape
    

    , это загрузит вашу необходимую фигуру. Затем загрузите вашу программу

    import yourscript
    

    , затем запустите ваш скрипт.

    yourscript.main()
    

    Это тоже должно работать. Я думаю, что в этом варианте модули C загружаются правильно, и поэтому вы не получаете исключение NULL Pointer Exception. Но это работает, только если вы открываете терминал python вручную и вручную импортируете нужную форму. Если вы импортируете форму с помощью своей программы, вы снова столкнетесь с той же ошибкой.

0 голосов
/ 01 сентября 2020

Как и JP, у меня тоже была проблема с созданием LineStrings. В репозитории Shapely на github есть старая проблема (2016), которая кажется связанной. Изменение порядка импорта решило проблему для меня:

from shapely.geometry import LineString
import fiona 

LineString([[0, 0], [1, 1]]).to_wkt()
# 'LINESTRING (0.0000000000000000 0.0000000000000000, 1.0000000000000000 1.0000000000000000)'

тогда как

import fiona
from shapely.geometry import LineString

LineString([[0, 0], [1, 1]]).to_wkt()
# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
#   File "C:\Users\xxxxxxx\AppData\Roaming\Python\Python37\site-packages\shapely\geometry\linestring.py", line 48, in __init__
#     self._set_coords(coordinates)
#   File "C:\Users\xxxxxxx\AppData\Roaming\Python\Python37\site-packages\shapely\geometry\linestring.py", line 97, in _set_coords
#     ret = geos_linestring_from_py(coordinates)
#   File "shapely\speedups\_speedups.pyx", line 208, in shapely.speedups._speedups.geos_linestring_from_py
# ValueError: GEOSGeom_createLineString_r returned a NULL pointer

Некоторые другие проблемы в репозитории Shapely, чтобы посмотреть

  • 887 (тот же трюк с обратным порядком импорта с osgeo и shapely)
  • 919
...