我需要沿着两个其他纬度/经度点之间的直线折线段获得X百分比位置的纬度/经度 .
到目前为止我最接近的是使用以下(沿线40%):
google.maps.geometry.spherical.interpolate(startLatLng, endLatLng, 0.4);
这适用于短距离,但对于长折线段,返回的latlng在折线行进的位置之外,因为它沿着地球表面计算出最短距离,而不是平面 Map 上的最短距离 .
对此有任何帮助将不胜感激,希望我只是遗漏了一些明显的东西 .
必须有一些经过验证和测试的方法才能执行此操作,但是您可以使用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子午线的线的部分,但它在我尝试的几个快速测试中工作正常 .
看到这个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); });
2 回答
必须有一些经过验证和测试的方法才能执行此操作,但是您可以使用Maps API执行此操作:
将lat / lng坐标转换为像素
在像素平面中插值
转换回lat / lng
这大部分都很简单;一个麻烦是弄清楚如何处理穿过180子午线或极点的线 .
这里有一些半经过测试的代码,可以为您提供一个起点:
我不是100%确定处理穿过180子午线的线的部分,但它在我尝试的几个快速测试中工作正常 .
看到这个discussion in the Google Maps API v3 group
并且this example来自它
此建议代码将投影考虑在中间点: