2013-01-23 17 views
6

Posso limitare Google Maps V2 (Android) a 180 °/-180 ° di longitudine (come iOS MapKit)? Non voglio che si avvolga, dato che sto cercando di implementare un algoritmo di clusterin e la divisione di 180/-180 gradi lo renderebbe difficile.Mappe Android - Limite a 180 gradi

Vorrei che il panning a essere limitato alla linea rossa:

enter image description here

risposta

3

Così ho creato una soluzione che dovrebbe andare bene. Se l'utente sposta la mappa sul bordo -180/180, la mappa si sposta dall'altro lato. Quindi avvolgere la mappa è ancora possibile, ma l'area "pericolosa" non viene mai visualizzata.

ho dovuto creare un MapView personalizzato:

public class CustomMapView extends MapView { 

    private double prevLongitude; 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     boolean retVal = correctCamera(); 
     prevLongitude = getMap().getCameraPosition().target.longitude; 
     return retVal; 
    } 

    public boolean correctCamera() {  
     if (getMap().getProjection().getVisibleRegion().latLngBounds.northeast.longitude < getMap().getProjection().getVisibleRegion().latLngBounds.southwest.longitude) { 
      double diff = getMap().getProjection().getVisibleRegion().latLngBounds.southwest.longitude - getMap().getProjection().getVisibleRegion().latLngBounds.northeast.longitude; 
      double longitudeSW; 
      double longitudeNE; 

      double longitudeDiff = (360-diff)/25; 

      // use > 0 if you want the map to jump to the other side 
      // <= 0 will cause the map to flip back 
      if (prevLongitude > 0) { 
       longitudeSW = -180 + longitudeDiff; 
       longitudeNE = -180 + longitudeDiff - diff; 
      } else { 
       longitudeSW = 180 - longitudeDiff + diff; 
       longitudeNE = 180 - longitudeDiff; 
      } 
      LatLngBounds bounds = new LatLngBounds(
             new LatLng(getMap().getCameraPosition().target.latitude, longitudeSW), 
             new LatLng(getMap().getCameraPosition().target.latitude, longitudeNE) 
           ); 
      getMap().animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 0)); 

      return true; 
     } 

     return false; 
    } 
} 

E il xml:

<com.ieffects.clustermap.CustomMapView 
     android:id="@+id/map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

E per la GoogleMap (mapView.getMap()):

map.setOnCameraChangeListener(new OnCameraChangeListener() { 
    @Override 
    public void onCameraChange(CameraPosition position) { 
     mapView.correctCamera(); 
    } 
}); 

Questo è necessario se l'utente fa "volare" la mappa nella regione pericolosa.

1

Vedi questo tutorial per v2: http://econym.org.uk/gmap/range.htm - in pratica, si aggiunge un listener per l'evento move, e interrompe la mossa se va fuori dal raggio d'azione. Questo dovrebbe essere applicabile anche allo v3.

+0

Ma questo è in js ?? –

Problemi correlati