Jak korzystać z MOBAC utworzonego w trybie offline pliku źródłowego płytki OSMDroid SQLite?
Wyciągam włosy, próbując zdobyć własne narzędzie Mobile Atlas Creator OSMDroid Mapa SQLite współpracująca z OSMDroid 3.0.8 bez szczęścia. Minęły długie 3 dni. Spróbuję wyjaśnić za pomocą klipów z mojej aplikacji. Rozszerzyłem ItemizedIconOverlay i OverlayItem, więc mam nadzieję, że nie będzie to zbyt skomplikowane.
Stworzyłem własny plik mapy OSMDroid SQLite z 3 różnymi poziomami powiększenia dla małego, jak 10 km kwadratowych. Skopiowałem wynikowy plik „base.sqlite” do mojego katalogu / res / raw /. Pamiętaj, że punkty geo w mojej aplikacji powinny znajdować się w zasięgu kafelków mapy. Plik „base.sqlite” powinien zostać zapisany w katalogu danych aplikacji.
Następnie zmieniłem katalog / osmdroid na moim telefonie, aby móc wyłączyć wcześniej buforowane mapy. Myślałem, że mam własne mapy offline działające, dopóki nie włączyłem trybu samolotowego i zauważyłem, że buforowane mapy są nadal dostępne.
Teraz wszystko, co dostaję, to puste miejsca. Nie mam pojęcia, jak to zrobić. Widziałem kilka przykładów, ale po mnóstwie eksperymentów nie udało mi się uruchomić żadnego z nich.
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);
}