1

あなたのコメントJaakLの後、私は少し仕事をしました。これは私が得た限りです。残念ながら、まだ機能していません。あなたが私に言ったことを段階的に実行しましたが、アプリをロードするたびに、ロードしようとしている美しい地図の代わりに白い画面が表示されます.

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    MapView mapView;
    mapView=(MapView)findViewById(R.id.mapView);



    // Optional, but very useful: restore map state during device rotation,
    // it is saved in onRetainNonConfigurationInstance() below
    Components retainObject = (Components) getLastNonConfigurationInstance();
    if (retainObject != null) {
        // just restore configuration and update listener, skip other initializations

        mapView.setComponents(retainObject);

        return;
    } else {
        // 2. create and set MapView components - mandatory

        mapView.setComponents(new Components());
    }

        copyAssets();

        try {
            MBTilesRasterDataSource dataSource = new MBTilesRasterDataSource(
                    new EPSG3857(), 0, 19,
                    (null).getAbsolutePath() + "/braga.mbtiles",
                    false, this);
            RasterLayer mbLayer = new RasterLayer(dataSource, 0);
            mapView.getLayers().addLayer(mbLayer);
        } catch (IOException e) {
            Log.error(e.getMessage());
        }

私のデバッガの最初の3行:

        27337-27337/com.exaple.myapplication5.app E/Trace﹕ error opening trace file: No such file or directory (2)
        27337-27337/com.exaple.myapplication5.app W/ActivityThread﹕ Application    com.exaple.myapplication5.app is waiting for the debugger on port 8100...
        27337-27337/com.exaple.myapplication5.app I/System.out﹕ Sending WAIT chunk
4

2 に答える 2

2

秘訣は、アプリケーション パッケージからデバイス ストレージにファイルをコピーする必要があることです。そうしないと、MBtiles ファイルを開くことができません。

  1. map.mbtiles ファイルを res/raw/ ではなく/assetsフォルダーに配置します。
  2. アプリケーションの初回起動時にファイルをコピーします。onCreate()メソッドでcopyAssets()を呼び出すだけです。以下のコードを参照してください。これにより、アセットの下のすべてがアプリのプライベート フォルダーにコピーされます。そこに典型的なファイル書き込みの問題のケースの処理を追加したい場合があることに注意してください: SD カードが利用できない、書き込み権限がない (アプリには WRITE_EXTERNAL_STORAGE 権限が必要です)、十分なスペースがない、またはそれ以上の可能性があります。
  3. 正しいパスでデータソースとレイヤーを作成します。

サンプルコード:

@Override
public void onCreate(Bundle savedInstanceState) {
  // create mapview, settings...

    copyAssets();
    try {
        MBTilesRasterDataSource dataSource = new MBTilesRasterDataSource(
            new EPSG3857(), 0, 19, 
            getExternalFilesDir(null).getAbsolutePath()+"/map.mbtiles",
            false, this);
        RasterLayer mbLayer = new RasterLayer(dataSource, 0);
        // use setBaseLayer() if this is main layer, addLayer() if it is overlay layer
        mapView.getLayers().setBaseLayer(mbLayer);

        // recenter map to coverage
        HashMap<String, String> dbMetaData = dataSource.getDatabase().getMetadata();

        String center = dbMetaData.get("center");
        String bounds = dbMetaData.get("bounds");
        if(center != null){
            // format: long,lat,zoom
            String[] centerParams = center.split(",");
            mapView.setFocusPoint(mapView.getLayers().getBaseLayer().getProjection().fromWgs84(Double.parseDouble(centerParams[0]), Double.parseDouble(centerParams[1])));
            mapView.setZoom(Float.parseFloat(centerParams[2]));
            Log.debug ("center to point "+Arrays.toString(centerParams));
        }else if(bounds != null){
            // format: longMin,latMin,longMax,latMax
            String[] boundsParams = bounds.split(",");
            MapPos bottomLeft = mapView.getLayers().getBaseProjection().fromWgs84(Double.parseDouble(boundsParams[0]), Double.parseDouble(boundsParams[1]));
            MapPos topRight = mapView.getLayers().getBaseProjection().fromWgs84(Double.parseDouble(boundsParams[2]), Double.parseDouble(boundsParams[3]));
            Log.debug ("center to bounds "+bottomLeft.x+","+topRight.y+","+topRight.x+","+bottomLeft.y);
            mapView.setBoundingBox(new Bounds(bottomLeft.x,topRight.y,topRight.x,bottomLeft.y), false);

            // check that zoom is within given range
            int[] zoomRange = dataSource.getDatabase().getZoomRange();
            if(mapView.getZoom() < zoomRange[0]){
                mapView.setZoom(zoomRange[0]+1);
            }
            if(mapView.getZoom() > zoomRange[1]){
                mapView.setZoom(zoomRange[1]-1);
            }

        }else{
            // bulgaria
            mapView.setFocusPoint(mapView.getLayers().getBaseLayer().getProjection().fromWgs84(26.483230800000037, 42.550218000000044));
            // zoom - 0 = world, like on most web maps
            mapView.setZoom(5.0f);
            Log.debug("center to default");
        }
    } catch (IOException e) {
        Log.error(e.getMessage());
    }


  // ...
 }

private void copyAssets() {
    AssetManager assetManager = getAssets();
    String[] files = null;
    try {
        files = assetManager.list("");
    } catch (IOException e) {
        Log.error("Failed to get asset file list." + e.getLocalizedMessage());
    }
    for(String filename : files) {
        InputStream in = null;
        OutputStream out = null;
        try {
          in = assetManager.open(filename);
          File outFile = new File(getExternalFilesDir(null), filename);

          if(!outFile.exists()){
              out = new FileOutputStream(outFile);
              copyFile(in, out);
              out.flush();
              out.close();
              out = null;
          }

          in.close();
          in = null;

        } catch(IOException e) {
            Log.error("Failed to copy asset file: " + filename + "\n" + e.getLocalizedMessage());
        }       
    }
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
    byte[] buffer = new byte[32 * 1024];
    int read;
    while((read = in.read(buffer)) != -1){
      out.write(buffer, 0, read);
    }
}
于 2014-05-26T07:22:45.753 に答える
0

私も同じ問題を抱えていました。次のリンクが確実に役立つ場合があります。

https://github.com/nutiteq/hellomap3d/wiki/Offline-map-tiles

Androidでnutiteqを使用してオフラインの3Dマップで作業する方法

うまくいくかどうか教えてください。

于 2014-05-26T05:56:09.657 に答える