如何在Android中使用OSM数据为单个城市实施离线地理编码器?

时间:2012-01-13 11:28:18

标签: android geocoding openstreetmap reverse-geocoding osmdroid

我正在尝试开发一个使用特定缩放级别的OSM地图图块的离线Android地图。为此,我使用了一个开源库:Osmdroid

现在,我正在研究为可以与我的应用程序集成的单个城市创建离线地理编码/反向地理编码的可能性,

我可以将Osm xml数据用于此目的吗?如果是这样,那么任何人都可以建议/解释如何使用它来创建SQlite数据库..以便与我的应用程序一起使用

我阅读了关于Spatialite的herealso here 但不太了解其工作和实施

谢谢

2 个答案:

答案 0 :(得分:1)

使用Skobbler SDK,您可以使用离线地图和(反向)地理编码。

答案 1 :(得分:0)

这里有一个答案 https://stackoverflow.com/a/64811929/13794189

操作如下:

要在离线模式下使用开放街道地图(OSM),您需要首先实现一个下载管理器,就像在下面的波纹管中所示的那样。它具有恢复功能,非常适合大型文件:

https://stackoverflow.com/a/64811752/13794189

接下来,您可以像这样将下载的OSM地图文件加载到mapView中:

     org.osmdroid.config.IConfigurationProvider osmConf = org.osmdroid.config.Configuration.getInstance();
    File basePath = new File(SessionData.offlineMapsDirectoryPath, "osmdroid");
    osmConf.setOsmdroidBasePath(basePath);
    File tileCache = new File(SessionData.offlineMapsDirectoryPath, "tile");
    osmConf.setOsmdroidTileCache(tileCache);

    map = (MapView) getActivity().findViewById(R.id.map);  // create basic map
    //map.setTileSource(TileSourceFactory.DEFAULT_TILE_SOURCE);
    map.setTilesScaledToDpi(true);
    map.setMultiTouchControls(true);
    map.setUseDataConnection(false);

    // add compass to map
    //CompassOverlay compassOverlay = new CompassOverlay(getActivity(), new InternalCompassOrientationProvider(getActivity()), map);
    //compassOverlay.enableCompass();
    //map.getOverlays().add(compassOverlay);

    //attach listeners
    MapEventsOverlay mapEventsOverlay = new MapEventsOverlay(this);
    map.getOverlays().add(0, mapEventsOverlay);

在上面的代码中,SessionData.offlineMapsDirectoryPath是保存下载文件的路径。

不要忘记在gradle文件中添加以下实现:

implementation 'org.osmdroid:osmdroid-android:6.1.0'
implementation 'com.github.MKergall:osmbonuspack:6.6.0'