Отображать новые маркеры при изменении границы карты и очищать старый маркер - PullRequest
0 голосов
/ 19 февраля 2019

когда граница карты перемещена пользователем, заставить исчезнуть старые маркеры положения и отобразить новые маркеры.

Например, вы можете проверить эту карту .Маркеры перемещаются каждый раз, когда границы обновляются и очищают старые маркеры позиции.Я точно пытаюсь сделать это.

ОБНОВЛЕНО 2

То, что я сделал до сих пор, приведено ниже.Нет ошибок, но все равно отображаются все маркеры одновременно ..?

data(){
     return {
        bounds:{},
        map: {},
        mapName: "map",
        estates: [], 
     }
},
mounted() {
    axios.get('/ajax').then((response) => {
        this.estates =  response.data
        this.insertMarkers();
    });
    this.initMap();

},
methods: {

            initMap: function() {

        this.bounds = new google.maps.LatLngBounds(
            new google.maps.LatLng(34.652500, 135.506302),
        );

        var mapOptions = {
            mapTypeId: 'roadmap',
            center: new google.maps.LatLng(0, 0),
            zoom: 8
        };


        let self = this;

        this.map = new google.maps.Map(document.getElementById(this.mapName), mapOptions);

        var boundsListener = google.maps.event.addListener((this.map), 'bounds_changed', function(event) {

            self.getMarkers();

        });

        this.map.fitBounds(this.bounds);
    },

    getMarkers: function() {

        let bounds = this.map.getBounds();

        let southWest = bounds.getSouthWest();
        let northEast = bounds.getNorthEast();
        console.log(southWest);

        axios.get('/ajax', {
            params: {
                fromLat: southWest.lat()-0.01,
                toLat: northEast.lat()-0.01,
                fromLng: southWest.lng()+0.01,
                toLng: northEast.lng()+0.01,
            }
        }).then((response) => {
            this.estates = response.data;
            this.updateMarkers();
        });

    },

    updateMarkers: function() {


        google.maps.event.addListener(map, 'idle', function() {

            var map = this.map;
            var estates = this.estates;
            let i = 0;

            for (i = 0; i < this.markers.length; i++) {
                this.markers[i].setMap(null);
            }

            this.markers = [];

            for (i = 0; i < estates.length; i++) {

                var position = new google.maps.LatLng(estates[i].lat, estates[i].lng);

                var marker = new google.maps.Marker({
                    position: position,
                    map: map,
                    label: {
                        text:
                            estates[i].price.toString().length == 1 ?
                            estates[i].price.toString().replace("1", "未定") :
                            estates[i].price.toString() + "万",
                        color: '#fff',
                    },
                    icon: '/img/marker.png',
                    url: "/pages/" + estates[i].id,
                });

                this.markers.push(marker);

                google.maps.event.addListener(marker, 'click', function () {
                    window.location.href = this.url;
               });
            }
        });
    },

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Как я уже сказал в своем комментарии, вы можете сделать это наоборот.Извлекать только те маркеры, которые видны в области просмотра карты.Вам просто нужно немного реорганизовать свой код и изменить запрос к базе данных.

Вам необходимо передать минимальную и максимальную широту и долготу вашему контроллеру, чтобы вы могли запросить в БД маркеры между указанными широтами и долготами.Вы можете получить их, получив границы вашей карты и извлекая юго-запад и северо-восток широта / долгота.

export default {
  data() {
    return {
      bounds: {},
      map: {},
      mapName: "map",
      estates: [],
      markers: [] // Added markers array here
    }
  },
  mounted() {

    this.initMap(); // On "mounted" only call initMap
  },
  methods: {

    initMap: function() {

      //giving specific location of japan.
      this.bounds = new google.maps.LatLngBounds(
        new google.maps.LatLng(34.652500, 135.506302),
      );

      var mapOptions = {
        mapTypeId: 'roadmap',
        center: new google.maps.LatLng(0, 0),
        zoom: 5
      };

      this.map = new google.maps.Map(document.getElementById(this.mapName), mapOptions);

      let self = this;

      var boundsListener = google.maps.event.addListener((this.map), 'idle', function(event) {

        self.getMarkers(); // When map is idle, get markers
      });

      this.map.fitBounds(this.bounds);
    },
    getMarkers: function() {

      // Get current map bounds
      let bounds = this.map.getBounds();
      let southWest = bounds.getSouthWest();
      let northEast = bounds.getNorthEast();

      // Send request with min/max latitude and longitude to only fetch markers for that area
      axios.get('/ajax', {
        params: {
          fromLat: southWest.lat(),
          toLat: northEast.lat(),
          fromLng: southWest.lng(),
          toLng: northEast.lng(),
        }
      }).then((response) => {
        this.estates = response.data;
        this.updateMarkers();
      });
    },

    updateMarkers: function() {

      // Remove previous markers
      for (let i = 0; i < this.markers.length; i++) {
        this.markers[i].setMap(null);
      }

      // Reset markers array
      this.markers = [];

      // Add current markers
      for (i = 0; i < estates.length; i++) {

        var position = new google.maps.LatLng(estates[i].lat, estates[i].lng);

        var marker = new google.maps.Marker({
          position: position,
          map: map,
          icon: '/img/marker.png',
          url: "/pages/" + estates[i].id,
        });

        // Push marker to markers array for future removal
        this.markers.push(marker);
      }
    }
  }
}

В вашем контроллере вам нужно получить параметры, которые вы отправляете с запросом axios (fromLat, toLat и т. д.)

public function ajax() {

  // Here you need to retrieve the parameters sent by the axios request !
  // And set them as $fromLat, $toLat, etc.

  $data = \DB::table('allestates')
  ->where('lat', '>', $fromLat)
  ->where('lat', '<', $toLat)
  ->where('lng', '>', $fromLng)
  ->where('lng', '<', $toLng)
  ->get();

  $response = response()->json($data);
  return $response;
}

Не проверено, но это должно работать.Вам нужно адаптировать некоторые части!Читайте также мои комментарии в коде.

Примечание: Событие bounds_changed запускается несколько раз, когда пользователь перетаскивает карту, поэтому таким образом вы собираетесь отправить много запросов.в вашу базу данных.Вместо этого вам, вероятно, следует предпочесть другое событие, такое как idle, или как-то отложить запуск вашего вызова ajax, чтобы уменьшить количество запросов.

0 голосов
/ 19 февраля 2019

Вам нужно сохранить старое значение и сравнить с новым, вам нужна функция тайм-аута для обновления каждый раз iterval ex window.setTimeout (insertMarkers, 3000)

for(var i=0, len=res.length; i<len; i++) {

            //Do we have this marker already?
            if(markerStore.hasOwnProperty(res[i].driver_id)) {
                  markerStore[res[i].id].setPosition(new google.maps.LatLng({lat: parseFloat(res[i].lat), lng: parseFloat(res[i].lng)}));
            } else {
                 marker = new google.maps.Marker({
       position:  {lat: parseFloat(res[i].lat), lng: parseFloat(res[i].lng)},
       map:map       
                }); 
      google.maps.event.addListener(marker, 'click', (function(marker, i,id) {
                        return function() {
                            console.log(id)
                        }
                    })(marker, i,id));

                markerStore[res[i].id] = marker;

            }
        }
                markerStore[estate.id] = marker;

            }

    });

UPDATE

mounted() {
.
.
.

this.initMap();
window.setTimeout(this.insertMarkers,3000)

    },
methods: {
.
.
.
insertMarkers: function() {
var marker=[];
var markerStore = {};
    this.estates.forEach((estate, index) => {
 //Do we have this marker already?
            if(markerStore.hasOwnProperty(estate.id)) {
                  markerStore[estate.id].setPosition(new google.maps.LatLng({lat: parseFloat(estate.lat), lng: parseFloat(estate.lng)}));
            } else {
                 marker = new google.maps.Marker({
                     icon: '/img/marker.png',
                    position:  {lat: parseFloat(estate.lat), lng: parseFloat(estate.lng)},
                    map:map       
                }); 
                var es_id=estate.id;
      google.maps.event.addListener(marker, 'click', (function(marker, index,es_id) {
                        return function() {
                            console.log(es_id)
                             window.location.href = "/pages/" + es_id;
                        }
                    })(marker, index,es_id));
                markerStore[estate.id] = marker;
            }

    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...