2011-03-23 9 views
5

Estoy usando una versión personalizada de la vista de mapa (versión OSMDroid). Estoy usando mosaicos personalizados dentro de él y solo quiero que el usuario pueda ver el área donde tengo mis mosaicos personalizados. ¿Hay alguna manera de establecer los largos latitud límite para que cuando recorran el mapa no traspase estos límites?Restringir el área a la que el usuario puede acceder en Mapview

Respuesta

1

En caso que ayuda a nadie ....

que tiene una especie de solución que estoy usando, funciona bien, pero sin duda podría ser mejor que el mapa puede ir un poco demasiado lejos de la pantalla antes de que salta ¡espalda! Utiliza los largos y determina dónde está el mapa, establezco 4 coordenadas que son aproximadamente las 4 esquinas del mapa. He encontrado que funciona mejor si las fijas ligeramente en el mapa en lugar de exactamente las esquinas, luego hago ejercicio si aspira el lat han dejado la pantalla por completo .. si lo que se va a recuperar hasta la mitad posterior:

que pesaban más que las MapView y el evento OnTouch del mapa

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_UP) { 

     // (only works for north of equator) 
     // * map right side (lat) can't go past the left (lat) of screen 

     // get geopoints of the 4 corners of the screen 
     Projection proj = getProjection(); 
     GeoPoint screenTopLeft = proj.fromPixels(0, 0); 
     GeoPoint screenTopRight = proj.fromPixels(getWidth(), 0); 
     GeoPoint screenBottomLeft = proj.fromPixels(0, getHeight()); 

     double screenTopLat = screenTopLeft.getLatitudeE6()/1E6; 
     double screenBottomLat = screenBottomLeft.getLatitudeE6()/1E6; 
     double screenLeftlong = screenTopLeft.getLongitudeE6()/1E6; 
     double screenRightlong = screenTopRight.getLongitudeE6()/1E6; 

     double mapTopLat = BoundsTopLeftCorner.getLatitudeE6()/1E6; 
     double mapBottomLat = BoundsBottomLeftCorner.getLatitudeE6()/1E6; 
     double mapLeftlong = BoundsTopLeftCorner.getLongitudeE6()/1E6; 
     double mapRightlong = BoundsTopRightCorner.getLongitudeE6()/1E6; 

     // screen bottom greater than map top 
     // screen top less than map bottom 
     // screen right less than map left 
     // screen left greater than map right 
     boolean movedLeft = false; 
     boolean movedRight = false; 
     boolean movedUp = false; 
     boolean movedDown = false; 

     boolean offscreen = false; 
     if (screenBottomLat > mapTopLat) { 
      movedUp = true; 
      offscreen = true; 
     } 
     if (screenTopLat < mapBottomLat) { 
      movedDown = true; 
      offscreen = true; 
     } 
     if (screenRightlong < mapLeftlong) { 
      movedLeft = true; 
      offscreen = true; 
     } 
     if (screenLeftlong > mapRightlong) { 
      movedRight = true; 
      offscreen = true; 
     } 

     if (offscreen) { 
      // work out on which plane it's been moved off screen (lat/lng) 

      if (movedLeft || movedRight) { 

       double newBottomLat = screenBottomLat; 
       double newTopLat = screenTopLat; 

       double centralLat = newBottomLat 
         + ((newTopLat - newBottomLat)/2); 
       if (movedRight) 
        this.getController().setCenter(
          new GeoPoint(centralLat, mapRightlong)); 
       else 
        this.getController().setCenter(
          new GeoPoint(centralLat, mapLeftlong)); 

      } 
      if (movedUp || movedDown) { 

       // longs will all remain the same 
       double newLeftLong = screenLeftlong; 
       double newRightLong = screenRightlong; 

       double centralLong = (newRightLong + newLeftLong)/2; 

       if (movedUp) 
        this.getController().setCenter(
          new GeoPoint(mapTopLat, centralLong)); 

       else 
        this.getController().setCenter(
          new GeoPoint(mapBottomLat, centralLong)); 
      } 

     } 

    } 
    return super.onTouchEvent(ev); 
}} 

algunas cosas que debería señalar si Está considerando usar esto:

  1. I mak No hay garantías de que funcione para su situación y solo debe usarlo como punto de partida.
  2. ¡Solo funcionará para las áreas al norte del ecuador (creo) debido a la forma en que hice las coords!
  3. Funciona en la "acción hacia arriba" del evento táctil, por lo que toma el punto donde el usuario saca el dedo de la pantalla. Esto significa que cuando el mapa arroja es completamente inexacto ya que no pude averiguar dónde se detuvo el mapa, debido a esto apagué la aventura anulando el evento arrojado y no haciendo nada en él ... ¡esto hace que el mapa sea un poco borroso!

Si alguien tiene mejores soluciones o puede mejorar mi código, ¡siéntase libre!

0

Estoy buscando exactamente lo mismo.

Mi mejor ventaja es agregar una Superposición, que se extiende boolean onScroll(...). Si esto devuelve verdadero, entonces el desplazamiento se cancela.

Esto es exactamente lo que quiero, excepto por una cosa: arrojar/sacudir. El mismo enfoque se puede usar para cancelar eventos de flirteo, aunque solo se puede escuchar al principio de la aventura.

Idealmente, usted sería capaz de escuchar el método computeScroll(), y limitar el (x, y) del desplazamiento, basado en mScroller.getCurX() y mScroller.getCurY().

+0

@ Kevin, alguien aparentemente ha creado una rama del proyecto, que incluye cuadros delimitadores, no he podido probarlo aunque como estoy usando una versión anterior del proyecto y no pude actualizar, ni tampoco sé cómo integrarlo con mi propia versión ... se me ocurrió una especie de solución a continuación – Bex

6

Actualización: Sé que esta es una pregunta anterior, pero osmdroid ahora tiene un método setScrollableAreaLimit() que logrará lo que está buscando. También hay un método setMinZoomLevel() y setMaxZoomLevel() para restringir fácilmente los niveles de zoom.

Respuesta original:

Por favor, mantener un ojo en:

http://code.google.com/p/osmdroid/issues/detail?id=209

Un parche ya se ha creado, y es probable que se integrará en breve.

3

Esto tiene una publicación cruzada desde the osmdroid thread. Ahora se incluye una clase BoundedMapView, que implementa el parche mencionado anteriormente.

Para aquellos de uso mediante el .jar o de otro modo no familiarizado con parches, I adoquinadas juntos una subclase de MapView que soporta limitar la visión del usuario a un área específica.

detalles sobre cómo usarlo, si no es obvio, se pueden encontrar en http://www.sieswerda.net/2012/08/15/boundedmapview-a-mapview-with-limits/

Cuestiones relacionadas