谷歌地图 - 沿直线折线获得X%的拉幅

时间:2013-04-05 03:44:10

标签: javascript google-maps google-maps-api-3 google-polyline

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

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

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

这适用于短距离,但对于长折线段,返回的latlng位于折线行进的位置之外,因为它沿着地球表面制作出最短距离,而不是平面地图上的最短距离。

对此的任何帮助都会受到赞赏,希望我只是遗漏了一些明显的东西。

2 个答案:

答案 0 :(得分:1)

必须有一些经过验证和测试的方法才能做到这一点,但是这里有一种方法可以使用Maps API:

  1. 将lat / lng坐标转换为像素
  2. 插入像素平面
  3. 转换回lat / lng
  4. 这大部分非常简单;一个麻烦是弄清楚如何处理穿过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;
    }
    

    我不是百分之百地确定处理穿过180子午线的线的部分,但是在我尝试的几个快速测试中它可以正常工作。

答案 1 :(得分: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);

});