Пересечение 180-ого меридиана или “широка страна моя родная”

Михаил Потанин

Описание и “изображение” проблемы

Есть ли стандарт, или устоявшийся подход при работе с координатами географических объектов, которые пересекают 180-ый меридиан?

Представим, что нужно передать координаты прямоугольника, изображенного на рисунке 1а. Как нужно записать координаты, чтобы не получилось прямоугольника, изображенного на рисунке 1б?

180problem_1a
Рис. 1а. Прямоугольник, охватывающий о. Врангеля и пересекающий 180-ый меридиан

180problem_1b
Рис. 1б. Нежелательное отображение прямоугольника, пересекающего 180-ый меридиан

Если координаты объектов, пересекающих 180-ый меридиан, некорректно записаны, или программное обеспечение неправильно обрабатывает (интерпретирует) координаты таких объектов, то на карте получаются некрасивые “разрывы” как на картинках ниже:

180problem_2a
Рис. 2а. Неправильное отображение контуров снимков Landsat8, пересекающих 180-ый меридиан

180problem_2b
Рис. 2б. “Разорванные” границы Чукотского автономного округа

На первый взгляд кажется, что с растровыми данными в виде тайлов нет таких проблем, поскольку тайл не может пересекать 180-ый меридиан по определению (по крайней мере в наиболее используемых системах нарезки на тайлы). Но, во-первых, есть проблема, как перепроецировать растровые данные до тайлинга из локальной проекции в глобальную в районе 180-ого меридиана и, во-вторых, как корректно описывать в метаданных то, что называется “bounding box” (bbox — прямоугольная граница) такого слоя.

Могут быть “разрывы” и с растровыми данными. Например, космический снимок, пересекающий 180-ый меридиан, записан в зональной проекции UTM-60 и для отображения на веб-картах должен быть перепроецирован в глобальную проекцию Меркатора. В таком случае могут возникнуть артефакты: либо отрезание части растра по 180-ому меридиану (рис. 3а.) или “растягивание” растра на весь мир (рис 3б.) и заполнением пустых областей значением “nodata”.

180problem_3a
Рис. 3а. “Отрезание” части растра по 180-ому меридиану

180problem_3b
Рис. 3б. “Растягивание” растра через весь мир

Для российских гис- и веб-картографов проблема особенно актуальна, потому что самая восточная часть России находится в Западном полушарии, и наша страна единственная, которую по суше пересекает 180-ый меридиан.

С технической точки зрения все дело в том, что в глобальных проекциях, которые охватывают весь мир, по 180-ому меридиану проходит граница, разделяющая положительные и отрицательные координаты по оси X (= точки с восточной и западной долготой).

Проблемы не ограничиваются только визуализацией. Допустим, есть сервис поиска каких-либо объектов по заданному полигону на карте. Если полигон пересекает 180-ый меридиан, то, какую выборку объектов мы получим: внутри правильной «маленькой» области, на часть этой области или на ее «дополнение» по оси X?

Варианты решения

Какой-то исчерпывающей и оптимальной методики по этому вопросу на все случаи жизни нам не встречалось, и мы, в свою очередь, такую не обещаем :) Но есть решения на уровне различных приемов. Убедиться, что специалисты и разработчики с такой проблемой сталкиваются достаточно часто, можно, изучив результаты поиска в Google по запросу: “polygons crossing 180 longitude”.

Мы используем два подхода:
1) записывать координаты точек с “перехлестом”. Например:

  • {“type”:LINESTRING, “coordinates”: [[170,60],[190,60]]} — отрезок в “короткую сторону” между 170° восточной долготы и 170° западной долготы
  • {“type”:POLYGON, “coordinates”:[[[170,70],[190,70],[190,50],[170,50],[170,70]]]} — прямоугольник между 170° восточной долготы и 170° западной долготы

2)разрезать геометрию на две части по 180-ому меридиану. В этом случае указанные геометрии будут записана так:

  • {“type”:MULTILINESTRING, “coordinates”: [ [[170,60],[180,60]],[[-180,60],[-170,60]]] }
    — разрезанный на две части отрезок
  • {“type”:MULTIPOLYGON, “coordinates”:[ [[[170,70],[180,70],[180,50],[170,50],[170,70]]],
    [[[-180,70],[-170,70],[-170,50],[-180,50],[-180,70]]] ]}
    — разрезанный на две части прямоугольник

Плюс первого метода — простота преобразования координат, минус — в проблемах экспорта-импорта координат, поскольку не любое программное обеспечение для работы с пространственными данными, будет правильно обрабатывать географические координат вида “190° восточной долготы”.

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

Не только в теории, но и на практике используем оба подхода:

Disclaimer

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

3 комментариев на “Пересечение 180-ого меридиана или “широка страна моя родная””

  1. Boris:

    А может хранить данные в проекциях, которые не имеют такой проблемы? В программе Mapinfo точно есть такие 3 или 4 проекции, которые не имеют этого «родового пятна империализма».

    [Ответить]

  2. Какой проекции, например?

    Если использовать прием с переносом начального меридиана, то можно добиться, чтобы переход координат между положительными и отрицательными был вне территории РФ. Но родовое пятно переместится в другое место и во-вторых останутся проблемы с преобразованиями в такую проекцию

    [Ответить]

  3. Boris:

    Одной из этих 4-х:
    «— Мелкомасшбаные проекции проекции России и бывш. Российской империи (с) — »
    «Азимутальная равноплощадная проекция Ламберта для РФ (105 в.д., 54 с.ш.; охват 90)», 29, 104, 7, 105, 54, 90
    «Азимут. равнопромежуточная для РФ (105 в.д., 54 с.ш.; охват 90)», 28, 104, 7, 105, 54, 90
    «Стереографическая (105 в.д., 54 с.ш.)», 20, 74, 7, 105, 54, 0.9996, 5000000, 1000000
    «Double Stereographic for Russia WGS84 (105 в.д., 54 с.ш.)», 31, 104, 7, 105, 54, 0.999912, 5000000, 1000000
    Запись взята из стандартного файла mapinfow.prj.

    [Ответить]

Оставить комментарий