2017-03-20 6 views
0

アンドロイドスタジオの/ assetsフォルダにある.mapファイルを読み込もうとしています。 .mapファイルはmapsforgeからダウンロードされました。 @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);OSMDROID - mapsforgeからダウンロードした.mapファイル

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(); 
    } 
} 

エラー "myfileDirectory"が見つかりませんでした。

+0

'ファイルf =新しいファイル( "ファイル:/// android_asset /" + "myfile.map");'。 Fileクラスはアセットからのファイルを処理できないため、これは機能しません。アセットからファイルを読み込む方法についてはGoogleにお問い合わせください。 – greenapps

+0

'if(f.exists()){ File [] list = f.listFiles();'。 'f'があなたの人生です。ファイルをマップすると、どのようにファイルをリストすることができると思いますか?指定したファイルをロードするのではなく、ディレクトリとして扱います。 – greenapps

+0

私はInputStreamで資産からの読み込みを試みましたが、ここで私はFileStreamでなければなりません。 – MJahongir

答えて

0

OfflineTileProviderInputStreamから読み取れない場合は、Fileのオブジェクトを.mapファイルに読み込む必要がある場合は、まず実際のファイルを気にする必要があります。

まずファイルシステム上のファイルにすべての 'ファイル'をアセットからコピーします。

その後、これらのファイルを使用できます。

アセットからファイルストレージにファイルをコピーするコードは、ここで100回公開されています。

+0

単一の.mapファイルがあります – MJahongir

+0

答えは1つのファイルに対しても有効です。あなたは何を言いたいのですか? – greenapps

1

私はあなたが投稿コードを書いたので、私は私がチャイムだ考え出し。

  1. あなたが投稿したコードは、デフォルトのタイルプロバイダ鎖とサポートをosmdroidオフラインタイルデータベースの集合をロードするための実際にあります( sqlite、mbtile、zipなど)。特別なケースであるため、Mapsforgeはそのリストには含まれていません。
  2. osmdroidで地図偽造タイルを使用するには、おそらくこの例に従ってください。https://github.com/osmdroid/osmdroid/blob/master/OpenStreetMapViewer/src/main/java/org/osmdroid/samplefragments/tileproviders/MapsforgeTileProviderSample.java他の有益な例があります。
  3. アセットファイルにraw jpg/pngを格納する以外は、osmdroidでこのタイルをロードすることはできません(アセットフォルダ内の他のデータベースをバンドルすることはできません)。したがって、アセットのバンドルを選択したパスにする場合は、データベースをデバイスストレージにコピーし、osmdroidにロードするよう指示します。私は理由は分かりませんが、権限と関係している可能性があります。

mapsのコードスニペットは、File[]です。

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

ありがとうございます。 – MJahongir

2

自分の質問に答える、 * .MAPファイルが... OnCreate関数の内部/ SDカード/ osmdroid/

クレジットにhttp://programtalk.com/java-api-usage-examples/org.osmdroid.mapsforge.MapsForgeTileProvider/

の下に配置する必要が

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); 
  • .mapファイルを取得する方法

    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

これはあなたのために働きますか? – JasonStack

関連する問題