2013-04-17 13 views
7

C'è un modo per ottenere le coordinate dell'area corrente, che viene visualizzata sul dispositivo?Google Maps Android: come ottenere l'area attualmente visualizzata nel dispositivo dello schermo?

Lo sfondo è, vogliamo mostrare luoghi "vicini", che sono memorizzati nel nostro database. Quindi diciamo, l'utente guarda seguente clip di una mappa:

enter image description here

Come possiamo ottenere la longitudine/latitudine dello schermo (o il punto al centro dello schermo e un raggio che copre tutto?). Tieni presente che il centro della mappa non è in genere la posizione corrente, poiché l'utente può spostare il centro della carta!

+0

quale API stai usando? –

+0

Supporto API almeno API 11, ma supportare l'API 8-10 sarebbe bello – longilong

+0

sto chiedendo sulla tua versione di mappa API. è 1,2 o3 –

risposta

20

Utilizzare map.getProjection().getVisibleRegion(). Da VisibleRegion è possibile ottenere LatLngBounds, che è facile da lavorare. Puoi anche provare direttamente con la regione, che potrebbe essere trapezoidale.

+0

sì! esattamente quello che stavo cercando! – longilong

7

ho trovato la soluzione per Google Map API v2 da alcune delle risposte:

stackoverflow#1 e stackoverflow#2

Così, bisogno implementa attività da GoogleMap.OnCameraChangeListener interfaccia

 

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

L'ascoltatore, che il lavoro quando la mappa è ridimensionata. Determinare come LatLng le posizioni dei lati in basso a sinistra, in basso a destra, in alto a sinistra e in alto a destra, che vengono visualizzati sullo schermo. Dal lato più grande dello schermo e da due punti possiamo ottenere il raggio dal centro della mappa.

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

Distanza di ritorno tra 2 punti, memorizzata come posizione a 2 coppie in metri;

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

Se si desidera ottenere il raggio di zona, che ha mostrato sullo schermo solo bisogno diviso per 2.

spero utile!

Problemi correlati