Я пытаюсь создать полигоны для спутниковых орбитальных полос. Пока у меня есть метод для генерации двух линий, которые представляют край каждой полосы в [lat, long]. Некоторые полосы пересекли международную линию дат и так обернулись:
Я смог решить это с ogr2ogr
-wrapdateline
:
ogr2ogr -wrapdateline -f "ESRI Shapefile" test.shp orbits.shp
Который разделяет линии, вероятно,
Теперь я хочу создавать полигоны внутри обеих линий. Так, например, в случае, когда один край полосы пересекает линию даты, которую заполняет многоугольник, когда он появляется на другой стороне, например:
Мне нужен автоматизированный метод, так как мне нужно многократно повторять задачу. Желательно в Python, так как я генерировал строки. Вот два шейп-файла, содержащие строки: wraparound ; datelinefixed
Ответы:
Вы можете построить собственную проекцию Меркатора, центрированную примерно в центре полосы. Например, используйте для полосы 25:
В этой проекции полоса не нарушена датой. Вы можете создать многоугольник из линии.
Затем создайте отрезанный многоугольник между -179,95 ° E и 179,95 ° E в EPSG: 4326:
Перепроектируйте его и на свой собственный CRS и вычтите его из полигона полосы.
После перепроецирования обратно в EPSG: 4326 полоса корректно делится на дату:
Продолжите со всеми рядами, которые пересекают линию даты.
источник
Я бы переписал процесс генерации полосы для начала и окончания в одном и том же непрерывном пространстве. то есть, если линия начиналась при 170 ° и заканчивалась при -170 °, я бы переписал процесс так, чтобы завершить при 190 °, а не оборачивать при -180,180
Затем вы можете сделать неразрывные полигоны между вашими линиями.
Затем используйте процесс закрепления, чтобы разделить многоугольники на линии 180, -180 и сместить любые части, которые находятся за пределами пространства -180,180, путем добавления или вычитания 360 ° в зависимости от ситуации.
Просто сделайте все это, прежде чем сохранить его с определенной проекцией / датумом
источник
Спасибо @AndreJ за эту идею, используя Django GEOS API, вот простое решение, которое не требует перепроектирования чего-либо:
1) Создайте MultiPolygon, который граничит с линией даты:
2) Если нарушающая геометрия пересекается, верните разницу:
Результат отображается следующим образом:
источник