2011-10-26 12 views
5

Mam te kody lub łatki z osmdroida i postanowiłem poprosić o pomoc facetów, ponieważ nie mam wystarczającej wiedzy, aby połączyć te kody, aby wymyślić rozwiązanie mojego problemu, Ograniczenie przewijania na mapie offline. Przeszukałem w Internecie i zmodyfikowałem samouczki. Szczerze próbowałem zmodyfikować te kody, ale nie znalazłem żadnego postępu. Zasadniczo mam mapę offline z mapnika i kilka nakładek. Nie wiem, gdzie właściwie umieścić te zestawy kodów. Twoje pomysły i modyfikacje będą bardzo pomocne, a także pomogą mi kontynuować mój projekt i myślę, że twoje odpowiedzi na pewno pomogą innym z tym samym problemem, co mój w przyszłości. Wiem, że to dużo. Dziękuję panu za poświęcony czas i Bogu.Limit Przewijanie na mapach offline, w Androidzie

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

pierwsze: BoundingBox

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

drugie: 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 

Inny:

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

Mam również błędy w tym: super.scrollTo (x, y); // wywołanie zwrotne na odbiorniku jeśli (mListener! = Null) { końcowe Zdarzenie ScrollEvent = nowe ScrollEvent (this, x, y); mListener.onScroll (zdarzenie); } – rahstame

Odpowiedz

7

Przede wszystkim korzystać z tego polecenia w terminalu:

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

To będzie pobrać stabilną wersję

następnie postępuj to zaimportować zawartość folderu u pobranego:

w Eclipse, kliknij prawym przyciskiem myszy na obszarze opakowania, a następnie wybierz następujące :

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. teraz otwórz ten plik java -> osmdroid-android/src/org/osmdroid/view/MapView.java
  2. Teraz jak stwierdzono w tym patch file, modyfikować MapView.java (dodać kod gdziekolwiek +, usunąć kod gdziekolwiek -)
  3. modyfikować także computeScroll() w MapView.java jak stwierdzono here
  4. teraz, aby skorzystać z tej zmodyfikowanego pliku .java, u trzeba utworzyć nowy plik jar że u można umieścić w swoim projekcie Oto krok po kroku proces to create jar

  5. Dodaj ten nowo utworzony plik jar do ścieżki budowania Twojego projektu i r gotowy do użycia zmodyfikowanego słoik

  6. Teraz to wykorzystać w swojej klasie działalności:

    BoundingBoxE6 bbox = new BoundingBoxE6 (limit na północ, limit wschód, limit południe, granica zachód);
    mapView.setScrollableAreaLimit (bbox);