2013-03-12 15 views
5

Ich habe eine Arraylist, das aus LatLong Objekt besteht, wie unten gezeigt:Vergleich zweier LatLng Objekte in Karte v2 android

ArrayList <LatLng> latLngList = new ArrayList<LatLng>(); 

Anmerkung: LatLng ein Objekt ist, die Werte geografische Breite und Länge im Doppelformat dh hat, die Breite wird in doppeltem Format und Länge ist im Doppelformat

die folgenden sind die Werte, die in dem obigen gespeichert sind latLngList Objekt:

Lat Long List:[lat/lng: (34.072516,-118.403609), lat/lng: (34.074227,-118.399248), lat/lng: (34.07304,-118.3995), lat/lng: (34.07304,-118.3995), lat/lng: (34.07304,-118.3995), lat/lng: (34.067856,-118.401485)] 

Jetzt, da ich mit google map v2 in Android zu tun habe, wenn ich auf einem bestimmten Marker klicken i die Breiten- und Längenposition erhalten und ich versuche, es zu vergleichen mit dem latLngList Objekt zu finden, ob das Objekt vorhanden ist in der latLngList.

ich es in der folgenden Art und Weise tue:

for(LatLng latLng : latLngList) { 
     marker.getPosition().equals(latLng); **Always returns false** 
} 

Die Markerposition mich mit folgendem latLng Objekt zurückkehrt:

lat/lng: (34.074226888265116,-118.39924816042185) 

Es ist klar, dass das Breiten- und Längen Objekt zurückgegeben durch Marker ist ein bisschen lang und daher schlägt der Vergleich fehl.

Gibt es eine bessere Möglichkeit, das latLng-Objekt zu vergleichen?

Antwort

1

Ich denke, dass der beste Weg ist, den Abstand zwischen Ihrem linken Punkt und Markern Punkten zu berechnen, mit der statischen Location Methode. Sie können die zurückgegebene Entfernung in Metern berechnen und entscheiden, ob es sich um denselben Punkt handelt.

+0

mit Tausenden von Punkten kann es sehr lange dauern –

+0

Sie können Ihre ArrayList nach Entfernung von Marker Position bestellen. Implementiert einfach Vergleichbares Interface, also ist das erste Element von ArrayList das nächste. – jgonza73

+0

was? Sie müssen sie jedes Mal neu anordnen, wenn Sie auf verschiedene Marker klicken, so dass die Performance nur noch schlechter wird - von O (n) bis O (n * log (n)) –

5

Ein besserer Weg besteht nicht darin, Marker basierend auf LatLng zu vergleichen, sondern auf der Identität von Marker. Aus irgendeinem seltsamen Grund gibt Marker.getPosition() nicht genau den gleichen Wert zurück.

Ich würde vorschlagen, dass alle Marker in einem List oder Map zu speichern, wenn Sie einige zusätzliche Informationen zu jedem Marker anhängen möchten.

Alternativ können Sie auch Marker.getId() verwenden, nachdem Sie Marker erstellt, gespeichert und später in onMarkerClick verglichen haben.

Edit:

Ich habe auch dies auf gmaps-api-issues berichtet.

+0

HashMap macht auch den Job –

+0

Cool ein Typ ........ androidcross.com –

0

Ich möchte Maciej's Antwort ein wenig klären, weil der Fragetitel über den Vergleich LatLng Objekte erzählt. LatLng Objekte sind für sich selbst vollkommen gleichberechtigt - ihre equals und hashCode Semantik ist korrekt. (and the docs say this, too) Es ist nur der Marker Bug, dass die Marker ihre Positionen nicht genau speichern.
Wenn Sie in der Tat präzise Marker Positionen verfolgen möchten, können Sie einfach alle hinzugefügten Markierungen in einem HashMap<Marker, LatLng> speichern.Aber wenn Sie nur zwei Marker vergleichen möchten, verwenden Sie ihre Positionen überhaupt nicht, ein einfacher Marker.getId() wird die Arbeit tun, wie MaciejGórski sagte.

0

Sie haben 2 Möglichkeiten ich denken kann, man die Quadtree-Bibliothek verwendet: http://koti.mbnet.fi/ojalesa/quadtree/quadtree_intro.htm, die einfach zu bedienen und ver hilfreich ist, das andere eine sehr gute Antwort von @geocodezip ist (in Javascript)

var SameThreshold = 0.1; 
if (google.maps.geometry.spherical.computeDistanceBetween(latlng1,latlng2) < SameThreshold) 
marker1.setAnimation(google.maps.Animation.BOUNCE); 
2

Implementieren Sie lablngs wie folgt. Das hat für mich funktioniert.

final LatLng[] latLngs = new LatLng[2]; 
latLngs[0] = new LatLng(lat, lng); 
latLngs[1] = new LatLng(lat, lng); 

if(latLngs1[0].equals(latLngs1[1])) { 
//to do 
}              
Verwandte Themen