Я использую карты листовок, чтобы создать представление о кругосветном вызове. Я хотел бы добавить полилинию, которая направляется на восток от Токио, а затем появляется на карте к западу от Южной Америки, но вместо этого я получаю линию, которая пересекает карту в противоположном направлении (см. Желтую линию).
Я думаю, что это, вероятно, связано с датами и / или системами координат, но я немного схематичен в деталях. Может ли кто-нибудь объяснить теорию, стоящую за тем, что мне нужно сделать, чтобы заставить это работать? Я использую прогноз bluemarble от Nasa:
var bluemarble = new L.TileLayer.WMS("http://demo.opengeo.org/geoserver/wms", {
layers: 'bluemarble',
attribution: "Data © NASA Blue Marble, image service by OpenGeo",
minZoom: 2,
maxZoom: 5
});
coordinate-system
polyline-creation
leaflet
codecowboy
источник
источник
Ответы:
Вам нужно разбить ломаную линию на меридиане + -180 градусов. Это требует нахождения широты, на которой ломаная пересекает этот меридиан. Ваша ГИС, вероятно, имеет методы для взлома. Если нет, простое решение может быть получено из кода, показанного в связанном потоке . Вот некоторые подробности.
Полилиния представлена в виде последовательности вершин , каждая из которых представлена в форме (широта, долгота) с -180 <= lon <= 180. Вам необходимо проверить каждую последующую пару, чтобы увидеть, пересекает ли она меридиан + -180. Существует быстрый тест: если абсолютное значение разности долгот составляет 180 или больше, происходит пересечение.
Внутри каждого сегмента (lat0, lon0) -> (lat1, lon1), который пересекает меридиан + -180, необходимо разбить ломаную на две части, где она пересекается.
Ключ находит широту точки останова с разумной точностью. Это легче всего сделать с помощью сферической модели Земли: ошибка (по сравнению с более точной эллипсоидальной моделью) будет слишком мала, чтобы ее можно было заметить.
Пусть рассматриваемый отрезок проходит из точки 0 в точке (lat0, lon0) в точку 1 в точке (lat1, lon1). Точку разрыва можно найти, запустив отрезок прямой линии в 3D между двумя точками, представленными в декартовых координатах, и найдя, где координата y равна нулю. В декартовы координаты являются
и аналогичное выражение, дающее (x1, y1, z1) для точки 1. Решите уравнение
для т; то есть,
Поэтому координаты пересечения
Эта точка (которая лежит под поверхностью земли где-то под меридианом + -180) имеет широту, равную
Точка останова должна быть представлена двумя способами. Прикрепляя его после (lat0, lon0) для завершения первой части ломаной ломаной линии, используйте (lat2, -180), если lon0 отрицательно, и используйте в противном случае (lat2, 180). Прикрепляя его перед (lat1, lon1), чтобы начать вторую часть ломаной ломаной линии, следуйте аналогичному правилу.
В исключительных случаях одна или обе точки 0 и 1 могут находиться на меридиане + -180. Следуя этой процедуре, вы поместите сегмент нулевой длины на одну из созданных вами полилиний. Если это может вызвать проблемы с ГИС, проверьте это условие.
Обратите внимание, что ломаная может пересекать этот меридиан более одного раза. Следовательно, после обнаружения первого разрыва и разбиения ломаной на две части, вам необходимо обработать вторую часть таким же образом.
источник
Для связанного обсуждения, возможно, этот билет интересен:
«векторная проекция через границу обтекания разделена»
https://trac.osgeo.org/grass/ticket/1527
источник