如何离线使用 MOBAC 创建的 OSMDroid SQLite 瓦片源文件?
Posted
技术标签:
【中文标题】如何离线使用 MOBAC 创建的 OSMDroid SQLite 瓦片源文件?【英文标题】:How to use MOBAC created OSMDroid SQLite tile source file offline? 【发布时间】:2012-11-29 10:09:20 【问题描述】:我一直在努力让自己的离线 Mobile Atlas Creator OSMDroid SQLite 地图与 OSMDroid 3.0.8 一起工作,但运气不好。这是漫长的3天。我将尝试用我的应用程序中的剪辑进行解释。我一直在扩展 ItemizedIconOverlay 和 OverlayItem,所以我希望它不会变得太混乱。
我创建了我自己的 OSMDroid SQLite 地图文件,该文件具有 3 种不同的缩放级别,用于一个小区域,例如 10 平方公里。我将生成的“base.sqlite”文件复制到我的项目 /res/raw/ 目录中。请注意,我的应用程序中的 GeoPoints 应该在地图的瓦片范围内。 “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);
【问题讨论】:
我在这里开了一个案例:code.google.com/p/osmdroid/issues/… 【参考方案1】:好的!我知道我做错了什么,我现在一切正常! (我很兴奋 :)
首先,我在将原始资源映射文件写入应用程序特定目录(例如 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 平铺图像格式。
此外,如果您的地图文件有任何问题,ArchiveFileFactory.getArchiveFile() 将捕获它们,甚至在 MapTileFileArchiveProvider 之前。
这是我的用法。只要尽一切努力正确设置您的 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 或包含了一个很好的离线地图示例,我会首先关注其他所有内容。
【讨论】:
谢谢!!我在 android Studio 中使用 osmdroid 4.2,这是我找到的最好的指南,现在我的离线地图可以工作了 :) 你能帮我解决这个问题吗?【参考方案2】:如果你想使用 sqlite db 你只需要改变
ArchiveFileFactory.getArchiveFile(this.getMapsSdCard())
到
MBTilesFileArchive.getDatabaseFileArchive(f)
f
是一个指向你的 sqlite 数据库的文件。
【讨论】:
以上是关于如何离线使用 MOBAC 创建的 OSMDroid SQLite 瓦片源文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过将地图切片图像保存到 sqlite 数据库来使用 osmdroid 实现离线地图?
在没有移动地图集创建器的情况下获取 osmdroid 的地图图块