6

運が悪ければ、自分のオフラインMobile Atlas CreatorOSMDroidSQLiteマップをOSMDroid3.0.8で動作させるために髪の毛を抜いてきました。長い3日が経ちました。アプリケーションのクリップを使って説明しようと思います。ItemizedIconOverlayとOverlayItemを拡張しているので、混乱しすぎないように願っています。

私は、10平方キロメートルのような小さな領域に3つの異なるズームレベルを使用して、独自のOSMDroidSQLiteマップファイルを作成しました。結果の「base.sqlite」ファイルをプロジェクトの/res/raw/ディレクトリにコピーしました。アプリケーションのGeoPointは、マップのタイル範囲内に十分収まっている必要があることに注意してください。「base.sqlite」ファイルは、アプリケーション固有のデータディレクトリに保存する必要があります。

次に、以前にキャッシュされたマップをオフにできるように、電話の/osmdroidディレクトリをターフしました。機内モードをオンにして、キャッシュされたマップがまだ利用可能であることに気付くまで、自分のオフラインマップが機能していると思いました。

今私が得るのは空白だけです。これをどうやって進めるのか私には分かりません。私はいくつかの例を見てきましたが、たくさんの実験の後、私はそれらのどれも機能させることに成功していません。

private Hashtable<String, NodeOverlayItem> nodes = new Hashtable<String, NodeOverlayItem>();

private MapView mapView;
private Context context;

private LocationManager locManager;

private MapController mapController;
private MapTileProviderArray mapProvider;
private String mapTileArchivePath = "base.sqlite";

private ResourceProxy resourceProxy;

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
        this.mapView = new MapView(this, 256);
        this.mapView.setBuiltInZoomControls(true);
        this.mapView.setMultiTouchControls(true);

        this.context = this.getApplicationContext();
        this.resourceProxy = new DefaultResourceProxyImpl(context);

        XYTileSource TILERENDERER = new XYTileSource("test", 
            ResourceProxy.string.offline_mode, 
            1, 20, 256, ".png", "http://127.0.0.1");
        SimpleRegisterReceiver simpleReceiver = new SimpleRegisterReceiver(this.context);

        IArchiveFile[] archives = { ArchiveFileFactory.getArchiveFile(this.getMapsFile()) };
        MapTileModuleProviderBase moduleProvider = new MapTileFileArchiveProvider(
                simpleReceiver, 
                TILERENDERER, 
                archives);
        this.mapProvider = new MapTileProviderArray(TILERENDERER, null, new MapTileModuleProviderBase[] { moduleProvider });
        this.mapProvider.setUseDataConnection(false);
        this.mapView = new MapView(this, 256, this.resourceProxy, this.mapProvider);
        this.mapView.setUseDataConnection(false);

        mapController = mapView.getController();
        mapController.setZoom(18);
        mapController.setCenter(new GeoPoint((int)(45.349622 * 1E6), (int)(-75.880700 *1E6)));

        this.setContentView(mapView);
    } catch(Exception ex) {
        Log.e("test", ex.getMessage());
    }    
}


public File getMapsFile() throws IOException {
    Log.d("test", "Trying to load map tiles to: " + this.mapTileArchivePath);
    FileOutputStream fos = this.openFileOutput(this.mapTileArchivePath, Context.MODE_PRIVATE);

    InputStream in = getResources().openRawResource(R.raw.osmdroid);
    byte[] buff = new byte[1024];
    int read = 0;
    try {
    while ((read = in.read(buff)) > 0) {
      fos.write(buff, 0, read);
    }
    } finally {
      in.close();
      fos.close();
    }
    return new File(this.getFilesDir(), this.mapTileArchivePath);
    }
4

2 に答える 2

5

わかった!私は自分が間違っていることを知っており、今ではすべて機能しています! (私は興奮しています :)

まず、Raw リソース マップ ファイルをアプリケーション固有のディレクトリ (openFileOutput() など) に書き込む際に問題が発生しました。SD スロットのない Galaxy Nexus を使用しているため、マップ ファイルを SD にダンプできません。 . 使用するマップ ファイルが元のコピーと比較してバイトであることを確認します。Eclipse の DDMS パースペクティブは、デバイスのファイル構造を表示するのに役立ちます。

また、OSMdroid Zip 形式に切り替えました。次に、XYTileSource() の名前が MOBAC によって Zip ファイルに作成されたディレクトリと一致していることを確認し、タイル サイズとズーム レベルが一致していることを確認しました。

XYTileSource TILERENDERER = new XYTileSource("OSM CloudMade 1", ResourceProxy.string.offline_mode, 16, 18, 256, ".png", "http://127.0.0.1");

MOBAC はデフォルトで 256 ピクセルのタイルを作成します。ズーム レベル 16、17、および 18 のアトラス ファイルを作成しました。PNG は、デフォルトの MOBAC タイル イメージ形式です。

また、マップ ファイルに問題がある場合は、MapTileFileArchiveProvider の前であっても、ArchiveFileFactory.getArchiveFile() が問題をキャッチします。

これが私の使用法です。IArchive のセットアップを正しく行うためにあらゆる努力をするだけで問題ありません。

        XYTileSource TILERENDERER = new XYTileSource("OSM CloudMade 1", ResourceProxy.string.offline_mode, 16, 18, 256, ".png", "http://127.0.0.1");
        SimpleRegisterReceiver simpleReceiver = new SimpleRegisterReceiver(this.context);
        IArchiveFile[] archives = { ArchiveFileFactory.getArchiveFile(this.getMapsSdCard()) };
        MapTileModuleProviderBase moduleProvider = new MapTileFileArchiveProvider(
                simpleReceiver, 
                TILERENDERER, 
                archives);
        this.mapProvider = new MapTileProviderArray(TILERENDERER, null, new MapTileModuleProviderBase[] { moduleProvider });
        this.mapProvider.setUseDataConnection(false);
        this.mapView = new MapView(this, 256, this.resourceProxy, this.mapProvider);
        this.mapView.setUseDataConnection(false);

これに問題があったのは私だけかもしれませんが、osmdroid はこれを行う方法を明確に文書化していません。MapTileFileArchiveProvider を正しく実装している、または適切なオフライン マッピングのサンプルが含まれていると彼らが言っていたら、最初に他のすべてに集中していたでしょう。

于 2012-12-14T05:38:09.150 に答える
1

sqlite dbを使用する場合は、変更するだけです。

ArchiveFileFactory.getArchiveFile(this.getMapsSdCard())

MBTilesFileArchive.getDatabaseFileArchive(f)

ここで、fはsqliteデータベースを指すファイルです。

于 2013-01-16T19:55:54.337 に答える