我需要沿着两个其他纬度/经度点之间的直线折线段获得X百分比位置的纬度/经度。
我到目前为止最接近的是使用以下内容(沿线40%):
google.maps.geometry.spherical.interpolate(startLatLng, endLatLng, 0.4);
这适用于短距离,但对于长折线段,返回的latlng位于折线行进的位置之外,因为它沿着地球表面制作出最短距离,而不是平面地图上的最短距离。
对此的任何帮助都会受到赞赏,希望我只是遗漏了一些明显的东西。
答案 0 :(得分:1)
必须有一些经过验证和测试的方法才能做到这一点,但是这里有一种方法可以使用Maps API:
这大部分非常简单;一个麻烦是弄清楚如何处理穿过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);
});