Полігони по всій міжнародній дателіні [-180 .. + 180 довготи]


10

Я намагаюся генерувати багатокутники для супутникових орбітальних колій. Поки що у мене є метод для генерування двох ліній, які представляють край кожної смуги в [lat, long] Деякі качани перетинають міжнародну дателіну і так обертаються:

качан обернути

Я зміг вирішити це за допомогою ogr2ogr -wrapdateline:

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

Що, можливо, розбиває лінії

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

заливка

Мені потрібен метод, який автоматизується, оскільки мені потрібно багато разів повторити завдання. Переважно в python, оскільки саме так я створив лінії. Ось два файли форми, що містять лінії: обгортання ; фіксований


Для отримання додаткових ідей див. Пов’язані теми на 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 °, якщо це необхідно.

Просто виконайте це, перш ніж зберегти його з певною проекцією / датою


1

Завдяки @AndreJ за цю ідею, використання API Django GEOS ось просте рішення, яке дозволяє уникнути необхідності повторно проектувати що-небудь:

1) Створіть мультиполігон, який межує з таблицею:

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.