我有一个使用asp .net中的代码构建的脚本。它运行正常,但只显示200个地图上的前11个标记。它会抛出错误,说'0'为空或不是第12个地址的对象。即使我删除了第12个地址后它仍然表现相同。数据库中的所有物理地址也是有效的。我有200个这样的地址。我正在使用 google map api v3 。在此先感谢您的帮助。这是我用来构建脚本的方法:
private void MapScript(DataSet ds)
{
StringBuilder sb = new StringBuilder();
string itemList = string.Empty;
foreach (DataRow r in ds.Tables[0].Rows)
{
// bypass empty rows
if (r["Address"].ToString().Trim().Length == 0)
continue;
sb = sb.Append("'" + r["Address"].ToString().Trim() + "',");
}
if (sb.Length > 0)
{
itemList = sb.ToString().Substring(0, sb.ToString().Length - 1);
itemList = itemList.Replace("\n", " ");
}
//script
script.Text = @"<script type='text/javascript'>
window.onload = function() {
var temp = [" + itemList + @"];
var latlng = new google.maps.LatLng(32.802955, -96.769923);
var options = {
zoom: 10,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById('map_canvas'), options);
var geocoder = new google.maps.Geocoder();
for (var i = 0; i < temp.length; i++) {
(function(address) {
geocoder.geocode({
'address': address
}, function(results) {
var marker = new google.maps.Marker({
map: map,
position: results[0].geometry.location,
title: address
});
});
})(temp[i]);
}
}
</script> ";
}
答案 0 :(得分:1)
您收到错误'0' is null or not an object
,因为在尝试设置标记的位置属性之前,您没有检查请求的状态。就像@david所说,返回的状态可能是OVER_QUERY_LIMIT
。
这是我在测试期间处理此问题的方法。基本上,它检查返回的状态,如果状态超过限制,它将等待200毫秒并再次尝试。我只在测试环境中使用过这个,因为客户端有一个不受限制的高级帐户。 200毫秒似乎是现在的最佳点,但谷歌已经改变了过去一秒钟可以提出多少请求的限制。
Here is a fiddle of it working
function Geocode(address) {
geocoder.geocode({
'address': address
}, function(results, status) {
if (status === google.maps.GeocoderStatus.OK) {
//update finished count so we know which markers are done.
finishedCount++;
UpdateProgress();
var result = results[0].geometry.location;
var marker = new google.maps.Marker({
position: result,
map: map
});
bounds.extend(marker.position);
} else if (status === google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
setTimeout(function(){
//retry
Geocode(address);
}, 200);
}else{
alert("Geocode was not successful for the following reason: "
+ status);
}
});
}
function UpdateProgress(){
var progress = Math.round((finishedCount / citiesInTexas.length) * 100);
$('#progress').text("percent done: " + progress);
if(progress === 100)
map.fitBounds(bounds);
}