Google 地图 - 沿直线折线获取 X% 的纬度

zed*_*eso 5 javascript google-maps google-maps-api-3 google-polyline

我需要沿着其他两个纬度/经度点之间的直折线段获取 X 百分比位置的纬度/经度。

到目前为止,我最接近的是使用以下内容(占 40%):

google.maps.geometry.spherical.interpolate(startLatLng, endLatLng, 0.4);
Run Code Online (Sandbox Code Playgroud)

这对于短距离非常有效,但是对于长折线段,返回的纬度位于折线行进的位置之外,因为它计算出沿地球表面的最短距离,而不是平面地图上的最短距离。

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

Mic*_*ary 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;
}
Run Code Online (Sandbox Code Playgroud)

我对处理穿过 180 度子午线的线的部分不是 100% 确定,但在我尝试的几个快速测试中它工作正常。