4

我需要沿兩個其他經緯度點之間的直線折線段獲取X百分比位置的緯度/經度。谷歌地圖 - 沿直線折線獲得X%的座標

我已經走了這麼遠用最接近以下(對沿線40%):

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

這完全適用於短距離,但是對於經緯度返回長折線段之外的因爲它正在計算沿地球表面的最短距離,而不是通過平面地圖的最短距離。

對此的任何幫助將不勝感激,希望我只是失去了明顯的東西。

+0

+1 ..輝煌的問題.. – writeToBhuwan 2013-05-02 11:20:00

回答

1

必須有一些驗證和測試方法,在那裏要做到這一點,但這裏是一個辦法,你可以使用Maps API做到這一點:

  1. 轉換緯度/經度座標像素
  2. 插值在像素平面
  3. 轉換回緯度/經度

這多半是非常簡單的;一個麻煩就是如何處理穿過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子午線問題開始的建議都將非常感激。另外 - 交叉兩極應該不是谷歌地圖應該有問題嗎? – zedeso 2013-04-06 06:40:10

+0

我添加了一些代碼來處理180次穿越。我*認爲*這可能是正確的,但只測試了一下。將好奇,知道這是否工作... – 2013-04-06 10:41:38

+0

通過我所有的測試,這是完美的工作,謝謝! – zedeso 2013-04-08 00:59:39

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); 

});