2013-04-17 13 views
7

Czy istnieje sposób uzyskania współrzędnych bieżącego obszaru, który jest wyświetlany na urządzeniu?Android Mapy Google: jak uzyskać obszar, który jest aktualnie wyświetlany na ekranie urządzenia?

Tło jest, chcemy pokazać miejsca "w pobliżu", które są przechowywane w naszej własnej bazie danych. Więc powiedzmy, użytkownik patrzy na poniższym klipie z mapą:

enter image description here

Jak uzyskać długość/szerokość ekranu (lub punktem na środku ekranu i promieniem który obejmuje wszystko?). Pamiętaj, że środek mapy zwykle nie jest aktualną pozycją, ponieważ użytkownik może przesunąć środek karty!

+0

z którego api używasz? –

+0

Obsługa API co najmniej API 11, ale obsługa API 8-10 byłaby miła – longilong

+0

Pytam o twoją wersję api mapy. jest to 1,2 lub 3 –

Odpowiedz

20

Użyj map.getProjection().getVisibleRegion(). Od VisibleRegion można uzyskać LatLngBounds, z którym łatwo można pracować. Możesz także spróbować bezpośrednio w regionie, który może być trapezoidalny.

+0

tak! dokładnie to, czego szukałem! – longilong

7

znalazłem rozwiązanie dla Google Map API v2 od kilku odpowiedzi:

stackoverflow#1 i stackoverflow#2

więc potrzeby realizuje aktywny od GoogleMap.OnCameraChangeListener interfejsu

 

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

słuchacza, że ​​praca kiedy mapa jest skalowana. Determinat as LatLng Pozycje lewego dolnego, prawego dolnego, lewego górnego i prawego prawego rogu mapy, które pokazują się na ekranie. Po największej stronie ekranu i dwóch punktach możemy uzyskać promień od środka mapy.

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

Odległość powrotna między 2 punktami, zapisana jako lokalizacja 2 par na metry;

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

Jeśli chcesz uzyskać promień obszaru, który pokazał się na ekranie wystarczy podzielić przez 2.

Mam nadzieję, że będą przydatne!

Powiązane problemy