谷歌地图 - 沿直线折线获得X%的坐标

问题描述:

我需要沿两个其他经纬度点之间的直线折线段获取X百分比位置的纬度/经度。谷歌地图 - 沿直线折线获得X%的坐标

我已经走了这么远用最接近以下(对沿线40%):

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

这完全适用于短距离,但是对于经纬度返回长折线段之外的因为它正在计算沿地球表面的最短距离,而不是通过平面地图的最短距离。

对此的任何帮助将不胜感激,希望我只是失去了明显的东西。

+0

+1 ..辉煌的问题.. – writeToBhuwan 2013-05-02 11:20:00

必须有一些验证和测试方法,在那里要做到这一点,但这里是一个办法,你可以使用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

看到这个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); 

});