Limitar el desplazamiento en mapas sin conexión, en Android

Tengo estos trozos de códigos o parches de osmdroid, y decidí pedirles ayuda a los chicos porque no tengo el conocimiento suficiente para combinar estos códigos para llegar a una solución en mi problema, el límite de desplazamiento en un mapa sin conexión . Busqué a través de la web, y los tutoriales modificados. Honestamente, traté de modificar estos códigos, pero no he encontrado ningún progreso. Básicamente tengo un mapa sin conexión de mapnik, y algunas superposiciones. No sé dónde colocar correctamente este conjunto de códigos. Sus ideas y modificaciones serán una gran ayuda y también me ayuda a seguir adelante con mi proyecto y supongo que sus respuestas definitivamente ayudarán a otros con el mismo problema que el mío en el futuro. Sé que esto es mucho. Gracias a ustedes por su tiempo, y Dios los bendiga.

public void onCreate(Bundle savedInstanceState) { ... ... m_mapView = (MapView) findViewById(R.id.mapview); m_mapView.setTileSource(TileSourceFactory.MAPNIK); } 

Primero: BoundingBox

 BoundingBoxE6 bbox = new BoundingBoxE6(9.37398, 123.33761, 9.23948, 123.25035); this.setScrollableAreaLimit(bbox); 

Segundo: LimitScrollToGeographicArea.patch

 Index: MapView.java =================================================================== --- MapView.java (revision 944) +++ MapView.java (working copy) @@ -103,6 +103,8 @@ protected MapListener mListener; + protected Rect mScrollableAreaLimit; + // for speed (avoiding allocations) private final Matrix mMatrix = new Matrix(); private final MapTileProviderBase mTileProvider; @@ -505,6 +507,36 @@ mMapOverlay.setUseDataConnection(aMode); } + /** + * Set the map to limit it's scrollable view to the specified BoundingBoxE6. Note that, like + * North/South bounds limiting, this allows an overscroll of half the screen size. This means + * each border can be scrolled to the center of the screen. + * + * @param boundingBox + * A lat/long bounding box to limit scrolling to, or null to remove any scrolling + * limitations + */ + public void setScrollableAreaLimit(BoundingBoxE6 boundingBox) { + final int worldSize_2 = TileSystem.MapSize(MapViewConstants.MAXIMUM_ZOOMLEVEL) / 2; + + // Clear scrollable area limit if null passed. + if (boundingBox == null) { + mScrollableAreaLimit = null; + return; + } + + // Get NW/upper-left + final Point upperLeft = TileSystem.LatLongToPixelXY(boundingBox.getLatNorthE6() / 1E6, + boundingBox.getLonWestE6() / 1E6, MapViewConstants.MAXIMUM_ZOOMLEVEL, null); + upperLeft.offset(-worldSize_2, -worldSize_2); + + // Get SE/lower-right + final Point lowerRight = TileSystem.LatLongToPixelXY(boundingBox.getLatSouthE6() / 1E6, + boundingBox.getLonEastE6() / 1E6, MapViewConstants.MAXIMUM_ZOOMLEVEL, null); + lowerRight.offset(-worldSize_2, -worldSize_2); + mScrollableAreaLimit = new Rect(upperLeft.x, upperLeft.y, lowerRight.x, lowerRight.y); + } + // =========================================================== // Methods from SuperClass/Interfaces // =========================================================== @@ -772,10 +804,26 @@ //I am confused with these codes below, where should I declare it? Int x, y in the onCreate method? x += (worldSize_2 * 2); while (x > worldSize_2) x -= (worldSize_2 * 2); - while (y < -worldSize_2) - y += (worldSize_2 * 2); - while (y > worldSize_2) - y -= (worldSize_2 * 2); + if (y < -worldSize_2) + y = -worldSize_2; + if (y > worldSize_2) + y = worldSize_2; + + if (mScrollableAreaLimit != null) { + final int zoomDiff = MapViewConstants.MAXIMUM_ZOOMLEVEL - getZoomLevel(); + final int minX = mScrollableAreaLimit.left >> zoomDiff; + final int minY = mScrollableAreaLimit.top >> zoomDiff; + final int maxX = mScrollableAreaLimit.right >> zoomDiff; + final int maxY = mScrollableAreaLimit.bottom >> zoomDiff; + if (x < minX) + x = minX; + else if (x > maxX) + x = maxX; + if (y < minY) + y = minY; + else if (y > maxY) + y = maxY; + } super.scrollTo(x, y); // do callback on listener 

Otro:

  scrollToMethod public void scrollTo(int x, int y) { int curZoomLevel = mZoomLevel; final int worldSize_2 = TileSystem.MapSize(curZoomLevel) / 2; Log.v("HELP", "Scrolling to X=" + x + " Y=" + y + " ZL=" + curZoomLevel + " - WW="+worldSize_2); while (x < -worldSize_2) x += (worldSize_2 * 2); while (x > worldSize_2) x -= (worldSize_2 * 2); if (y < -worldSize_2) y = -worldSize_2; if (y > worldSize_2) y = worldSize_2; if (mScrollableAreaLimit != null) { int targetZoomLevel = getZoomLevel(); final int zoomDiff = MapViewConstants.MAXIMUM_ZOOMLEVEL - targetZoomLevel; //final int zoomDiff = MapViewConstants.MAXIMUM_ZOOMLEVEL - mZoomLevel; final int minX = mScrollableAreaLimit.left >> zoomDiff; final int minY = mScrollableAreaLimit.top >> zoomDiff; final int maxX = mScrollableAreaLimit.right >> zoomDiff; final int maxY = mScrollableAreaLimit.bottom >> zoomDiff; Log.v("HELP", "Limit: minX=" + minX + " maxX=" + maxX + " minY=" + minY + " maxY=" + maxY + " ZL=" + curZoomLevel + " ZLTarget="+ targetZoomLevel + " ZD="+zoomDiff); if (x < minX) { Log.v("HELP", "!!! X=" + x + " minX=" + minX + " CORRECTION:" + (minX-x)); x = minX; } else if (x > maxX) { Log.v("HELP", "!!! X=" + x + " maxX=" + maxX + " CORRECTION:" + (maxX-x)); x = maxX; } if (y < minY) { Log.v("HELP", "!!! Y=" + y + " minY=" + minY + " CORRECTION:" + (minY-y)); y = minY; } else if (y > maxY) { Log.v("HELP", "!!! Y=" + y + " maxY=" + maxY + " CORRECTION:" + (maxY-y)); y = maxY; } } super.scrollTo(x, y); // do callback on listener if (mListener != null) { final ScrollEvent event = new ScrollEvent(this, x, y); mListener.onScroll(event); } } 

En primer lugar, utilice este comando en su terminal:

 svn checkout http://osmdroid.googlecode.com/svn/branches/release_3_0_5 

Se descargará una versión estable

A continuación, siga esto para importar el contenido de la carpeta u descargado:

En Eclipse, haga clic con el botón derecho en el área de Paquete y seleccione lo siguiente:

 click on Import... select General -> Existing Projects into Workspace click Next click Browse... select the checked out projects' directories osmdroid-android (import as a java project) OSMMapTilePackager (import as a java project) OpenStreetMapViewer (mport as an android project) click OK click Finish 
  1. Ahora abra este archivo java -> osmdroid-android / src / org / osmdroid / view / MapView.java
  2. Ahora como se indica en este archivo de revisión , modifique MapView.java (agregue el código dondequiera que +, quite el código donde -)
  3. También modifique computeScroll() en MapView.java como se indica aquí
  4. Ahora, para usar este archivo .java modificado, u necesita crear un nuevo archivo jar que u puede incluir en su proyecto Aquí está un proceso paso a paso para crear jar

  5. Agregue este archivo jar recién creado a la ruta de construcción de su proyecto y estará listo para usar su tarro modificado

  6. Ahora usa esto en tu clase de actividad:

    BoundingBoxE6 bbox = new BoundingBoxE6 (límite norte, límite este, límite sur, límite oeste);
    MapView.setScrollableAreaLimit (bbox);

  • Encontrar la posición actual en OSMdroid
  • OsmDroid y MapQuest: ¿Cómo puedo usar los mosaicos JPEG?
  • Abrir mapa de la calle trabajando offline en Android
  • ¿Cómo puedo implementar mapas sin conexión usando osmdroid al guardar imágenes de mosaicos de mapa en la base de datos sqlite?
  • Osmdroid y Pinch
  • Ajuste el centro del marcador en el GeoPoint
  • No mostrar mosaicos en la aplicación de mapas sin conexión de Android que utiliza osmdroid con el archivo MBTiles
  • ParseException para org.osmdroid.DefaultResourceProxyTest
  • Proyección de imágenes de radar no proyectadas en osmdroid
  • ¿Tiene OpenStreetMap punto (fuente) a punto (destino) dirección uri para utilizar en Android?
  • ¿Cómo puedo implementar un geocodificador sin conexión para una sola ciudad utilizando datos OSM en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.