我在谷歌地图中有很多标记(大约 3000 个),它们在弹出窗口中带有图标和高级详细信息。这就是为什么地图打开得很晚,所有标记也加载得很晚。因为我从数据库中加载了所有标记列表并一次性使用 foreach 循环显示它们。
现在我想在导航(滑动)地图时部分加载标记。
例如,如果我在Region1中,我只能在Region1中看到标记,当我将地图导航(滑动)到Region2时,仅加载Region2中的标记
请为此提供任何想法、示例或链接。Google Maps API 有导航事件吗?
我在谷歌地图中有很多标记(大约 3000 个),它们在弹出窗口中带有图标和高级详细信息。这就是为什么地图打开得很晚,所有标记也加载得很晚。因为我从数据库中加载了所有标记列表并一次性使用 foreach 循环显示它们。
现在我想在导航(滑动)地图时部分加载标记。
例如,如果我在Region1中,我只能在Region1中看到标记,当我将地图导航(滑动)到Region2时,仅加载Region2中的标记
请为此提供任何想法、示例或链接。Google Maps API 有导航事件吗?
您可以为中心和缩放级别更改注册地图事件,然后加载标记(如果它们在当前视口中):
function loadMarker() {
// Get the center lat/lng of the map
var center = map.getCenter();
// Get the size of the map viewport
var bounds = map.getBounds(),
var cor1 = bounds.getNorthEast(),
var cor2 = bounds.getSouthWest(),
var cor3 = new google.maps.LatLng(cor2.lat(), cor1.lng()),
var cor4 = new google.maps.LatLng(cor1.lat(), cor2.lng()),
var width = spherical.computeDistanceBetween(cor1,cor3),
var height = spherical.computeDistanceBetween( cor1, cor4);
// Loop through your markers
for(var i=0; i < <size of your marker array>; i++) {
// Get the distance between the center of the map and your markers
var distanceFromMarker = google.maps.geometry.spherical.computeDistanceBetween(center, <marker lat/lng>);
if(distanceFromMarker <= width || distanceFromMarker <= height) {
<load marker>
}
}
}
// Register center and zoom level change events
google.maps.event.addListener(map, 'center_changed', loadMarker);
google.maps.event.addListener(map, 'zoom_changed', loadMarker);
谷歌网站有一个专门针对这个问题的页面,采用不同的方法来提高性能: https ://developers.google.com/maps/articles/toomanymarkers
特别是“视口标记管理”一章应该包含一些关于如何实现你描述的内容的有用信息。
您可以根据需要从数据库请求基于地图边界的标记详细信息(例如在 bounds_changed 上)。
最佳情况下,您的数据库应该支持空间查询(但这不是必需的)