2016-06-16 3 views
0

Я пытаюсь нарисовать геодезическую линию с arc.js. Он отлично работает, когда разница между долготами точек меньше 180. В противном случае, например, долготы 179 и -179, OpenLayers рисует линию с наибольшим расстоянием.Как рисовать геодезическую линию по краям карты в OpenLayers 3?

Таким образом, я нашел решение для прямой линии:

  1. Проверки, если разница между долготами составляет более 180
  2. Расчета пересечения необходимой линии и карты края (нахождение временной точки с долготой 180 или -180)
  3. Создание ol.geom.MultiLineString с массивом [[firstPoint, temporaryPoint], [temporaryPoint, secondPoint]]
  4. Создание функции с линией

И он отлично работает. Но довольно сложно сделать этот трюк для геодезической линии с arc.js. Основная проблема заключается в вычислении пересечения.

enter image description here

Я должен найти решение в OpenLayers документации или examples, но нет ни одного примера с картой края пересечения.

+0

OFF-TOPIC: почему враждебность в вашей картине? –

+0

@ JonatasWalker no longer :) –

+0

Hahaha .. намного лучше :-) –

ответ

1

После нескольких часов расследования я нашел решение. Это похоже на трюк, но он отлично работает.

Прежде всего здесь оригинальный код из arc.js documentation:

var start = { x: currentPoint.longitude, y: currentPoint.latitude }, 
    end = { x: nextPoint.longitude, y: nextPoint.latitude }, 
    generator = new arc.GreatCircle(start, end), 
    arcLine = generator.Arc(1000 ,{offset:10}); 

Основной вопрос arc.js не может вычислить координаты линии, пересекающей International Date Line. Поэтому я решил переместить очки в одну плитку перед вычислением Great Circle.

я должен был найти долготу смещение:

var dateLineOffset = 180 - currentPoint.longitude; 

Это также может быть nextPoint.longitude. Зависит от того, какая точка расположена слева.

После этого вы можете использовать arc.js генерировать координаты:

var start = { x: -180, y: currentPoint.latitude }, 
    end = { x: nextPoint.longitude + dateLineOffset, y: nextPoint.latitude }, 
    generator = new arc.GreatCircle(start, end), 
    arcLine = generator.Arc(1000 ,{offset:10}); 

Затем вам нужно перебирать сгенерированные координаты и фиксирует смещение. В моем случае я использовал map.

var coordinatesWithOffset = arcLine.geometries[0].coords, 
    geodesicLineCoordinates = coordinatesWithOffset.map(function(coord) { 
     return ol.proj.fromLonLat([coord[0] - dateLineOffset, coord[1]]); 
    }), 
    geodesicLine = ol.geom.LineString(geodesicLineCoordinates); 

Всё. geodesicLine будет содержать правильные координаты.

enter image description here