Отображение GeoJSON с буклетом, охватывающим 180-й меридиан

Я пытаюсь отобразить объект geoJSON (в данном случае контур России), охватывающий 180-й меридиан. В настоящее время часть страны отображается в левой части карты, а часть - в правой:

россия и 180-й меридиан

Глядя на листовку, кажется, что для этого есть исправление, но оно не работает: https://github.com/Leaflet/Leaflet/issues/82. Я также попытался добавить функцию coordsToLatLng, но не могу заставить ее работать. . Слои плиток имеют параметр continuousWorld, который, как мне кажется, не работает с объектом geoJSON.

Эти данные находятся здесь: https://dl.dropboxusercontent.com/u/12085570/RUS.json. Данные были сгенерированы из шейп-файла в geojson и, наконец, в topojson. Преобразование topojson Я использовал параметр --no-stitch-poles, который позволяет этому "красиво" отображаться на карте, что означает, что он не соединяет точки справа с левой частью карты.

Есть ли способ заставить это отображаться как непрерывный объект без разделения по меридиану?


person Rob    schedule 27.03.2014    source источник


Ответы (1)


Я столкнулся с той же проблемой, и мое решение заключалось в использовании нескольких вещей: 1) Leaflet позволяет размещать элементы за пределами 180 / -180 долготы. 2) Географические тела, пересекающие антимеридиан, содержат в основном все отрицательные или положительные координаты долготы.

Мое решение состояло в том, чтобы использовать рекурсивную функцию для обхода массива координат в объекте geoJSON и, в случае России, преобразовать отрицательные значения координат в эквивалентные положительные значения. Например, значение -175 будет преобразовано в 185.

Ниже приведена функция, которую я использовал для обработки массива координат. Я использовал его для местоположений в Восточном полушарии - вам придется изменить преобразование, чтобы работать с местоположениями в Западном полушарии.

  antimeridian(elem: any) {
   if (Array.isArray(elem)) {
     for (var i = 0; i < elem.length; i++) {
       if (Array.isArray(elem[i][0])) {
         this.antimeridian(elem[i]);
       } else {
         if (elem[i][0] < 0) {
           elem[i][0] = 180 + (180 + elem[i][0]);
         }
       }
     }
   }
 };
person jcarapia    schedule 10.08.2017
comment
Я абсолютно согласен. Я не видел другого способа сделать это. Я составляю карту пути кораблей из Ванкувера в Японию, поэтому делаю это наоборот: делаю долготы в диапазоне от 140E до 180E отрицательными, а не положительными отрицательными долготами, но в любом случае работает. - person Auspex; 09.10.2018
comment
Как я могу использовать это при загрузке файла GeoJSON? - person Giox; 23.06.2020