2013-03-12 82 views
5

我有如下所示它由經緯度對象的ArrayList:比較兩個在谷歌地圖V2 LatLng對象機器人

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

注:經緯度是具有在雙格式即緯度和經度值的對象,緯度是在雙格式和經度是在雙格式

的下面是它們被存儲在上述latLngList對象中的值:

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)] 

現在,由於我在android中處理谷歌地圖v2,每當我點擊一個特定的標記時,我都會獲得經緯度位置,我嘗試將它與latLngList對象進行比較,以查找對象是否存在在latLngList

我這樣做以下列方式:

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

標記位置返回我有以下的latLng對象:

lat/lng: (34.074226888265116,-118.39924816042185) 

顯然,緯度和經度對象通過返回標記有點冗長,因此比較失敗。

有沒有更好的比較latLng對象的方法?

回答

1

我認爲最好的方法是使用靜態的Location方法來計算你的座標點和標記點之間的距離。 你可以用米來處理返回的距離,並決定是否大致是相同的點。

+0

成千上萬的點可能需要很長的時間 – 2014-03-14 14:40:49

+0

您可以通過距離標記位置的距離來訂購ArrayList。只是實現Comparable接口,所以ArrayList的第一項是最接近的一個。 – jgonza73 2014-03-25 12:14:48

+0

什麼?每次點擊不同的標記時,您都需要對它們重新排序,因此性能將變得更糟 - 從O(n)到O(n * log(n)) – 2014-03-25 12:24:00

5

更好的方法是不要比較基於LatLng的標記,而是根據Marker的標識。由於一些奇怪的原因Marker.getPosition()不會返回完全相同的值。

如果你想給每個Marker添加一些額外的信息,我建議在ListMap中存儲所有標記。

或者,您可以在創建Marker後使用Marker.getId(),將其存儲並稍後與onMarkerClick比較。

編輯:

我也報這個上gmaps-api-issues

+0

HashMap 也可以做這個工作 – 2014-03-14 15:09:54

+0

Cool one dude ........ androidcross.com – 2015-03-06 13:46:15

0

我想澄清一下Maciej的回答,因爲問題標題講述了比較LatLng對象。對象本身是完全可以等同的 - 它們的equalshashCode語義是正確的。 (and the docs say this, too)這只是Marker錯誤,表明Marker的位置不準確。
因此,如果您確實想要跟蹤精確的Marker職位,則可以將所有添加的標記存儲在HashMap<Marker, LatLng>中。但是如果你只想比較兩個標記,就不要使用它們的位置,正如MaciejGórski所說,簡單的Marker.getId()就可以完成這項工作。

0

您有2個選項我能想到的,一種是採用四叉樹庫:http://koti.mbnet.fi/ojalesa/quadtree/quadtree_intro.htm這是易於使用和有益的版本,另一種是通過@geocodezip(在JavaScript)

var SameThreshold = 0.1; 
if (google.maps.geometry.spherical.computeDistanceBetween(latlng1,latlng2) < SameThreshold) 
marker1.setAnimation(google.maps.Animation.BOUNCE); 
2
一個很好的答案

實現這樣的latlngs。這對我有效。

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 
}