Google Maps V3 API 中的地理编码(Geocoding)是将地址转换为地理坐标(经度/纬度)的过程,反向地理编码则是将坐标转换为可读地址的过程。在循环中创建标记(Marker)是地图应用中常见的需求,比如批量显示多个地点。
原因:异步回调导致闭包问题,变量被覆盖
解决方案:使用闭包或立即执行函数(IIFE)保持变量作用域
function geocodeAddress(addresses) {
for (var i = 0; i < addresses.length; i++) {
(function(index) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({'address': addresses[index]}, function(results, status) {
if (status === 'OK') {
createMarker(results[0].geometry.location, addresses[index]);
}
});
})(i);
}
}
原因:大量DOM元素影响性能
解决方案:
// 使用MarkerClusterer插件示例
var markers = [];
for (var i = 0; i < locations.length; i++) {
var marker = new google.maps.Marker({
position: locations[i],
map: map
});
markers.push(marker);
}
var markerCluster = new MarkerClusterer(map, markers, {imagePath: 'images/m'});
原因:Google Maps API有请求频率限制
解决方案:
// 实现延迟队列
function processWithDelay(addresses, delay) {
var i = 0;
function processNext() {
if (i < addresses.length) {
geocodeAddress(addresses[i]);
i++;
setTimeout(processNext, delay);
}
}
processNext();
}
原因:循环中创建的事件监听器共享变量
解决方案:使用闭包或数据属性
for (var i = 0; i < locations.length; i++) {
var marker = new google.maps.Marker({
position: locations[i],
map: map,
data: locations[i].info // 附加数据
});
google.maps.event.addListener(marker, 'click', (function(marker) {
return function() {
infoWindow.setContent(marker.data);
infoWindow.open(map, marker);
};
})(marker));
}
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 8,
center: {lat: -34.397, lng: 150.644}
});
var geocoder = new google.maps.Geocoder();
var infoWindow = new google.maps.InfoWindow();
var addresses = [
'1600 Amphitheatre Parkway, Mountain View, CA',
'1 Infinite Loop, Cupertino, CA',
'350 5th Ave, New York, NY'
];
// 地理编码并创建标记
geocodeAddresses(addresses, map, geocoder, infoWindow);
}
function geocodeAddresses(addresses, map, geocoder, infoWindow) {
for (var i = 0; i < addresses.length; i++) {
(function(address) {
geocoder.geocode({'address': address}, function(results, status) {
if (status === 'OK') {
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
title: address
});
// 添加点击事件
marker.addListener('click', function() {
infoWindow.setContent('<div>' + address + '</div>');
infoWindow.open(map, marker);
});
} else {
console.log('Geocode was not successful for: ' + address);
}
});
})(addresses[i]);
}
}
没有搜到相关的文章