2015-03-24 14 views
11

Có cách nào có thể tìm thấy bán kính của bản đồ nhìn thấy được từ điểm giữa không?Nhận Bán kính Bản đồ Có thể nhìn thấy trong Android

Google Map

Tôi muốn nhận được những nơi gần với điểm trung tâm của bản đồ từ một API, và rằng API yêu cầu lat, lng và bán kính. Tôi có thể nhận được lat và lng từ điểm trung tâm nhưng không thể tìm được cách để lấy bán kính.

nhờ

Trả lời

14

Đối với các API của Google Maps dành cho Android, bạn có thể nhận được giới hạn bởi ...

Từ tài liệu tham khảo bản đồ, có Projection bởi getProjection(). Và,

phép chiếu được sử dụng để dịch giữa vào vị trí màn hình và tọa độ địa lý ..

Vì vậy, từ chiếu, chúng ta có thể sử dụng getVisibleRegion(), và để có được VisibleRegion của bản đồ, mà chứa một số LatLngBounds, là một lớp có chứa 2 LatLng biến, một cho góc Đông Bắc của giới hạn và một cho góc Tây Nam.

Vì vậy, các mã nên giống như thế này:

 googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
      @Override 
      public void onCameraChange(CameraPosition position) { 
       LatLngBounds bounds = googleMap.getProjection().getVisibleRegion().latLngBounds; 
       LatLng northeast = bounds.northeast; 
       LatLng southwest = bounds.southwest; 

       Context context = getApplicationContext(); 
       CharSequence text = "ne:"+northeast+" sw:"+southwest; 
       int duration = Toast.LENGTH_SHORT; 

       Toast toast = Toast.makeText(context, text, duration); 
       toast.show(); 
      } 
     }); 

= - = - = - = - = - = chỉnh sửa:

Có thể là tôi đã quá ngây thơ, đưa ra chỉ NE và SW có thể giải quyết vấn đề này, nhưng chỉ trong trường hợp đặc biệt mà người dùng không xoay bản đồ hoặc nghiêng lên bản đồ 3D.

Vì vậy, thay vào đó, bạn chỉ có thể lấy VisibleRegion, cung cấp 4 biến, farRight, farLeft, nearRight, nearLeft, mỗi đại diện cho 4 conners của khu vực.

Sau đó chúng ta có thể tính toán chiều rộng và chiều cao của khu vực này cho rằng 4 điểm và chọn một trong nhỏ hơn (tốt, đôi khi chiều rộng có thể lớn hơn chiều cao tôi đoán.)

Và đối với việc tính toán, chúng tôi chỉ có thể sử dụng chức năng Location.distanceBetween(x1,y1,x2,y2,result) ...

mà làm cho mã trông giống như sau:

   VisibleRegion visibleRegion = googleMap.getProjection().getVisibleRegion(); 

       LatLng farRight = visibleRegion.farRight; 
       LatLng farLeft = visibleRegion.farLeft; 
       LatLng nearRight = visibleRegion.nearRight; 
       LatLng nearLeft = visibleRegion.nearLeft; 

       float[] distanceWidth = new float[2]; 
       Location.distanceBetween(
         (farRight.latitude+nearRight.latitude)/2, 
         (farRight.longitude+nearRight.longitude)/2, 
         (farLeft.latitude+nearLeft.latitude)/2, 
         (farLeft.longitude+nearLeft.longitude)/2, 
         distanceWidth 
         ); 


       float[] distanceHeight = new float[2]; 
       Location.distanceBetween(
         (farRight.latitude+nearRight.latitude)/2, 
         (farRight.longitude+nearRight.longitude)/2, 
         (farLeft.latitude+nearLeft.latitude)/2, 
         (farLeft.longitude+nearLeft.longitude)/2, 
         distanceHeight 
       ); 

       float distance; 

       if (distanceWidth[0]>distanceHeight[0]){ 
        distance = distanceWidth[0]; 
       } else { 
        distance = distanceHeight[0]; 
       } 
+0

cảm ơn câu trả lời của bạn, thực sự đánh giá cao !! :) – awaistoor

+1

Tôi sẽ nói phần còn lại chỉ là một vấn đề toán học, nhưng tôi đoán tôi đã quá ngây thơ. bằng cách này, khoảng cách tính bằng mét. – kaho

+0

người bạn đời tuyệt vời! cảm ơn một lần nữa – awaistoor

0

chỉnh sửa: Câu trả lời sau đây là dành cho JavaScript của Google Maps API v3
= - = - = - = - = - = - =

Tôi nghĩ rằng câu trả lời sẽ là: Có, bạn có thể.

Theo documentation, bạn có thể tính toán khoảng cách giữa 2 điểm bằng cách: computeDistanceBetween(LatLngFrom, LatLngTo)

Ngoài ra bạn có thể nhận được ranh giới của bản đồ bằng cách sử dụng phương pháp getBounds(), mà là trong google.maps.Map class.

+0

nhờ trả lời nhưng không phải là những phương pháp này và các liên kết này đề cập đến v3? hiện chỉ có sẵn cho javascript? – awaistoor

4

cảm ơn bạn rất nhiều vì câu trả lời của bạn @kaho, nó đã giúp tôi rất nhiều (thậm chí bạn tính toán distanceWidth và distanceHeight trong cùng một cách).

Tuy nhiên, tôi chỉ muốn làm rõ và cải thiện một chút. (Hãy thư giãn, nó có thể dễ dàng gây rối bạn: 3).

Bởi vì:

  • farLeft đối tượng LatLng định nghĩa xa bên trái góc của máy ảnh.

  • farRight LatLng đối tượng định nghĩa góc bên phải của máy ảnh.

  • nearLeft Đối tượng Latinh xác định góc dưới cùng bên trái của máy ảnh.

  • nearRight đối tượng LatLng định nghĩa góc dưới bên phải của máy ảnh.

Có một số lĩnh vực VisibleRegion chứa các giá trị như nhau:

  • farLeft.longitude == nearLeft.longitude
  • farRight.longitude == nearRight.longitude
  • farLeft.latitude == farRight.latitude
  • nearLeft.latitude == nearRight.latitude

Vì vậy, chúng ta có thể giảm bớt một số tính toán:

private double calculateVisibleRadius(VisibleRegion visibleRegion) { 
     float[] distanceWidth = new float[1]; 
     float[] distanceHeight = new float[1]; 

     LatLng farRight = visibleRegion.farRight; 
     LatLng farLeft = visibleRegion.farLeft; 
     LatLng nearRight = visibleRegion.nearRight; 
     LatLng nearLeft = visibleRegion.nearLeft; 

     //calculate the distance width (left <-> right of map on screen) 
     Location.distanceBetween(
       (farLeft.latitude + nearLeft.latitude)/2, 
       farLeft.longitude, 
       (farRight.latitude + nearRight.latitude)/2, 
       farRight.longitude, 
       distanceWidth 
     ); 

     //calculate the distance height (top <-> bottom of map on screen) 
     Location.distanceBetween(
       farRight.latitude, 
       (farRight.longitude + farLeft.longitude)/2, 
       nearRight.latitude, 
       (nearRight.longitude + nearLeft.longitude)/2, 
       distanceHeight 
     ); 

     //visible radius is (smaller distance)/2: 
     return (distanceWidth[0] < distanceHeight[0]) ? distanceWidth[0]/2 : distanceHeight[0]/2; 
    } 

Sau đó:

VisibleRegion visibleRegion = googleMap.getProjection().getVisibleRegion(); 
double visibleRadius = calculateVisibleRadius(visibleRegion); 

enter image description here

+0

số điện thoại là gì? radian?Tôi nhận được một số con số thực sự lớn ở đây, có vẻ như mét – franklinexpress

+0

yep, giá trị của ** visibleRadius ** là theo mét –

+0

Đúng vậy, cảm ơn người đàn ông – franklinexpress

Các vấn đề liên quan