Google Maps Api 3 Usuń Tylko Zaznaczony Znacznik

Mam 2 funkcje jak poniżej:

function addMarker() {
    marker = new google.maps.Marker({
        position: Gpoint,
        map: map,
        draggable: true,
        animation: google.maps.Animation.DROP
    });
    map.panTo(Gpoint);

    google.maps.event.addListener(marker, "rightclick", 
    function (point) { 
    showContextMarker(point.latLng); } ); 
    $('.contextmenu').remove();
};

function delMarker() { marker.setMap(null); $('.contextmenu').remove(); };

Tak więc, jak mogę zrozumieć, mam menu kontekstowe z opcją "Usuń znacznik". Wiążę słuchacza "rightclick" podczas dodawania znacznika, aby wyświetlić to menu.

Wszystko działa bez problemu do tej chwili.

Ale kiedy próbuję kliknąć na znacznik, aby usunąć; powoduje to tylko ostatni dodany znacznik. Kiedy próbuję jeszcze raz, nic się nie dzieje.

Więc moim pomysłem jest uzyskanie identyfikatora klikniętego znacznika (lub coś, co może być przydatne) i uruchomić tę funkcję usuwania zgodnie z tym.

Krótko; chcę usunąć znacznik, który kliknąłem, z mapy zawierającej wiele znaczników.

Czy masz jakieś podejście do rozwiązania tego problemu ? Z góry dzięki!

Rozwiązany!

Oto rozwiązanie. Dziękuję Fatih. to było niemożliwe bez twoich wskazówek:
var id;
var markers = {};
var addMarker = function () {
    marker = new google.maps.Marker({ 
        position: Gpoint,
        map: map,
        draggable: true,
        animation: google.maps.Animation.DROP
    });
    map.panTo(Gpoint);
    id = marker.__gm_id
    markers[id] = marker; 

    google.maps.event.addListener(marker, "rightclick", function (point) { id = this.__gm_id; delMarker(id) });
}

var delMarker = function (id) {
    marker = markers[id]; 
    marker.setMap(null);
}

Wywołanie funkcji delete przez: delMarker(id) Ps: "wystarczy kliknąć prawym przyciskiem myszy na tym case "

Dziękuję!
Author: Community, 2011-12-15

6 answers

Próbka robocza na jsFiddle


Google Maps nie zarządza Twoimi znacznikami. Więc wszystkie markery powinny być zarządzane przez siebie.

Stwórz globalny obiekt znacznika i przesuń wszystkie znaczniki do tego obiektu. I nadaj unikalne id każdemu znacznikowi, gdy otrzymujesz instancję znacznika. Następnie, gdy chcesz usunąć znacznik, weź jego id i znajdź ten znacznik w obiekcie global marker i na koniec wywołaj metodę setMap tej instancji znacznika z przekazaniem argumentu null.

Również mam dodano demo, które działa na jsFiddle. Kod jest mocno udokumentowany.

Twój kod psuedo powinien być taki. aby uzyskać bardziej szczegółowy kod, zajrzyj do demo.

var currentId = 0;
var uniqueId = function() {
    return ++currentId;
}

var markers = {};
var createMarker = function() {
    var id = uniqueId(); // get new id
    var marker = new google.maps.Marker({ // create a marker and set id
        id: id,
        position: Gpoint,
        map: map,
        draggable: true,
        animation: google.maps.Animation.DROP
    });
    markers[id] = marker; // cache created marker to markers object with id as its key
    return marker;
}
var deleteMarker = function(id) {
    var marker = markers[id]; // find the marker by given id
    marker.setMap(null);
}
 45
Author: Fatih Acet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-15 16:48:34

Uzupełniając odpowiedź @ Fatih powinieneś zarządzać markerami. Na przykład można dodać każdy znacznik w tablicy, a następnie usunąć, można znaleźć ten znacznik w tablicy i ustawić val w mapie null.

 2
Author: Jorge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-15 14:55:07

Po prostu podaj swój znacznik w funkcji rightclick. Na przykład:

var marker = new google.maps.Marker({
    position: event.latLng,
    map: map,
    draggable: true,
    title: 'Hello World!'
});
google.maps.event.addListener(marker, "rightclick", function (point) {delMarker(marker)});

I spraw, aby funkcja wyglądała tak:

var delMarker = function (markerPar) {
    markerPar.setMap(null);
}

Twoje znaczniki będą usuwalne po prawej kliknięciach.

 2
Author: Vinícius Biavatti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-01 15:09:25

To mi pomogło:

A second currentId, if you have a better idea, let me know

var actualMarkerId = 0;
var currentId = 0;



    if (actualMarkerId>0) {
        deleteMarker(actualMarkerId);
        console.log(actualMarkerId);
    }
    var id = uniqueId(); // get new id
    actualMarkerId = id;
 1
Author: Brian Sanchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-15 14:57:00

Dla minimalnych zmian

var newid=0;

for (var index in results){

var marker = new google.maps.Marker({

map: map,
icon: image,

__gm_id: = newid+1,

});
}

Teraz znacznik ['__gm _ id'] nadal ma wartość

 0
Author: user1426141,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-23 15:34:45

Proste, użyj globalnej tablicy dla obiektów znaczników. Przesuń obiekt markera w tablicy na markerze kreślenia. Tak, możemy użyć Id w obiekcie Marker dla unikalnego odniesienia.

Kod Jak Poniżej

MarkerArray = []

marker = new google.maps.Marker({
         Id: 1,
         position: new google.maps.LatLng(Lat,Long),
         type: 'info'         
          });

MarkerArray.push(marker);

Aby usunąć dany znacznik, Znajdź Indeks tego elementu używając unikalnego Id dla każdego znacznika.

var MarkerIndex = MarkerArray.findIndex(function GetIndex(element) {
            return element.Id == 1;
});    
MarkerArray[MarkerIndex].setMap(null);
MarkerArray.splice(MarkerIndex, 1); // to remove element from global array
 0
Author: Vigneh Sundar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-04 09:56:11