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

标签 javascript dictionary settimeout marker geocode

在我的 Asp.net Web 应用程序中,我使用 setTimeout 来摆脱 geocoder OVER_QUERY_LIMIT,较短的超时时间是 10 毫秒,这对我来说太长了,我有 800 个以上来自 SQL SERVER 的地址,这些地址会增加,因为 setTimeout 将花费大约 5 到 7 分钟来替换 map 上的所有标记,这真令人沮丧。我研究并看到了这个链接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我不能,因为数据库中没有纬度和经度,客户将自己添加城市和国家,这就是为什么我必须通过地理编码来转换城市和国家名称,而地理编码在这里准确地完成它的工作 我如何通过网络服务调用城市和国家名称

    [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;
    }

最佳答案

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

关于javascript - 比 Google Map V3 上的 setTimeout 更好的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13545440/

相关文章:

setTimeout/setInterval 的 Javascript 循环问题

Javascript - setTimeout 未定义?

javascript - 关于JavaScript函数的两个问题

javascript - 在 Javascript 中保留一个数组

javascript - Angular 2 “ng-style” “*ngFor” 内背景颜色变化

java - 实现 HashMap<Integer, ArrayList<String>> 时如何为每个键提供不同的数组列表

python - 通过传递列表来索引字典

javascript - 如何创建一个表单切换开关来代替提交按钮?

javascript - 包装回调 API 并监听错误?

python - 在 Python 中构建多维字典时出现 KeyError