我有一个折线列表,就像谷歌地图does一样,当我点击折线时我希望信息窗口显示在我点击的位置,并且它可以正常使用此功能
function mapsInfoWindow(polyline, content) {
google.maps.event.addListener(polyline, 'click', function(event) {
infowindow.content = content;
infowindow.position = event.latLng;
infowindow.open(map);
});
}
当我点击列表时出现问题(使用相同的功能),事件显然没有 latLng ,但我想要信息窗口无论如何都要显示在折线的中间,就像点击谷歌地图链接I mentioned before中的列表一样。
尝试LatLngBounds();但是这给了折线创建的区域的实际中心,而不是我需要的中间区域。
知道该怎么做吗?
答案 0 :(得分:5)
所以这就是(有点hacky)解决方案。
使用http://www.geocodezip.com/scripts/v3_epoly.js库,然后计算折线的总长度(各种方式),将其除以一半并调用epoly的.GetPointsAtDistance()函数。
这应该返回LatLng点,但它有时会有点怪异,返回两点甚至以某种方式转向那个点#34;破坏"。所以你可以做的最安全的事情可能就是:
var pointInHalf = polyline.GetPointsAtDistance(polylineLength);
var pointCoordinate = new google.maps.LatLng(pointInHalf[0].lat(), pointInHalf[0].lng());
嗯,总比没有好。
答案 1 :(得分:4)
来自http://www.geocodezip.com/v3_polyline_example_geodesic_proj.html
没有扩展并假设折线是一条直线。
可以将纬度/经度坐标转换为点平面(x,y)位置,并计算两者之间的平均值。这将为您提供一个中心像素位置。然后,您可以将此位置转换回latlng以进行地图绘制。
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);
var midMarker = createMarker(midLatLng, "text");
有关更改投影的更多信息http://code.google.com/apis/maps/documentation/javascript/reference.html#Projection
答案 2 :(得分:2)
首先,您需要使用计算距离的几何库。将libraries = geometry添加到JS调用中,例如
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry"></script>
假设您知道折线的起点和终点,您应该可以这样做:
var inBetween = google.maps.geometry.spherical.interpolate(startLatlng, endLatlng, 0.5);
infowindow.position = inBetween;
我想如果您还不知道起点和终点,可以从polyline.getPath()中解决。
答案 3 :(得分:2)
获取你应该做的折线的坐标:
var widePath = new google.maps.Polyline({
path: waypointsCoordinates,
strokeColor: '#3366FF',
strokeOpacity: 0.0,
editable: true,
draggable: true,
strokeWeight: 3
});
并且做:
var latLng [];
latLng = widePath.getPath().getArray();
答案 4 :(得分:2)
也可能有点旧,但为什么不在点击上添加信息框?
infowindow.setPosition(event.latLng);
infowindow.open(this.getMap());
如果是点击次数。