How to filter Google Maps markers in one array with select?

后端 未结 2 1314
不知归路
不知归路 2021-01-31 23:16

I have a google maps implemented in my site with one array, like so:

var gmarkers1 = [];
var markers1 = [];

markers1 = [
[\'0\', \'Title\', 52.4357808, 4.9913156         


        
2条回答
  •  独厮守ぢ
    2021-01-31 23:27

    You should add category as marker property.

    markers1 = [
        ['0', 'Title 1', 52.4357808, 4.991315699999973, 'car'],
        ['1', 'Title 2', 52.4357808, 4.981315699999973, 'third'],
        ['2', 'Title 3', 52.4555687, 5.039231599999994, 'car'],
        ['3', 'Title 4', 52.4555687, 5.029231599999994, 'second']
    ];
    

    Create marker. Marker is object, so add category as property.

    var category = markers1[i][4];
    var pos = new google.maps.LatLng(markers1[i][2], markers1[i][3]);
    marker1 = new google.maps.Marker({
        position: pos,
        map: map,
        category: category,
        icon: image1
    });
    

    And on select change, call function what checks if category is same as selected.

    /**
     * Function to filter markers by category
     */
    
    filterMarkers = function(category)
    {
       for (i = 0; i < gmarkers1.length; i++) {
          marker = gmarkers1[i];
    
          // If is same category or category not picked
          if(marker.category == category || category.length == 0)
          {
              marker.setVisible(true);
          }
          // Categories don't match 
          else
          {          
              marker.setVisible(false);
          }
        }  
    }
    

    Working example

    var gmarkers1 = [];
    var markers1 = [];
    var infowindow = new google.maps.InfoWindow({
        content: ''
    });
    
    // Our markers
    markers1 = [
        ['0', 'Title 1', 52.4357808, 4.991315699999973, 'car'],
        ['1', 'Title 2', 52.4357808, 4.981315699999973, 'third'],
        ['2', 'Title 3', 52.4555687, 5.039231599999994, 'car'],
        ['3', 'Title 4', 52.4555687, 5.029231599999994, 'second']
    ];
    
    /**
     * Function to init map
     */
    
    function initialize() {
        var center = new google.maps.LatLng(52.4357808, 4.991315699999973);
        var mapOptions = {
            zoom: 12,
            center: center,
            mapTypeId: google.maps.MapTypeId.TERRAIN
        };
    
        map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
        for (i = 0; i < markers1.length; i++) {
            addMarker(markers1[i]);
        }
    }
    
    /**
     * Function to add marker to map
     */
    
    function addMarker(marker) {
        var category = marker[4];
        var title = marker[1];
        var pos = new google.maps.LatLng(marker[2], marker[3]);
        var content = marker[1];
    
        marker1 = new google.maps.Marker({
            title: title,
            position: pos,
            category: category,
            map: map
        });
    
        gmarkers1.push(marker1);
    
        // Marker click listener
        google.maps.event.addListener(marker1, 'click', (function (marker1, content) {
            return function () {
                console.log('Gmarker 1 gets pushed');
                infowindow.setContent(content);
                infowindow.open(map, marker1);
                map.panTo(this.getPosition());
                map.setZoom(15);
            }
        })(marker1, content));
    }
    
    /**
     * Function to filter markers by category
     */
    
    filterMarkers = function (category) {
        for (i = 0; i < gmarkers1.length; i++) {
            marker = gmarkers1[i];
            // If is same category or category not picked
            if (marker.category == category || category.length === 0) {
                marker.setVisible(true);
            }
            // Categories don't match 
            else {
                marker.setVisible(false);
            }
        }
    }
    
    // Init map
    initialize();
    #map-canvas {
        width: 500px;
        height: 500px;
    }
    
    


    Filter by multiple categories on marker

    EDIT for @Myoji comment

    To use multiple categories on each marker, just add them as array and edit if condition on filterMarkers.

    markers1 = [
        ['0', 'Title 1', 52.4357808, 4.991315699999973, ['car', 'second']],
        ['1', 'Title 2', 52.4357808, 4.981315699999973, ['third']],
        ['2', 'Title 3', 52.4555687, 5.039231599999994, ['car', 'third']],
        ['3', 'Title 4', 52.4555687, 5.029231599999994, ['second']]
    ];
    

    And filterMarkers would be

    /**
     * Function to filter markers by category
     */
    
    filterMarkers = function(category)
    {
       for (i = 0; i < gmarkers1.length; i++) {
          marker = gmarkers1[i];
    
          // If is same category or category not picked
          if((typeof marker.category == 'object' && marker.category.indexOf(category) >= 0) || category.length == 0){
          {
              marker.setVisible(true);
          }
          // Categories don't match 
          else
          {          
              marker.setVisible(false);
          }
        }  
    }
    

    Working example

    var gmarkers1 = [];
    var markers1 = [];
    var infowindow = new google.maps.InfoWindow({
        content: ''
    });
    
    // Our markers
    markers1 = [
      ['0', 'Title 1', 52.4357808, 4.991315699999973, ['car', 'second']],
      ['1', 'Title 2', 52.4357808, 4.981315699999973, ['third']],
      ['2', 'Title 3', 52.4555687, 5.039231599999994, ['car', 'third']],
      ['3', 'Title 4', 52.4555687, 5.029231599999994, ['second']]
    ];
    
    /**
     * Function to init map
     */
    
    function initialize() {
        var center = new google.maps.LatLng(52.4357808, 4.991315699999973);
        var mapOptions = {
            zoom: 12,
            center: center,
            mapTypeId: google.maps.MapTypeId.TERRAIN
        };
    
        map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
        for (i = 0; i < markers1.length; i++) {
            addMarker(markers1[i]);
        }
    }
    
    /**
     * Function to add marker to map
     */
    
    function addMarker(marker) {
        var category = marker[4];
        var title = marker[1];
        var pos = new google.maps.LatLng(marker[2], marker[3]);
        var content = marker[1];
    
        marker1 = new google.maps.Marker({
            title: title,
            position: pos,
            category: category,
            map: map
        });
    
        gmarkers1.push(marker1);
    
        // Marker click listener
        google.maps.event.addListener(marker1, 'click', (function (marker1, content) {
            return function () {
                console.log('Gmarker 1 gets pushed');
                infowindow.setContent(content);
                infowindow.open(map, marker1);
                map.panTo(this.getPosition());
                map.setZoom(15);
            }
        })(marker1, content));
    }
    
    /**
     * Function to filter markers by category
     */
    
    filterMarkers = function (category) {
        for (i = 0; i < gmarkers1.length; i++) {
            marker = gmarkers1[i];
            // If is same category or category not picked
            if((typeof marker.category == 'object' && marker.category.indexOf(category) >= 0) || category.length == 0){
                marker.setVisible(true);
            }
            // Categories don't match 
            else {
                marker.setVisible(false);
            }
        }
    }
    
    // Init map
    initialize();
    #map-canvas {
        width: 500px;
        height: 500px;
    }
    
    


    Fit bounds after filtering

    EDIT for @bluantinoo comment

    /**
     * Function to filter markers by category
     */
    
    filterMarkers = function(category)
    {
        var bounds = new google.maps.LatLngBounds();
        for (i = 0; i < gmarkers1.length; i++) {
            marker = gmarkers1[i];
    
            // If is same category or category not picked
            if(marker.category == category || category.length == 0)
            {
                marker.setVisible(true);
                bounds.extend(marker.getPosition());
            }
            // Categories don't match 
            else
            {          
                marker.setVisible(false);
            }
            map.fitBounds(bounds);
        }  
    }
    

    Working example

    var gmarkers1 = [];
    var markers1 = [];
    var infowindow = new google.maps.InfoWindow({
        content: ''
    });
    
    // Our markers
    markers1 = [
        ['0', 'Title 1', 52.4357808, 4.991315699999973, 'car'],
        ['1', 'Title 2', 52.4357808, 4.981315699999973, 'third'],
        ['2', 'Title 3', 52.4555687, 5.039231599999994, 'car'],
        ['3', 'Title 4', 52.4555687, 5.029231599999994, 'second']
    ];
    
    /**
     * Function to init map
     */
    
    function initialize() {
        var center = new google.maps.LatLng(52.4357808, 4.991315699999973);
        var mapOptions = {
            zoom: 12,
            center: center,
            mapTypeId: google.maps.MapTypeId.TERRAIN
        };
    
        map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
        for (i = 0; i < markers1.length; i++) {
            addMarker(markers1[i]);
        }
    }
    
    /**
     * Function to add marker to map
     */
    
    function addMarker(marker) {
        var category = marker[4];
        var title = marker[1];
        var pos = new google.maps.LatLng(marker[2], marker[3]);
        var content = marker[1];
    
        marker1 = new google.maps.Marker({
            title: title,
            position: pos,
            category: category,
            map: map
        });
    
        gmarkers1.push(marker1);
    
        // Marker click listener
        google.maps.event.addListener(marker1, 'click', (function (marker1, content) {
            return function () {
                console.log('Gmarker 1 gets pushed');
                infowindow.setContent(content);
                infowindow.open(map, marker1);
                map.panTo(this.getPosition());
                map.setZoom(15);
            }
        })(marker1, content));
    }
    
    /**
     * Function to filter markers by category
     */
    
    filterMarkers = function(category)
    {
        var bounds = new google.maps.LatLngBounds();
        for (i = 0; i < gmarkers1.length; i++) {
            marker = gmarkers1[i];
    
            // If is same category or category not picked
            if(marker.category == category || category.length == 0)
            {
                marker.setVisible(true);
                bounds.extend(marker.getPosition());
            }
            // Categories don't match 
            else
            {          
                marker.setVisible(false);
            }
            map.fitBounds(bounds);
        }  
    }
    
    // Init map
    initialize();
    #map-canvas {
        width: 500px;
        height: 500px;
    }
    
    

提交回复
热议问题