2013-03-12 27 views
5

Tôi có một ArrayList trong đó bao gồm đối tượng LatLong như hình dưới đây:So sánh hai đối tượng LatLng trong google bản đồ v2 android

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

Lưu ý: LatLng là một đối tượng trong đó có giá trị vĩ độ và kinh độ ở định dạng kép tức là, Latitude là ở định dạng đôi và Longitude là ở định dạng kép

dưới đây là những giá trị được lưu trữ trong đối tượng latLngList trên:

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

Bây giờ, vì tôi đang xử lý bản đồ google v2 trong android, bất cứ khi nào tôi nhấp vào một điểm đánh dấu cụ thể, tôi có được vị trí vĩ độ và kinh độ và tôi cố gắng so sánh nó với đối tượng là latLngList. trong số latLngList.

tôi đang làm nó theo cách sau:

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

Vị trí marker đang trở lại tôi với các đối tượng LatLng sau:

lat/lng: (34.074226888265116,-118.39924816042185) 

Rõ ràng là các vĩ độ và kinh độ đối tượng được trả về bởi điểm đánh dấu hơi dài và do đó so sánh không thành công.

Có cách nào tốt hơn để so sánh đối tượng latLng không?

Trả lời

1

Tôi nghĩ rằng cách tốt nhất là tính khoảng cách giữa điểm điểm và điểm đánh dấu của bạn, sử dụng phương pháp tĩnh Location. Bạn có thể đối phó với khoảng cách được trả về tính bằng mét và quyết định xem có phải cùng một điểm hay không.

+0

với hàng nghìn điểm có thể mất thời gian rất dài –

+0

Bạn có thể đặt ArrayList theo khoảng cách từ Vị trí điểm đánh dấu. Chỉ cần thực hiện giao diện Comparable, vì vậy mục đầu tiên của ArrayList là cái gần nhất. – jgonza73

+0

cái gì? bạn sẽ cần phải sắp xếp lại chúng mỗi khi nhấp vào các điểm đánh dấu khác nhau, vì vậy hiệu suất sẽ chỉ tồi tệ hơn - từ O (n) đến O (n * log (n)) –

5

Cách tốt hơn là không so sánh điểm đánh dấu dựa trên LatLng, nhưng trên danh tính của Marker. Đối với một số lý do kỳ lạ Marker.getPosition() không trả lại chính xác cùng một giá trị.

Tôi khuyên bạn nên lưu trữ tất cả các điểm đánh dấu trong một số List hoặc Map nếu bạn muốn đính kèm một số thông tin bổ sung cho mỗi Marker.

Hoặc bạn có thể sử dụng Marker.getId() sau khi tạo Marker, lưu trữ và sau đó so sánh số đó trong onMarkerClick.

Edit:

Tôi cũng đã thông báo này trên gmaps-api-issues.

+0

HashMap cũng thực hiện công việc –

+0

Cool one dude ........ androidcross.com –

0

Tôi muốn làm rõ câu trả lời của Maciej một chút, vì tiêu đề câu hỏi cho biết về việc so sánh các đối tượng LatLng. LatLng Các đối tượng, một mình, hoàn toàn tương đương - các câu hỏi equalshashCode ngữ nghĩa của chúng là chính xác. (and the docs say this, too) Nó chỉ là lỗi Marker rằng các vị trí của Marker lưu trữ vị trí của chúng không chính xác.
Vì vậy, nếu bạn thực sự muốn theo dõi các vị trí chính xác Marker, bạn có thể chỉ cần lưu trữ tất cả các điểm đánh dấu đã thêm vào trong một HashMap<Marker, LatLng>.Nhưng nếu bạn chỉ muốn so sánh hai điểm đánh dấu, không sử dụng vị trí của chúng ở tất cả, một đơn giản Marker.getId() sẽ thực hiện công việc, như MaciejGórski nói.

0

Bạn có 2 lựa chọn tôi có thể nghĩ ra, ai được sử dụng thư viện quadtree: http://koti.mbnet.fi/ojalesa/quadtree/quadtree_intro.htm đó là dễ sử dụng và ver hữu ích, người kia là một câu trả lời rất tốt bởi @geocodezip (trong javascript)

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

Thực hiện các cụm từ như thế này. điều này làm việc cho tôi.

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 
}              
Các vấn đề liên quan