首页 文章

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

提问于
浏览
4

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

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

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

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

对此有任何帮助将不胜感激,希望我只是遗漏了一些明显的东西 .

2 回答

  • 1

    必须有一些经过验证和测试的方法才能执行此操作,但是您可以使用Maps API执行此操作:

    • 将lat / lng坐标转换为像素

    • 在像素平面中插值

    • 转换回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

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

相关问题