1

在我使用 setTimeout 摆脱地理编码器 OVER_QUERY_LIMIT 的 Asp.net Web 应用程序中,较短的超时时间是 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;
    }
4

1 回答 1

0

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

于 2012-11-24T20:52:02.073 回答