4

Мне нужно получить широту/долготу позиции в процентах X по прямолинейному участку полилинии между двумя другими точками lat/lng.Google maps - получить latlng X% вдоль прямой полилинии

Ближайший я пришел до сих пор использую следующий (на 40% по линии):

google.maps.geometry.spherical.interpolate(startLatLng, endLatLng, 0.4); 

Это прекрасно работает на короткие расстояния, однако в течение длительного отрезка ломаной линии широты и долготы возвращенный находится вне где проходит полилиния, поскольку она разрабатывает кратчайшее расстояние вдоль земной поверхности, а не кратчайшее расстояние по плоской карте.

Любая помощь по этому вопросу будет оценена, надеюсь, я просто пропустил что-то очевидное.

+0

+1 .. Brilliant Вопрос .. – writeToBhuwan

ответ

1

Там должен быть какой-то проверенный и испытанный метод там, чтобы сделать это, но вот так, как вы могли бы сделать это с помощью API Карт:

  1. Преобразовать LAT/LNG координаты пикселей
  2. Interpolate в пиксельной плоскости
  3. Преобразовать обратно в Lat/LNG

Это в основном довольно проста; одна проблема заключается в том, как разобраться с линиями, которые пересекают меридиан 180 или полюс.

Вот некоторые полу проверенный код, который может дать вам место, чтобы начать:

function mercatorInterpolate(map, latLngFrom, latLngTo, fraction) { 
    // Get projected points 
    var projection = map.getProjection(); 
    var pointFrom = projection.fromLatLngToPoint(latLngFrom); 
    var pointTo = projection.fromLatLngToPoint(latLngTo); 
    // Adjust for lines that cross the 180 meridian 
    if(Math.abs(pointTo.x - pointFrom.x) > 128) { 
     if(pointTo.x > pointFrom.x) 
      pointTo.x -= 256; 
     else 
      pointTo.x += 256; 
    } 
    // Calculate point between 
    var x = pointFrom.x + (pointTo.x - pointFrom.x) * fraction; 
    var y = pointFrom.y + (pointTo.y - pointFrom.y) * fraction; 
    var pointBetween = new google.maps.Point(x, y); 
    // Project back to lat/lng 
    var latLngBetween = projection.fromPointToLatLng(pointBetween); 
    return latLngBetween; 
} 

Я не 100% уверен, что о той части, которая обрабатывает линии, которые пересекают 180 меридиан, но он хорошо работает в несколько быстрых тестов, которые я пробовал.

+0

Это, конечно, позаботится об этом, если полилиния не пересечет 180 меридианов. Любые рекомендации о том, где начать с вопроса о меридиане 180, будут высоко оценены. Также - пересечение полюсов не должно быть проблемой с картами google, если это так? – zedeso

+0

Я добавил немного кода для обработки перекрестка 180. Я думаю, что это может быть правильно, но только немного проверило его. Будет интересно узнать, работает ли это ... –

+0

Через все мои тесты это отлично работает, спасибо! – zedeso

0

discussion in the Google Maps API v3 group Смотреть это

И this example от него

Это указывает на код берет проекцию в расчет медианы:

google.maps.event.addListener(map, 'projection_changed', function() { 
    var projection = map.getProjection(); 
    if (!projection) return; 

    // Project 
    var startLatLng = startMarker.getPosition(); 
    var endLatLng = endMarker.getPosition(); 
    var startPoint = projection.fromLatLngToPoint(startLatLng); 
    var endPoint = projection.fromLatLngToPoint(endLatLng); 

    // Average 
    var midPoint = new google.maps.Point(
     (startPoint.x + endPoint.x)/2, 
     (startPoint.y + endPoint.y)/2); 

    // Unproject 
    var midLatLng = projection.fromPointToLatLng(midPoint); 
    midMarker.setPosition(midLatLng); 

}); 

 Смежные вопросы

  • Нет связанных вопросов^_^