只在地图中获得一些标记

时间:2018-02-15 09:35:24

标签: angularjs google-maps google-maps-markers

我是angularJS的新手并且还在探索。我创建了一个地图并显示了大约1500个标记,但是当我加载时只有11个标记可见。我从XML文件中获取Zip代码并使用地理编码我是将它们转换为LatLng并在map中显示。任何人都可以建议任何解决方案。

提前致谢。

 //Angular App Module and Controller
var mapApp = angular.module('mapApp', []);

// app.directive("importSheetJs", [SheetJSImportDirective]);

mapApp.factory('mySHaredService', function ($rootScope) {
    var mySHaredService = {};
    mySHaredService.message = '';

    mySHaredService.prepForBroadcast = function (msg) {
        this.message = msg;
        this.broadcastItem();
    };
    return mySHaredService;
});

mapApp.controller('MapController', function ($scope, $timeout, $window, $rootScope, mySHaredService) {

    //Parsing data from XML
    $rootScope.zipArray = [];
    var url = "location.xlsx";
    var oReq = new XMLHttpRequest();
    oReq.open("GET", url, true);
    oReq.responseType = "arraybuffer";
    $rootScope.LatLongList = [{
        "latitudeValue": "",
        "longitudeValue": ""
    }];
    oReq.onload = function (e) {
        var arraybuffer = oReq.response;
        var data = new Uint8Array(arraybuffer);
        var arr = new Array();
        for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
        var bstr = arr.join("");

        var workbook = XLSX.read(bstr, { type: "binary" });

        var first_sheet_name = workbook.SheetNames[0];
        var address_of_cell = "K1";
        var worksheet = workbook.Sheets[first_sheet_name];
        data = JSON.stringify(XLSX.utils.sheet_to_json(worksheet));
        console.log("Messege data" + data);

        var finalData = JSON.parse(data);

        for (var i = 0; i <= finalData.length; i++) {
            // console.log("Zip code is " + finalData[i].Zip);
            $rootScope.zipArray.push(finalData[i].ZIP);
            console.log("Zip code inside zip array is " + $rootScope.zipArray[i]);

        }


    }
    setTimeout(function () {
        $scope.$apply(function () {

        })

    }, 17770);

    $timeout(function() {

        console.log("Zip data from excel sheet" + $rootScope.zipArray)
        var geocoder = new google.maps.Geocoder();
        for (var i = 15; i <= $rootScope.zipArray.length; i++) {
            var address = $rootScope.zipArray[i];
            geocoder.geocode({ 'address': address }, function (results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    var latitude = results[0].geometry.location.lat();
                    var longitude = results[0].geometry.location.lng();
                    $rootScope.LatLongList.push({
                        "latitudeValue": latitude,
                        "longitudeValue": longitude
                    });

                }

            });

        }
        // setTimeout(function () {
        //     $scope.$apply(function () {

        //     })

        // }, 30000);

        $timeout(function () {

            console.log("Latitude value " + $rootScope.LatLongList[1].latitudeValue)


            var mapOptions = {
                zoom: 11,
                center: new google.maps.LatLng(33.6496252, -117.9190418),
                mapTypeId: google.maps.MapTypeId.ROADMAP
            }
            $scope.map = new google.maps.Map(document.getElementById('map'), mapOptions);

            var circle = new google.maps.Circle({
                center: new google.maps.LatLng(33.6496252, -117.9190418),
                map: $scope.map,
                radius: 10000,          // IN METERS.
                fillColor: '#FF6600',
                fillOpacity: 0.3,
                strokeColor: "#FFF",
                strokeWeight: 0         // DON'T SHOW CIRCLE BORDER.
            });
            var bounds = circle.getBounds();

            $scope.markers = [];
            $rootScope.selectedAd = "";
            var selectedLocation = [{ "lat": 0, "long": 0 }];
            var infoWindow = new google.maps.InfoWindow();
            var createMarker = function (info) {

                var marker = new google.maps.Marker({
                    map: $scope.map,
                    position: new google.maps.LatLng(info.latitudeValue, info.longitudeValue),
                    title: ""
                });
                marker.content = '<div class="infoWindowContent">' + '<br />' + info.latitudeValue + ' E,' + info.longitudeValue + ' N, </div>';

                google.maps.event.addListener(marker, 'click', function () {
                    infoWindow.setContent('<h2>' + marker.title + '</h2>' +
                        marker.content);
                    infoWindow.open($scope.map, marker);
                    selectedLocation[0].lat = marker.getPosition().lat();
                    selectedLocation[0].long = marker.getPosition().lng();
                    console.log("Latitude is " + selectedLocation[0].lat + "Longitude is " + selectedLocation[0].long);
                    var geocoder = new google.maps.Geocoder();
                    geocoder.geocode({
                        latLng: marker.getPosition()
                    }, $scope.selectedLoc = function (responses) {
                        if (responses && responses.length > 0) {
                            // alert(responses[0].formatted_address);
                            $rootScope.selectedAd = responses[0].formatted_address;

                            setTimeout(function () {
                                $scope.$apply(function () {
                                    $rootScope.selectedAd = responses[0].formatted_address;

                                })

                            }, 1000);

                            $timeout(function () {
                                $rootScope.selectedAd = responses[0].formatted_address;
                                $scope.handleClick = function (msg) {
                                    mySHaredService.prepForBroadcast($rootScope.selectedAd);
                                }
                                $scope.$on('handleBroadcast', function () {
                                    $scope.message = $rootScope.selectedAd;
                                })

                            }, 2000);


                        } else {
                        }
                    });

                });
                $scope.markers.push(marker);

            }

            setTimeout(function () {

            }, 3000);

            $timeout(function () {
                for (i = 1; i < $rootScope.LatLongList.length; i++) {
                    console.log(bounds.contains(new google.maps.LatLng($rootScope.LatLongList[i].latitudeValue, $rootScope.LatLongList[i].longitudeValue)));
                    // if (bounds.contains(new google.maps.LatLng($rootScope.LatLongList[i].latitudeValue, $rootScope.LatLongList[i].longitudeValue))) {
                    createMarker($rootScope.LatLongList[i]);
                    console.log("The value of i is " + i);
                    // }

                }


            }, 4000);



            $scope.openInfoWindow = function (e, selectedMarker) {

                var data = $rootScope.selectedAd
                this.broadcastItem();
                window.location = "valuePage.html";

            }

        }, 4000);


    }, 2000);


    oReq.send();



});

mapApp.controller("viewApp", function ($scope, $rootScope, mySHaredService, $timeout) {

    // $scope.selectedAd = Products.FirstName;
    // $scope.selectedAd = Products.FirstName;

    setTimeout(function () {
        $scope.$on('handleBroadcast', function () {
            $scope.message = mySHaredService.message;

        });

    }, 3000);

    $timeout(function () {
        $scope.$on('handleBroadcast', function () {
            $scope.message = mySHaredService.message;

        });

    }, 4000);



});

1 个答案:

答案 0 :(得分:0)

这是因为您每秒发送的请求过多。

  

除每日配额限制外,地理编码服务的速率限制为50 QPS(每秒查询数),计算方式为客户端和服务器端查询的总和。

Optimizing Quota Usage When Geocoding有很多关于如何解释的策略。

在你的情况下,我建议你为每个请求做一个随机区间,这样你就可以分散它们,避免超过每秒50个请求的限制。

我已经修改了您提出请求的代码示例部分。

mapApp.controller('MapController', function ($scope, $timeout, $window, $rootScope, mySHaredService) {

//Parsing data from XML
$rootScope.zipArray = [];
var url = "location.xlsx";
var randomTime = Math.round(Math.random()*(3000-500))+500;    
var geocodeRequest = setTimeout(function() {
   var oReq = new XMLHttpRequest();
   oReq.open("GET", url, true);
   oReq.responseType = "arraybuffer";
   $rootScope.LatLongList = [{
      "latitudeValue": "",
      "longitudeValue": ""
   }];
   oReq.onload = function (e) {
     var arraybuffer = oReq.response;
     var data = new Uint8Array(arraybuffer);
     var arr = new Array();
     for (var i = 0; i != data.length; ++i) arr[i] = String.fromCharCode(data[i]);
     var bstr = arr.join("");

     var workbook = XLSX.read(bstr, { type: "binary" });

     var first_sheet_name = workbook.SheetNames[0];
     var address_of_cell = "K1";
     var worksheet = workbook.Sheets[first_sheet_name];
     data = JSON.stringify(XLSX.utils.sheet_to_json(worksheet));
     console.log("Messege data" + data);

     var finalData = JSON.parse(data);

     for (var i = 0; i <= finalData.length; i++) {
        // console.log("Zip code is " + finalData[i].Zip);
        $rootScope.zipArray.push(finalData[i].ZIP);
        console.log("Zip code inside zip array is " + $rootScope.zipArray[i]);

     }


  }
  setTimeout(function () {
    $scope.$apply(function () {

    })

  }, 17770);
}, randomTime);