Dodawanie identyfikatorów do znaczników mapy google

82

Mam skrypt, który zapętla się i dodaje po jednym znacznikach.

Próbuję sprawić, aby obecny znacznik miał okno informacyjne i miał tylko 5 znaczników na mapie naraz (4 bez okien informacyjnych i 1 z)

Jak dodać identyfikator do każdego znacznika, aby w razie potrzeby móc usuwać i zamykać okna informacyjne.

Oto funkcja, której używam do ustawiania znacznika:

function codeAddress(address, contentString) {

var infowindow = new google.maps.InfoWindow({
  content: contentString
});

if (geocoder) {

  geocoder.geocode( { 'address': address}, function(results, status) {

    if (status == google.maps.GeocoderStatus.OK) {

        map.setCenter(results[0].geometry.location);

       var marker = new google.maps.Marker({
          map: map, 
          position: results[0].geometry.location
       });

       infowindow.open(map,marker);

      } else {
       alert("Geocode was not successful for the following reason: " + status);
      }
    });
  }

}

Nacięcie
źródło

Odpowiedzi:

193

JavaScript to język dynamiczny. Możesz po prostu dodać go do samego obiektu.

var marker = new google.maps.Marker(markerOptions);
marker.metadata = {type: "point", id: 1};

Ponadto, ponieważ wszystkie obiekty v3 rozszerzają się MVCObject(). Możesz użyć:

marker.setValues({type: "point", id: 1});
// or
marker.set("type", "point");
marker.set("id", 1);
var val = marker.get("id");
CrazyEnigma
źródło
11
Jestem ciekawy, jak po nadaniu identyfikatorów znaczników, w jaki sposób można uzyskać dostęp do tych znaczników poza kanwą mapy. $ ('# 1'). DoSomething (); na przykład?
willdanceforfun
@willdanceforfun Dodaj zdarzenie kliknięcia do znacznika i uzyskaj informacje na temat this:google.maps.event.addListener(yourMarker, 'click', function (event) { console.log(this); });
Mayeenul Islam
15

Po prostu dodam kolejne rozwiązanie, które mi pasuje .. Możesz po prostu dodać je w opcjach znacznika:

var marker = new google.maps.Marker({
    map: map, 
    position: position,

    // Custom Attributes / Data / Key-Values
    store_id: id,
    store_address: address,
    store_type: type
});

A następnie odzyskaj je za pomocą:

marker.get('store_id');
marker.get('store_address');
marker.get('store_type');
zen.c
źródło
Pomogło to wielu. Żaden z przykładów nie miał tego. Dobre do przekazywania wartości do wykorzystania za pomocą funkcji zwracania kliknięć.
cngodles
2

Mam prostą Locationklasę, której używam do obsługi wszystkich moich rzeczy związanych ze znacznikami. Wkleję mój kod poniżej, abyś mógł rzucić okiem.

Ostatnia linia jest tym, co faktycznie tworzy obiekty znaczników. Przechodzi przez niektóre JSON moich lokalizacji, które wyglądają mniej więcej tak:

{"locationID":"98","name":"Bergqvist Järn","note":null,"type":"retail","address":"Smidesvägen 3","zipcode":"69633","city":"Askersund","country":"Sverige","phone":"0583-120 35","fax":null,"email":null,"url":"www.bergqvist-jb.com","lat":"58.891079","lng":"14.917371","contact":null,"rating":"0","distance":"45.666885421019"}

Oto kod:

Jeśli spojrzysz na target()metodę w mojej klasie Location, zobaczysz, że zachowuję odwołania do okien infowindow i mogę po prostu open()i close()je z powodu odniesienia.

Zobacz demo na żywo: http://ww1.arbesko.com/en/locator/ (wpisz nazwę szwedzkiego miasta, takiego jak sztokholm, i naciśnij enter)

var Location = function() {
    var self = this,
        args = arguments;

    self.init.apply(self, args);
};

Location.prototype = {
    init: function(location, map) {
        var self = this;

        for (f in location) { self[f] = location[f]; }

        self.map = map;
        self.id = self.locationID;

        var ratings = ['bronze', 'silver', 'gold'],
            random = Math.floor(3*Math.random());

        self.rating_class = 'blue';

        // this is the marker point
        self.point = new google.maps.LatLng(parseFloat(self.lat), parseFloat(self.lng));
        locator.bounds.extend(self.point);

        // Create the marker for placement on the map
        self.marker = new google.maps.Marker({
            position: self.point,
            title: self.name,
            icon: new google.maps.MarkerImage('/wp-content/themes/arbesko/img/locator/'+self.rating_class+'SmallMarker.png'),
            shadow: new google.maps.MarkerImage(
                                        '/wp-content/themes/arbesko/img/locator/smallMarkerShadow.png',
                                        new google.maps.Size(52, 18),
                                        new google.maps.Point(0, 0),
                                        new google.maps.Point(19, 14)
                                    )
        });

        google.maps.event.addListener(self.marker, 'click', function() {
            self.target('map');
        });

        google.maps.event.addListener(self.marker, 'mouseover', function() {
            self.sidebarItem().mouseover();
        });

        google.maps.event.addListener(self.marker, 'mouseout', function() {
            self.sidebarItem().mouseout();
        });

        var infocontent = Array(
            '<div class="locationInfo">',
                '<span class="locName br">'+self.name+'</span>',
                '<span class="locAddress br">',
                    self.address+'<br/>'+self.zipcode+' '+self.city+' '+self.country,
                '</span>',
                '<span class="locContact br">'
        );

        if (self.phone) {
            infocontent.push('<span class="item br locPhone">'+self.phone+'</span>');
        }

        if (self.url) {
            infocontent.push('<span class="item br locURL"><a href="http://'+self.url+'">'+self.url+'</a></span>');
        }

        if (self.email) {
            infocontent.push('<span class="item br locEmail"><a href="mailto:'+self.email+'">Email</a></span>');
        }

        // Add in the lat/long
        infocontent.push('</span>');

        infocontent.push('<span class="item br locPosition"><strong>Lat:</strong> '+self.lat+'<br/><strong>Lng:</strong> '+self.lng+'</span>');

        // Create the infowindow for placement on the map, when a marker is clicked
        self.infowindow = new google.maps.InfoWindow({
            content: infocontent.join(""),
            position: self.point,
            pixelOffset: new google.maps.Size(0, -15) // Offset the infowindow by 15px to the top
        });

    },

    // Append the marker to the map
    addToMap: function() {
        var self = this;

        self.marker.setMap(self.map);
    },

    // Creates a sidebar module for the item, connected to the marker, etc..
    sidebarItem: function() {
        var self = this;

        if (self.sidebar) {
            return self.sidebar;
        }

        var li = $('<li/>').attr({ 'class': 'location', 'id': 'location-'+self.id }),
            name = $('<span/>').attr('class', 'locationName').html(self.name).appendTo(li),
            address = $('<span/>').attr('class', 'locationAddress').html(self.address+' <br/> '+self.zipcode+' '+self.city+' '+self.country).appendTo(li);

        li.addClass(self.rating_class);

        li.bind('click', function(event) {
            self.target();
        });

        self.sidebar = li;

        return li;
    },

    // This will "target" the store. Center the map and zoom on it, as well as 
    target: function(type) {
        var self = this;

        if (locator.targeted) {
            locator.targeted.infowindow.close();
        }

        locator.targeted = this;

        if (type != 'map') {
            self.map.panTo(self.point);
            self.map.setZoom(14);
        };

        // Open the infowinfow
        self.infowindow.open(self.map);
    }
};

for (var i=0; i < locations.length; i++) {
    var location = new Location(locations[i], self.map);
    self.locations.push(location);

    // Add the sidebar item
    self.location_ul.append(location.sidebarItem());

    // Add the map!
    location.addToMap();
};
sałatka wielorybnicza
źródło
To nie odpowiada na pytanie. W ogóle.
MrUpsidown
1

Dlaczego nie użyć pamięci podręcznej, która przechowuje każdy obiekt znacznika i odwołuje się do identyfikatora?

var markerCache= {};
var idGen= 0;

function codeAddress(addr, contentStr){
    // create marker
    // store
    markerCache[idGen++]= marker;
}

Edycja: oczywiście opiera się na systemie indeksów numerycznych, który nie oferuje właściwości długości, takiej jak tablica. Możesz oczywiście wykonać prototyp obiektu Object i utworzyć długość itp. Dla czegoś takiego. OTOH, generowanie unikalnej wartości identyfikatora (MD5 itp.) Dla każdego adresu może być drogą do zrobienia.

bdl
źródło
-2

Marker ma już unikalny identyfikator

marker.__gm_id
bfg9k
źródło
Jedyne rozwiązanie, z którego bym skorzystał.
clime
2
Podwójne podkreślenie i gmprzedrostek powinny wskazywać, że jest to zmienna prywatna, która nie daje gwarancji. Unikaj tego.
LeeGee