Полигоны на международной линии [-180 .. + 180 долготы]


10

Я пытаюсь создать полигоны для спутниковых орбитальных полос. Пока у меня есть метод для генерации двух линий, которые представляют край каждой полосы в [lat, long]. Некоторые полосы пересекли международную линию дат и так обернулись:

полоса обмотки

Я смог решить это с ogr2ogr -wrapdateline:

ogr2ogr -wrapdateline  -f "ESRI Shapefile" test.shp orbits.shp

Который разделяет линии, вероятно,

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

заливка

Мне нужен автоматизированный метод, так как мне нужно многократно повторять задачу. Желательно в Python, так как я генерировал строки. Вот два шейп-файла, содержащие строки: wraparound ; datelinefixed


Для дополнительных идей см. Связанные темы на gis.stackexchange.com/questions/429 и gis.stackexchange.com/questions/18562 . Возможно, идеи, представленные на gis.stackexchange.com/questions/17788 , тоже могут быть полезны. Интересно, однако, что вы подразумеваете под «внутренностью»: эти многоугольники не являются четко определенными, поэтому, как минимум, вам необходимо предоставить информацию, чтобы указать (а) какая сторона каждой ломаной считается «внутренней» и (б) как отрезать их возле полюсов.
whuber

Ответы:


3

Вы можете построить собственную проекцию Меркатора, центрированную примерно в центре полосы. Например, используйте для полосы 25:

+proj=merc +lon_0=-140 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs

В этой проекции полоса не нарушена датой. Вы можете создать многоугольник из линии.

введите описание изображения здесь

Затем создайте отрезанный многоугольник между -179,95 ° E и 179,95 ° E в EPSG: 4326:

Nr;WKT
1;POLYGON ((-179.95 89, 179.95 89, 179.95 -89, -179.95 -89, -179.95 89))

Перепроектируйте его и на свой собственный CRS и вычтите его из полигона полосы.

После перепроецирования обратно в EPSG: 4326 полоса корректно делится на дату:

введите описание изображения здесь

Продолжите со всеми рядами, которые пересекают линию даты.


1

Я бы переписал процесс генерации полосы для начала и окончания в одном и том же непрерывном пространстве. то есть, если линия начиналась при 170 ° и заканчивалась при -170 °, я бы переписал процесс так, чтобы завершить при 190 °, а не оборачивать при -180,180

Затем вы можете сделать неразрывные полигоны между вашими линиями.

Затем используйте процесс закрепления, чтобы разделить многоугольники на линии 180, -180 и сместить любые части, которые находятся за пределами пространства -180,180, путем добавления или вычитания 360 ° в зависимости от ситуации.

Просто сделайте все это, прежде чем сохранить его с определенной проекцией / датумом


0

Спасибо @AndreJ за эту идею, используя Django GEOS API, вот простое решение, которое не требует перепроектирования чего-либо:

1) Создайте MultiPolygon, который граничит с линией даты:

from django.contrib.gis.geos.collections import MultiPolygon, LinearRing, Polygon
box1 = ((180.0, 89), (179.95, 89), (179.95, -89), (180.0, -89), (180.0, 89))
box2 = ((-180.0, 89), (-179.95, 89), (-179.95, -89), (-180.0, -89), (-180.0, 89))
poly1 = Polygon(LinearRing(box1))
poly2 = Polygon(LinearRing(box2))
poly = MultiPolygon(poly1, poly2)

2) Если нарушающая геометрия пересекается, верните разницу:

from django.contrib.gis.geos.geometry import GEOSGeometry
geometry = GEOSGeometry(WKT)  # WKT is your polygon in WKT string format
if geometry.intersects(poly):
    print("Geometry crosses dateline... splitting")
    geometry = geometry.difference(poly) # clip with dateline polygon

Результат отображается следующим образом:

Перед

После

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.