比Google Map V3上的setTimeout更好的方法

时间:2012-11-24 20:48:03

标签: javascript map settimeout marker geocode

在我的Asp.net Web应用程序中,我使用setTimeout来摆脱 地理编码器OVER_QUERY_LIMIT,较短的超时时间为10毫秒,这对我来说太长了,我有800个以上来自SQL SERVER的地址,由于这个setTimeout需要大约5到7分钟来取代地图上的所有标记那令人沮丧。我研究过并看到了这个链接setTimeout: how to get the shortest delay

但是无法弄清楚他究竟想做什么。请有人指导我......

    function InitializeMap() {       
    // Here am calling the webService by PageMethods in which CityNames, Countries Name will take their places 
    PageMethods.GetCitiesbyUser_Extender(onSucess);

    var myOptions =
    {
       zoom: 0, 
        center: new google.maps.LatLng(-34.397, 150.644),
        mapTypeId: google.maps.MapTypeId.ROADMAP,

    };
    var map = new google.maps.Map(document.getElementById("map"), myOptions);
    // Creating latlngbound to bound the markers on map
    var bounds = new google.maps.LatLngBounds(); 

    //// Creating an array that will contain the addresses 
    var places = []; 
    // Creating a variable that will hold the InfoWindow object 
    var infowindow; 
    // create this to add the marker Cluster on map
    mc = new  MarkerClusterer(map);
    var popup_content = [];
    var geocoder = new google.maps.Geocoder(); 
    // image for ballon i want to change default ballon to this
    var iconimage = "http://chart.apis.google.com/chart?cht=mm&chs=24x32&chco=FFFFFF,008CFF,000000&ext=.png";        
    var markers = [];

    // Create this function for passing the values which was taken by webservice cntName is the return in webservice 
    function onSucess(cntName){
    // loop through the cntName to pass the individual City one by one from geocode
        for (i = 0; i < cntName.length; ++i) {
               //for  fixing the issue use closure to localize the cntName[i] variable before passing into geocode and callback function within it.
            (function CreateMarkAndInfo(address) {
                geocoder.geocode({ 'address': address },
                    function (results, status) {
                        if (status == google.maps.GeocoderStatus.OK) {
                            places[i] = results[0].geometry.location;

                            var marker = new google.maps.Marker({
                                position: places[i],
                                title: results[0].formatted_address,
                                map: map,
                                icon: iconimage
                            });

                            markers.push(marker);
                            mc.addMarker(marker);
                            google.maps.event.addListener(marker, 'click', function () {
                                if (!infowindow) {
                                    infowindow = new google.maps.InfoWindow();
                                }

                                // Setting the content of the InfoWindow afterward
                                infowindow.setContent(popup_content[i]);

                                // Tying the InfoWindow to the marker afterward
                                infowindow.open(map, marker);
                            });

                            // Extending the bounds object with each LatLng 
                            bounds.extend(places[i]);

                            // Adjusting the map to new bounding box 
                            map.fitBounds(bounds);
                            // Zoom out after fitBound
                            var listener = google.maps.event.addListenerOnce(map, "idle", function () {
                                if (map.getZoom() < 10) map.setZoom(2);

                            });
                        }
                        else {
                            // if geocode will end the limit then make delay by timer in order to avoid the OVER_QUERY_LIMIT
                            if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                                setTimeout(function () { CreateMarkAndInfo(address); }, (15)); // here i think i should use better approch but for now it`s ok.                                   
                            }

                            else {
                                alert("Geocode was not successful for the following reason: " + status);
                            }  
                        }                            
                    });

            })(cntName[i]);// End closure trick     
        }  
    }
}
google.maps.event.addDomListener(window, 'load', InitializeMap);

修改 @ just.another.programmer我不能因为DB中没有经常和经度,客户会自己添加城市和国家,这就是为什么我必须通过地理编码和地理编码来传达城市和国家名称 我如何通过网络服务呼叫城市和国家名称

    [System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod()]
    public static string[] GetCitiesbyUser_Extender()
    {       
        System.Data.DataSet dtst = new System.Data.DataSet();
        string ses = HttpContext.Current.Session["UserName"].ToString();
        USTER.Dal.clsSearch clssearch = new USTER.Dal.clsSearch();
        // Assinging the Stroed Procedure Method to DataSet
        dtst = clssearch.GetAllCitiesByUser(ses);
        string[] cntName = new string[dtst.Tables[0].Rows.Count];
        int i = 0;
        try
        {
            foreach (System.Data.DataRow rdr in dtst.Tables[0].Rows)
            {
                // Columns Name in SQL Server Table "CityName" and "CountryName"
                cntName.SetValue(rdr["CityName"].ToString() +","+ rdr["CountryName"].ToString() , i);
                i++;
            }
        }
        catch { }
        finally
        {

        }
        return cntName;
    }

1 个答案:

答案 0 :(得分:0)

首次获取地址时对地址进行地理编码一次,然后将数据/地址存储在数据库中,这样您就不必再次进行地理编码。这将显着减少您的地理位置请求,并消除对setTimeout的需求。