4

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

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

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

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

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

4

2 回答 2

1

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

  1. 将 lat/lng 坐标转换为像素
  2. 在像素平面内插值
  3. 转换回 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 经线的线的部分,但在我尝试的几个快速测试中它工作正常。

于 2013-04-05T04:55:14.490 回答
0

请参阅Google Maps API v3 组中的此讨论

这个例子来自它

这个建议的代码将投影考虑到中点:

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

}); 
于 2013-04-05T04:55:38.003 回答