2017-03-20 5 views
0

Ich versuche, .map-Datei zu laden, die in/Assets-Ordner in Android Studio abgelegt wird. Die .map-Datei wurde von mapsforge heruntergeladen @Override geschützter void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.activity_main);OSMDROID - laden .map-Datei heruntergeladen von mapsforge

map = (MapView) findViewById(R.id.map); 
    map.setBuiltInZoomControls(true); 
    map.setTileSource(TileSourceFactory.MAPNIK); 
    IMapController controller = map.getController(); 
    GeoPoint point = new GeoPoint(41.2585, 69.2097); 
    controller.animateTo(point); 
    controller.setZoom(10); 

    File f = new File("file:///android_asset/" + "myfile.map"); 
    if (f.exists()) { 
     File[] list = f.listFiles(); 
     if (list != null) { 
      for (int i = 0; i < list.length; i++) { 
       if (list[i].isDirectory()) { 
        continue; 
       } 
       String name = list[i].getName().toLowerCase(); 
       if (!name.contains(".")) { 
        continue; //skip files without an extension 
       } 
       name = name.substring(name.lastIndexOf(".") + 1); 
       if (name.length() == 0) { 
        continue; 
       } 
       if (ArchiveFileFactory.isFileExtensionRegistered(name)) { 
        try { 
         OfflineTileProvider tileProvider = new OfflineTileProvider(new SimpleRegisterReceiver(this), 
           new File[]{list[i]}); 
         map.setTileProvider(tileProvider); 
         String source = ""; 
         IArchiveFile[] archives = tileProvider.getArchives(); 
         if (archives.length > 0) { 
          Set<String> tileSources = archives[0].getTileSources(); 
          if (!tileSources.isEmpty()) { 
           source = tileSources.iterator().next(); 
           map.setTileSource(FileBasedTileSource.getSource(source)); 
          } else map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE); 

         } else map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE); 
         map.invalidate(); 
         return; 
        } catch (Exception ex) { 
         ex.printStackTrace(); 
        } 
       } 
      } 
     } 
     Toast.makeText(this, f.getAbsolutePath() + " did not have any files I can open! Try using MOBAC", Toast.LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(this, f.getAbsolutePath() + " dir not found!", Toast.LENGTH_SHORT).show(); 
    } 
} 

Fehler erhalten "myfileDirectory" wurde nicht gefunden.

+0

'Datei f = new File ("file: /// android_asset /" + "myfile.map");'. Das funktioniert nicht, da die Dateiklasse Dateien aus Assets nicht verarbeiten kann. Google für das Lesen einer Datei aus Assets. – greenapps

+0

'if (f.exists()) { Datei [] list = f.listFiles();'. Wenn 'f' dein ist.Kartendatei dann, wie können Sie denken, dass Sie Dateien auflisten könnten? Sie versuchen nicht, diese Datei wie angegeben zu laden, sondern behandeln sie stattdessen als Verzeichnis. – greenapps

+0

Ich habe versucht, aus Assets mit InputStream zu lesen, aber hier brauche ich es Datei nicht inputStream, sollte ich InputStream nach dem Lesen in File konvertieren? – MJahongir

Antwort

0

Wenn OfflineTileProvider kann nicht von einem InputStream lesen, aber ein File Objekt zu einer .map-Datei benötigt, dann sollten Sie zuerst für echte Dateien sorgen.

Kopieren Sie also zuerst alle "Dateien" von den Assets in die Dateien des Dateisystems.

Danach können Sie diese Dateien verwenden.

Code zum Kopieren von Dateien von Assets in Dateispeicher wurde hier hundert Mal veröffentlicht.

+0

gibt es eine einzelne .map-Datei – MJahongir

+0

Die Antwort gilt auch für eine Datei. Was willst du sagen? – greenapps

1

Da ich den Code geschrieben Sie auf dem Laufenden, ich dachte, ich bin chime in.

  1. Der Code, den Sie geschrieben ist wirklich eine Sammlung von Offline-Fliese Datenbanken für das Laden, die Stützen mit dem Standardkachelanbieter Kette osmdroid (sqlite, mbtile, zip, etc). Mapsforge befindet sich nicht in dieser Liste, da es sich um ein Sonderfallszenario handelt.
  2. Um Karten zu verwenden, die Fliesen mit osmdroid zur Verfügung gestellt werden, sollten Sie diesem Beispiel wahrscheinlich folgen https://github.com/osmdroid/osmdroid/blob/master/OpenStreetMapViewer/src/main/java/org/osmdroid/samplefragments/tileproviders/MapsforgeTileProviderSample.java Ich bin mir sicher, dass Sie alle Arten von anderen nützlichen Beispielen dort geben werden.
  3. Map-Dateien oder jede andere Datenbank im Asset-Ordner bündeln (obwohl es möglich ist) Das Laden dieser Kacheln in Osmdroid ist nicht möglich, außer zum Speichern von rohen JPG/PNGs in Assets. Wenn also die Bündelung in Assets der von Ihnen gewählte Pfad ist, sollten Sie die Datenbank in den Gerätespeicher kopieren und osmdroid dann anweisen, sie zu laden. Ich bin mir nicht sicher warum, aber es kann mit Berechtigungen zu tun haben.

Sie einige Zeit zu sparen, hier ist der relevante Code-Snippet, wo durch maps ein File[] ist.

XmlRenderTheme theme = null; 
     try { 
      theme = new AssetsRenderTheme(getContext().getApplicationContext(), "renderthemes/", "rendertheme-v4.xml"); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     fromFiles = MapsForgeTileSource.createFromFiles(maps, theme, "rendertheme-v4"); 
     forge = new MapsForgeTileProvider(
      new SimpleRegisterReceiver(getContext()), 
      fromFiles, null); 


     mMapView.setTileProvider(forge); 
+0

danke viel, ich werde überprüfen – MJahongir

2

meine eigene Frage zu beantworten, * .map-Datei muss unter/sdcard/osmdroid/

Kredite http://programtalk.com/java-api-usage-examples/org.osmdroid.mapsforge.MapsForgeTileProvider/

innen OnCreate platziert werden ...

mMap = (MapView) findViewById(R.id.map); 
    Set<File> mapfiles = findMapFiles(); 
    File[] maps = new File[mapfiles.size()]; 
    maps = mapfiles.toArray(maps); 
    if (maps.length==0)Log.d(TAG, "No Mapsforge files found"); 
    else Toast.makeText(this, "Loaded " + maps.length + " map files", 
    Toast.LENGTH_LONG).show(); 
    XmlRenderTheme theme = null; 
    try { 
     theme = new AssetsRenderTheme(getApplicationContext(), 
    "renderthemes/","rendertheme-v4.xml"); 
    }catch (Exception ex){ 
     ex.printStackTrace(); 
    } 
    MapsForgeTileProvider forge = new MapsForgeTileProvider(new 
    SimpleRegisterReceiver(this), MapsForgeTileSource.createFromFiles(maps, 
    theme, "rendertheme-v4"), null); 
    mMap.setTileProvider(forge); 
    mMap.setUseDataConnection(false); 
    mMap.setMultiTouchControls(true); 
    mMap.setBuiltInZoomControls(true); 
  • Methoden zu erhalten. Map-Datei

    protected static Set<File> findMapFiles() { 
    Set<File> maps = new HashSet<>(); 
    List<StorageUtils.StorageInfo> storageList = 
    StorageUtils.getStorageList(); 
    for (int i = 0; i < storageList.size(); i++) { 
        File f = new File(storageList.get(i).path + File.separator + 
    "osmdroid" + File.separator); 
        if (f.exists()) { 
         maps.addAll(scan(f)); 
        } 
    } 
    return maps; 
    } 
    
    static private Collection<? extends File> scan(File f) { 
    List<File> ret = new ArrayList<>(); 
    File[] files = f.listFiles(new FileFilter() { 
        @Override 
        public boolean accept(File pathname) { 
         if (pathname.getName().toLowerCase().endsWith(".map")) 
          return true; 
         return false; 
        } 
    }); 
    if (files != null) { 
        for (int i = 0; i < files.length; i++) { 
         ret.add(files[i]); 
        } 
    } 
    return ret; 
    

    }

+0

Das funktioniert für Sie? – JasonStack