Как создать эмбриональную строку LineString в GeoDjango
У меня возникла проблема с последней версией расширения GeoDjango
в Django версии 4.2.6, когда я создаю пустой LineString
. Тот же самый код ведет себя иначе, чем в версии 4.0.10. Похоже, что по умолчанию создается объект Geos с 3-мя измерениями, а не с 2-мя, как раньше.
Следующий код возвращает разные объекты WKT в зависимости от версии Django, которую я использую.
from django.contrib.gis.geos import LineString
ls = LineString()
ls.wkt
Это возвращает 3-мерный объект "LINESTRING Z EMPTY". Выполнение точно такого же кода на Django 4.0.10 создает 2-мерный объект "LINESTRING EMPTY".
Есть ли что-то очевидное, что я делаю неправильно? Я также использую немного более новую версию geos-3.12.0 по сравнению с 3.11.2, но я не вижу ничего в обоих наборах примечаний к выпуску, что описывает это изменение в поведении.
В GeoDjango, начиная с версии 3.1, 3D-геометрия поддерживается по умолчанию. Если вы хотите создать 2D LineString в явном виде, вы можете использовать параметр dim при создании объекта LineString. Задайте dim=2, чтобы создать 2D LineString.
from django.contrib.gis.geos import LineString
ls = LineString(dim=2)
print(ls.wkt)
Как оказалось, эта проблема связана с изменением способа обработки geos пустых объектов LineString. Теперь это исправлено в патче к мастер-ветке. Подробности проблемы и исправляющий ее патч см. в https://github.com/libgeos/geos/issues/993.