如何使用 android 中的 OSM 数据为单个城市实现离线地理编码器?

Posted

技术标签:

【中文标题】如何使用 android 中的 OSM 数据为单个城市实现离线地理编码器?【英文标题】:How can I implement an offline geocoder for a single city using OSM data in android? 【发布时间】:2012-02-09 14:45:45 【问题描述】:

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

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

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

我阅读了关于 Spatialite 的 here 和 also here 但不能完全理解它的工作和实现

谢谢

【问题讨论】:

你想从反向编码器中得到什么细节? 看看wiki.openstreetmap.org/wiki/Nominatim 请查看 [Mapsforge ](code.google.com/p/mapsforge) 项目。该项目提供了一个 android 库,用于从 OSM 数据中渲染离线地图。 【参考方案1】:

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

【讨论】:

CartoType (www.cartotype.com) 还提供离线地图、反向地理编码和地址搜索。【参考方案2】:

这里有答案 https://***.com/a/64811929/13794189

如下:

要在离线模式下使用 Open Street Maps (OSM),您需要首先实现一个下载管理器,如下面的帖子所示。它具有恢复功能,适用于非常大的文件:

https://***.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'

【讨论】:

以上是关于如何使用 android 中的 OSM 数据为单个城市实现离线地理编码器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android 应用程序中使用 OSM 地图。?有啥教程可以学习在android中使用OSM吗?

当我触摸地图android Osm时如何关闭infoWindow

Android OSM 机器人 - 设置最大缩放级别

在 WebGL 中的地图上(循环通过索引缓冲区)绘制单个多边形 - 建筑物、国家边界等

如何使用 OSM 判断某个坐标是不是在街道上?

如何在 OpenLayers 中将“正常”坐标转换为 OSM 坐标