2010-01-16 12 views
12

Tôi có một số MapView mà tôi đang hiển thị "bán kính hữu ích" (suy nghĩ độ chính xác của tọa độ). Sử dụng MapView 's' s metersToEquatorPixels, được thừa nhận chỉ cho khoảng cách xích đạo) không cho tôi một khoảng cách đủ chính xác (tính bằng pixel). Làm thế nào bạn sẽ tính toán này nếu bạn muốn hiển thị một vòng tròn xung quanh tọa độ của bạn, bán kính nhất định?Cách tính bán kính xung quanh một điểm trong MapView của Android?

+2

Điều này cũng có thể, có thể, được tuyên bố là: Tôi có tọa độ GPS và khoảng cách, làm thế nào tôi có thể vẽ một vòng tròn bao quanh bán kính từ điểm GPS? –

+0

Tôi không chắc mình có hiểu vấn đề không - ý của bạn là gì khi bạn nói rằng nó không cho bạn khoảng cách đủ chính xác? Điều đó có nghĩa là nó nói 100m nhưng nó chỉ cho thấy một vòng tròn ở 50m hoặc cái gì đó? –

+0

Có. Nó giảm đi một lượng đáng kể. –

Trả lời

28

Vì vậy, Google Maps sử dụng Mercator projection. Điều này có nghĩa là bạn càng nhận được thêm từ đường xích đạo thì khoảng cách càng trở nên méo mó. Theo this discussion, cách thích hợp để chuyển đổi cho khoảng cách là một cái gì đó như:

public static int metersToRadius(float meters, MapView map, double latitude) { 
    return (int) (map.getProjection().metersToEquatorPixels(meters) * (1/ Math.cos(Math.toRadians(latitude))));   
} 
+0

Cảm ơn bạn đã trả lời. Nhưng tôi đã có một truy vấn về phương trình này. Phương trình này có đủ nặng để làm chậm hiệu suất của một ứng dụng không? Chỉ tò mò thôi. – Ahmed

+2

Phần có thể tốn thời gian duy nhất của công thức là Math.cos(). Bạn có thể sử dụng hàm android.util.FloatMath.cos() để tăng tốc mọi thứ, hoặc thậm chí giữ một bảng các yếu tố precomputed, ví dụ: cho mọi mức độ đầy đủ. Sau đó, bạn chỉ có thể nói trả về (int) (map.getProjection(). MétToEquatorPixels (mét) * yếu tố [(int) vĩ độ] – Ridcully

-1
projection.toPixels(GeoP, pt); 
float radius = projection.metersToEquatorPixels(50); 

Hãy thử điều này và xem ... tôi sử dụng nó trên MapRadius của tôi và nó dường như được làm việc

+0

Nếu bạn thấy câu trả lời của tôi, bạn sẽ thấy chính xác lý do tại sao điều này sẽ không hoạt động trong mọi trường hợp –

0
mMap.addCircle(
    new CircleOptions().center(
     new LatLng(
      bounds.getCenter().latitude, 
      bounds.getCenter().longitude 
     ) 
    ) 
    .radius(50000) 
    .strokeWidth(0f) 
    .fillColor(0x550000FF) 
); 
+2

Câu trả lời yêu cầu định dạng và thêm một chút ngữ cảnh về cách mã của bạn hoạt động và cách nó giải quyết vấn đề của OP! – abhiarora