这个问题演示了如何控制覆盖缩放范围和平移范围,以通过简单地不允许用户一次看到整个世界来防止换行。
防止 GMap v3 中覆盖层的水平世界环绕
所以问题的关键在于 OverlayView 获取像素坐标的位置。如果我们能弄清楚如何改进该部分以使形状保持在一起,它可能会解决我们的问题。这可能有助于测试换行,但它可能不起作用,因为即使我们放大,您的问题似乎也会发生。
var proj = overlay.getProjection();
var wwidth = 0;
if (proj) wwidth = proj.getWorldWidth();
var mapsWrapsAround=false;
if (__wwidth > 0 && __wwidth < domContainer.width()) mapsWrapsAround = true;
我意识到测试经度是否与起始经度不同可能不起作用,因为经度可能是正确的,但会映射到屏幕上的多个 div 位置。所以这是我们要测试的div像素坐标。但是也许您可以通过测试与地理坐标的差异相比是否在相反的方向来测试 x 的翻转。
// UNTESTED
// dimensioned somewhere outside
var start;
var startgeo;
// inside the overlay.onAdd content I think.
// Turn the overlay projection into a d3 projection
var googleMapProjection = function (coordinates) {
var googleCoordinates = new google.maps.LatLng(coordinates[1], coordinates[0]);
var pixelCoordinates = overlayProjection.fromLatLngToDivPixel(googleCoordinates);
var proj = overlay.getProjection();
var worldwidth = proj.getWorldWidth();
var finalX = pixelCoordinates.x;
if(typeof(start) === "undefined"){
start = pixelCoordinates;
startgeo = googleCoordinates;
}
else {
if(pixelCoordinates.x > start.x && googleCoordinates.lng() < startgeo.lng()){
finalX -= worldwidth;
}
else if(pixelCoordinates.x < start.x && googleCoordinates.lng() > startgeo.lng()){
finalX += worldwidth;
}
}
return [finalX, pixelCoordinates.y];
}
所以这是假设谷歌地图已经为每个坐标选择了最接近北美的屏幕位置。如果形状正确地结合在一起,那么如果结束经度大于开始经度,那么结束像素.X 也应该大于开始像素.X。但是,如果投影返回了世界另一侧的点,则相对于起始像素的新像素应该是错误的方向。也就是说,end.x 现在小于 start.x。所以要修复它,我们只需在可以修复问题的方向上按世界宽度调整像素。希望。