В PostGIS полигон, превышающий половину мира, рассматривается как противоположный
Я использую GeoDjango с PostGIS и пытаюсь использовать многоугольник для получения записей из базы данных, которая попадает в него.
Если я определяю многоугольник, который больше половины площади земли, он предполагает, что "внутри" моего многоугольника является меньшая область, которую я обозначил как "снаружи", и возвращает только результаты, которые находятся за его пределами.
Я могу просто использовать эту меньшую неправильную область, чтобы исключить результаты. Кажется, Polygon.area знает, что я собираюсь сделать, поэтому я могу использовать это, чтобы определить, когда сделать мой поиск включающим или исключительным. Я чувствую, что эта проблема, вероятно, распространена, есть ли лучший способ ее решить?
Обновление: если 180-градусная долгота находится внутри моего многоугольника, это не работает вообще. Кажется, в этот раз виноват ГЕОС. Это изображение показывает, что я считаю причиной. Зелёный - это полигон, который я определяю, красный - это то, как он его интерпретирует. Опять же, это похоже на проблему, которая часто возникает, и для которой созданы библиотеки, такие как GEOS. Есть ли способ?
1 ответ
Хорошо, нет ответов. Вот что я сделал.
Потому что ГЕОС не любит, когда вещи пересекают 180-й меридиан:
Сначала проверьте, пересекает ли многоугольник 180-й меридиан - если это так, разбейте его на 2 многоугольника вдоль этой линии.
Поскольку PostGIS предполагает, что полигон настолько мал, насколько это возможно, вы не можете сделать один укрытие более половины мира, поэтому:
Проверьте, покрывает ли многоугольник или каждый из разделенных многоугольников полмира или даже больше. Если это так, разбейте их пополам.
Построить мультиполигон из результатов.