В PostGIS полигон, превышающий половину мира, рассматривается как противоположный - PullRequest
6 голосов
/ 21 апреля 2011

Я использую GeoDjango с PostGIS и пытаюсь использовать многоугольник для получения записей из базы данных, которая попадает в него.

Если я определяю многоугольник, который больше половины площади земли, он предполагает, что «внутри» моего многоугольника является меньшей областью, которую я обозначил как «снаружи», и возвращает только результаты, находящиеся вне его.

Я могу просто использовать эту меньшую неправильную область, чтобы исключить результаты. Кажется, Polygon.area знает, что я собираюсь сделать, поэтому я могу использовать это, чтобы определить, когда сделать мой поиск включающим или исключительным. Я чувствую, что эта проблема, вероятно, распространена, есть ли лучший способ ее решить?

Обновление: Если 180-градусная долгота находится внутри моего многоугольника, это вообще не работает. Кажется, в этот раз виноват GEOS. Это изображение показывает, что я считаю причиной. Зеленый - это полигон, который я определяю, красный - это то, как он, кажется, интерпретирует его. Polygons on earth Опять же, это похоже на проблему, которая часто возникает, и для которой создаются библиотеки типа GEOS. Есть ли способ?

1 Ответ

6 голосов
/ 25 апреля 2011

Хорошо, ответов нет. Вот что я сделал.

Потому что GEOS не любит, когда вещи пересекают 180-й меридиан:
Сначала проверьте, пересекает ли многоугольник 180-й меридиан - если это так, разбейте его на 2 многоугольника вдоль этой линии.

Поскольку PostGIS предполагает, что полигон настолько мал, насколько возможно, вы не можете сделать один укрытие более чем на половину мира, поэтому:
Проверьте, покрывает ли многоугольник или каждый из разделенных многоугольников полмира или больше - если это так, разбейте их пополам.

Построить мультиполигон из результатов.

...