2013-04-17 61 views
7

有沒有辦法獲得設備上顯示的當前區域的座標?Android谷歌地圖:如何獲取屏幕設備當前顯示的區域?

背景是,我們想顯示「附近」的地方,它們存儲在我們自己的數據庫中。所以我們可以說,用戶查看地圖的下列片段:

enter image description here

我們怎樣在屏幕(或在屏幕的中間點和半徑的經度/緯度,其涵蓋了一切?)。請記住,地圖的中心通常不是當前位置,因爲用戶可以移動卡的中心!

+0

你正在使用哪個API? –

+0

API支持至少API 11,但支持API 8-10會很好 – longilong

+0

我在問你的地圖api版本。它是1,2或3 –

回答

20

使用map.getProjection().getVisibleRegion()。從VisibleRegion你可以得到LatLngBounds,這很容易處理。您也可以直接嘗試可能是梯形的區域。

+0

是啊!正是我期待的! – longilong

7

我發現谷歌地圖API第2版的解決方案,從幾個對策:

stackoverflow#1stackoverflow#2

因此,需要從GoogleMap.OnCameraChangeListener接口

 

    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); 
     } 
    } 

監聽器,該工作實現活動當地圖縮放時。確定爲LatLng顯示地圖的左下角,右下角,左上角和右上角的位置。通過屏幕最大的一面和兩個點,我們可以從地圖中心獲得半徑。

 
    @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); 
    } 

2點之間的返回距離,以米爲單位存儲爲2對位置;

 
    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(); 
    } 

如果你想獲得區域的半徑,在屏幕上顯示,這只是需要靠2.

devided我希望能有用!

相關問題