PostGIS - некоторые мультиполигоны вызывают "BOOM! Не удалось создать внешнюю точку!" - PullRequest
2 голосов
/ 03 мая 2011

Я пытаюсь представить прямоугольную область, которая пересекает 180 градусов долготы. Для получения дополнительной информации см. В PostGIS полигон, размер которого больше половины мира, рассматривается как противоположный

Вот мой тестовый пример:

from django.contrib.gis.geos import Polygon, MultiPolygon
from my_project.my_app.models import Photo

a = Polygon.from_bbox((30, -80, 180, 80))  # the part to the east of 180
b = Polygon.from_bbox((-180, -80, -160, 80))  # a part to the west of 180
c = Polygon.from_bbox((-180, -80, -100, 80))  # a larger part to the west of 180

ok   = MultiPolygon(a,b)
ok2  = MultiPolygon(c)
boom = MultiPolygon(a,c)

# This works
Photo.objects.filter(location__coveredby=ok)[:1]
# This also works so c is ok
Photo.objects.filter(location__coveredby=ok2)[:1]
# This gives "BOOM! Could not generate outside point!"
Photo.objects.filter(location__coveredby=boom)[:1]

# splitting c doesn't help
c1 = Polygon.from_bbox((-180, -80, -140, 80))
c2 = Polygon.from_bbox((-140, -80, -100, 80))
test = MultiPolygon(a,c1,c2)
Photo.objects.filter(location__coveredby=test)[:1]
# BOOM! Could not generate outside point!

Изменяя числа, я могу заставить эту ошибку приходить и уходить. (-180, -80, x, 80) работает там, где x <= -140, например. Для каждого числа есть пороговое значение, подобное этому, но я не могу найти шаблон. Для коробок с одинаковой площадью некоторые будут работать, а другие нет. Для коробок с одинаковой шириной некоторые будут работать, а другие нет. </p>

Я могу посмотреть на генерируемый SQL, но области представлены в двоичном формате (EWKB), и я не уверен, как его читать.

Может кто-нибудь объяснить это?

1 Ответ

1 голос
/ 04 мая 2011

Задав этот вопрос, я узнал о gis.stackexchange.com, поэтому я тоже спросил там. С помощью хороших людей я узнал, в чем проблема (я думаю) и решение.

См: https://gis.stackexchange.com/questions/9217/postgis-certain-multipolygons-cause-boom-could-not-generate-outside-point/9257#9257

...