Assign ID to marker in leaflet

后端 未结 7 1031
忘了有多久
忘了有多久 2020-12-23 11:47

So i try to achieve a result as on foursquare: https://foursquare.com/explore?cat=drinks&mode=url&near=Paris which is when you clik on a marker on the map, it scrol

7条回答
  •  囚心锁ツ
    2020-12-23 12:25

    I've been looking for a nice way to do this and as far as I can tell there is still no built-in way (using leaflet) to give a marker an ID. I know I'm a bit late to answering this but hopefully it will help others who stumble upon this question. As far as I can tell there are two main issues here:

    Problem #1: Unless you save your markers to an object or map, described below, there is no easy programmatic way of accessing them later on. For example - A user clicks something OUTSIDE the map that corresponds to a marker INSIDE the map.

    Problem #2: When a user clicks on a marker INSIDE the map, there is no built in way to retrieve the ID of that marker and then use it to highlight a corresponding element or trigger an action OUTSIDE the map.

    Solutions

    Using a one or more of these options will help address the issues described above. I'll start with the one mentioned in the previous answer. Here is the working pen, which holds all the code found below.

    Option #1: Save each marker, using a hardcoded or dynamic ID, inside an object -

    // Create or retrieve the data
    var data = [
        {
          name: 'Bob',
          latLng: [41.028, 28.975],
          id: '2342fc7'
        }, {...}, {...}
    ];
    
    // Add an object to save markers
    var markers = {};
    
    // Loop through the data
    for (var i = 0; i < data.length; i++) {
      var person = data[i];
    
      // Create and save a reference to each marker
      markers[person.id] = L.marker(person.latLng, {
        ...
      }).addTo(map);
    }
    

    Similar to the other answer you can now access a single marker by using -

    var marker = markers.2342fc7; // or markers['2342fc7']
    

    Option #2:

    While leaflet doesn't provide a built-in 'id' option for markers, you can add the an ID to the element directly by accessing ._icon property:

    // Create and save a reference to each marker
    markers[person.id] = L.marker(person.latLng, {...}).addTo(map);
    
    // Add the ID
    markers[person.id]._icon.id = person.id;
    

    Now when you handle click events, it's easy as pie to get that marker's ID:

    $('.leaflet-marker-icon').on('click', function(e) {
       // Use the event to find the clicked element
       var el = $(e.srcElement || e.target),
           id = el.attr('id');
    
        alert('Here is the markers ID: ' + id + '. Use it as you wish.')
    });
    

    Option #3:

    Another approach would be use the layerGroup interface. It provides a method, getLayer, that sounds like it would be perfect get our markers using an ID. However, at this time, Leaflet does not provide any way to specify a custom ID or name. This issue on Github discusses how this should be done. However you can get and save the auto-generated ID of any Marker (or iLayer for that matter) like so:

    var group = L.layerGroup()
    
    people.forEach(person => {
        // ... create marker
        group.addLayer( marker );
        person.marker_id = group.getLayerId(marker)
    })
    

    Now that we have every marker's ID saved with each backing object in our array of data we can easily get the marker later on like so:

    group.getLayer(person.marker_id)
    

    See this pen for a full example...

    Option #4:

    The cleanest way to do this, if you have the time, would be to extend the leaflet's marker class to handle your individual needs cleanly. You could either add an id to the options or insert custom HTML into the marker that has your id/class. See the documentation for more info on this.

    You can also you use the circleMarker which, in the path options, you will see has an option for className which can be nice for styling groups of similar markers.

    Styling:

    Almost forgot that your original question was posed for the purpose of styling... simply use the ID to access individual elements:

    .leaflet-marker-icon#2342fc7 { ... }
    

    Conclusion

    I'll also mention that layer and feature groups provide another great way to interface with markers. Here is a question that discusses this a bit. Feel free to tinker with, or fork either the first or second pen and comment if I've missed something.

提交回复
热议问题