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
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:
- I mak No hay garantías de que funcione para su situación y solo debe usarlo como punto de partida.
- ¡Solo funcionará para las áreas al norte del ecuador (creo) debido a la forma en que hice las coords!
- 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!
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()
.
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.
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/
- 1. ¿Determina si el usuario puede acceder a la página solicitada?
- 2. Restringir el Área de texto para no aceptar 250 caracteres
- 3. ¿Puedo detectar el área visible del usuario en el navegador?
- 4. ¿Puede un usuario acceder a la carpeta% APPDATA%
- 5. Android 1.6 Mapview no muestra el tráfico hasta que el usuario interactúe con el mapa
- 6. SQL Server 2008 - El usuario no puede acceder a la base de datos restaurada
- 7. restringir la entrada del usuario usando javascript
- 8. ¿Cómo restringir el acceso a phpmyadmin?
- 9. Restringir el acceso a archivos a usuarios autorizados de php
- 10. ¿Cómo restringir el acceso a la API de Amazon S3?
- 11. Habilitar elemento de la lista que se puede hacer clic en el área de jQuery Mobile
- 12. MapView IOS MapView resize
- 13. Restringir Acceso Directo a archivo llamado por el Ajax Función
- 14. definir el método en el modelo que se puede acceder en el controlador
- 15. ¿Cómo puedo acceder a MapView y luego pasarlo a los reconocedores de gestos predeterminados?
- 16. Política de usuario de IAM de AWS para restringir el acceso a la cola SQS específica
- 17. ¿Se puede acceder a IEnumerable a medida que se devuelve?
- 18. Cómo restringir a los desarrolladores el uso de la reflexión para acceder a métodos privados y constructores en Java?
- 19. iOS - ¿Cómo limitar el MapView a una región específica?
- 20. Se puede conectar a EC2 como usuario de ubuntu pero no como el usuario que creé
- 21. ¿Puede el javascript acceder a un sistema de archivos?
- 22. ¿Hay un reloj en iOS que se puede usar y que el usuario no puede cambiar?
- 23. ¿Cómo se puede acceder a RouteData desde el código subyacente?
- 24. Drupal 7: cómo restringir el acceso de archivos a roles de usuario específicos
- 25. ¿Puede interactuar con el área de índice/estadificación con TortoiseGit?
- 26. ¿Puede Sonatype Nexus configurarse para restringir qué artefactos puede desplegar un usuario?
- 27. .htaccess para restringir el acceso a la carpeta
- 28. Restringir el parámetro de plantilla de C++ a la subclase
- 29. ¿Cuándo es el primero en que puedo acceder a SESSION en el ciclo de vida de la página ASP.NET MVC?
- 30. Limitar a lo que puede acceder un complemento .net
@ 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