Google会映射自定义标记问题

时间:2015-03-27 08:58:54

标签: javascript google-maps google-maps-api-3

我试图在谷歌地图上可视化一些融合表数据。 我有许多记录,地址按地区编号分组。 基本上我想要发生的是以下内容:

  1. 我从ft
  2. 中提取数据
  3. 对于每条记录,我对地址进行了地理编码 并根据区号
  4. 分配自定义标记
  5. 我可视化按不同标记分组的所有不同记录
  6. 这是我到目前为止所做的:

    这是查询到

    var query = "SELECT 'Full Address' , Territory FROM " + tableid;
              query = encodeURIComponent(query);
              var gvizQuery = new google.visualization.Query(
                  'http://www.google.com/fusiontables/gvizdata?tq=' + query);
    

    现在我想详细说明查询数据

    gvizQuery.send(function(response) {
          var numRows = response.getDataTable().getNumberOfRows();
          // For each row in the table, create a marker
          for (var i = 0; i < numRows; i++) {
            var stringaddress = response.getDataTable().getValue(i, 0);
            var territory = response.getDataTable().getValue(i,1);
            **latlng**(stringaddress,
            function(data){
              console.log(data);
              **createMarker**(data,territory,stringaddress);//callback
            });
          }
        });
    

    以下是 latlng函数:,它返回字符串地址中的Google地图点

    function latlng(address,callback){
            var latlng;
            var geocoder = new google.maps.Geocoder();
            geocoder.geocode({
                "address": address
            }, function(results,status) {
               if ( status == google.maps.GeocoderStatus.OK ) { 
                latlng= new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng());
                callback(latlng);
               }
            });
        }
    

    最后这里是创建标记功能

    var createMarker = function(coordinate, territory,address) {
            console.log("now drawing marker for " + coordinate + "found in territory number " + territory);
            var markerpath="images/icon"+territory+".png";
              var marker = new google.maps.Marker({   
                map: map,
                position: coordinate,
                icon: new google.maps.MarkerImage(markerpath)
              });
              google.maps.event.addListener(marker, 'click', function(event) {
                infoWindow.setPosition(coordinate);
                infoWindow.setContent('Address: ' + address + '<br>Territory = ' + territory);
                infoWindow.open(map);
              });
            };
    

    我面临的问题是,虽然我应该为我的ft 的每个记录调用createmarker函数,但实际上只被调用了几次 (满分250分)和仅代表一个领土(编号7)。 我在做什么? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

地理编码器受限于速率限制和配额,在大约10个地理编码操作之后,您将看到返回的状态为OVER_QUERY_LIMIT(您的代码默默忽略)。要查看问题,请记录返回的状态:

function latlng(address,callback){
    var latlng;
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({
        "address": address
    }, function(results,status) {
       if ( status == google.maps.GeocoderStatus.OK ) { 
        latlng= new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng());
        callback(latlng);
       } else {
         console.log("geocode failed: "+status);
       }
    });
}

(或者您可以添加警报,这对于200个标记来说真的很烦人)

你需要适当地处理OVERY_QUERY_LIMIT(限制你的请求),但这可能会使你的地图加载太慢。

最佳选择:离线地理编码地址并将坐标存储在FusionTable中,在查询中返回它们并使用它们显示标记。