2013-04-17 26 views
7

Có cách nào để nhận tọa độ của khu vực hiện tại được hiển thị trên thiết bị không?Android Google Maps: Cách nhận diện tích hiện được hiển thị trên thiết bị màn hình?

Bối cảnh là, chúng tôi muốn hiển thị các địa điểm "lân cận", được lưu trữ trong cơ sở dữ liệu của chính chúng tôi. Vì vậy, chúng ta hãy nói, người dùng nhìn vào đoạn sau của một bản đồ:

enter image description here

Làm thế nào để chúng ta có được kinh độ/vĩ độ của màn hình (hoặc điểm ở giữa màn hình và bán kính mà bao gồm mọi thứ?). Xin lưu ý, trung tâm của bản đồ thường không phải là vị trí hiện tại, vì người dùng có thể di chuyển trung tâm của thẻ!

+0

bạn đang sử dụng api nào? –

+0

Hỗ trợ API ít nhất là API 11, nhưng hỗ trợ API 8-10 sẽ là tốt đẹp – longilong

+0

tôi đang hỏi về phiên bản api bản đồ của bạn. là 1,2 hoặc3 –

Trả lời

20

Sử dụng map.getProjection().getVisibleRegion(). Từ VisibleRegion bạn có thể nhận được LatLngBounds, rất dễ làm việc. Bạn cũng có thể thử trực tiếp với khu vực, có thể là hình thang.

+0

vâng! Chính xác những gì tôi đang tìm kiếm! – longilong

7

Tôi tìm thấy giải pháp cho Google Map API v2 từ vài phản ứng:

stackoverflow#1stackoverflow#2

Vì vậy, cần thiết phải thực hiện Hoạt động từ GoogleMap.OnCameraChangeListener giao diện

 

    private static final int REQUEST_CODE_GOOGLE_PLAY_SERVECES_ERROR = -1; 
    private static final double EARTH_RADIOUS = 3958.75; // Earth radius; 
    private static final int METER_CONVERSION = 1609; 
    private GoogleMap mGoogleMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_layout); 

     int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(mContext); 
     if (status != ConnectionResult.SUCCESS) 
     { 
      Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, activity, 
        REQUEST_CODE_GOOGLE_PLAY_SERVECES_ERROR); 
      dialog.show(); 
      mGoogleMap = null; 
     } 
     else 
     { 
      mGoogleMap = ((SupportMapFragment) getFragmentManager().findFragmentById(
        R.id.fragment_shops_layout_maps_fragment)).getMap(); 

      mGoogleMap.setOnCameraChangeListener(this); 
     } 
    } 

Các người nghe, làm việc mà khi bản đồ được chia tỷ lệ. Xác định là LatLng các vị trí dưới cùng bên trái, dưới cùng bên phải, trên cùng bên trái và trên cùng bên phải của bản đồ, hiển thị trên màn hình. Bên cạnh màn hình lớn nhất và hai điểm chúng tôi có thể lấy bán kính từ trung tâm bản đồ.

 
    @Override 
    public void onCameraChange(CameraPosition cameraPosition) 
    { 
     // Listener of zooming; 
     float zoomLevel = cameraPosition.zoom; 
     VisibleRegion visibleRegion = mGoogleMap.getProjection().getVisibleRegion(); 
     LatLng nearLeft = visibleRegion.nearLeft; 
     LatLng nearRight = visibleRegion.nearRight; 
     LatLng farLeft = visibleRegion.farLeft; 
     LatLng farRight = visibleRegion.farRight; 
     double dist_w = distanceFrom(nearLeft.latitude, nearLeft.longitude, nearRight.latitude, nearRight.longitude); 
     double dist_h = distanceFrom(farLeft.latitude, farLeft.longitude, farRight.latitude, farRight.longitude); 
     Log.d("DISTANCE: ", "DISTANCE WIDTH: " + dist_w + " DISTANCE HEIGHT: " + dist_h); 
    } 

Khoảng cách trả về giữa 2 điểm, được lưu trữ dưới dạng 2 cặp tại mét;

 
    public double distanceFrom(double lat1, double lng1, double lat2, double lng2) 
    { 
     // Return distance between 2 points, stored as 2 pair location; 
     double dLat = Math.toRadians(lat2 - lat1); 
     double dLng = Math.toRadians(lng2 - lng1); 
     double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat1)) 
       * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng/2) * Math.sin(dLng/2); 
     double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); 
     double dist = EARTH_RADIOUS * c; 
     return new Double(dist * METER_CONVERSION).floatValue(); 
    } 

Nếu bạn muốn có được bán kính của khu vực, được hiển thị trên màn hình chỉ cần chia hết cho 2.

Tôi hy vọng sẽ hữu ích!