展示离线OSM地图文件。建议:使用具有Js.library的MB Tiles文件。

8
当无法在线访问互联网时,我希望(离线)HTML5应用程序能够通过OSM文件显示OSM地图。
你能否举个例子,如何在离线Html5应用程序中显示从离线OSM地图文件(例如Mapsforge / Geofabrik等)加载的OSM瓦片?
例如:通过openstreetmap.org,我首先导出了地图的一小部分。如何在Html5离线webapp中显示这个下载的OSM地图。

你的问题的答案是“是的”。请更具体地说明,你尝试过什么?你考虑过哪些解决方案? - IvanSanchez
我还没有找到一个好的解决方案。我希望有一个标准的解决方案,比如使用leafletjs和Mapforge文件。你有一个可行的解决方案吗? - tm1701
2个回答

5
是的,可以在Leaflet或任何其他地图库中实现此功能。您需要将OSM文件转换为一组瓷砖,然后将瓷砖图层指向本地存储的文件(相对路径)。或者如果可能的话(我不熟悉OSM规则),您可以下载您所在区域的瓦片集。
如果您需要将OSM文件转换为瓦片,请尝试使用Maperative和其tile generator等工具。
您还可以尝试此链接中列出的方法:http://wiki.openstreetmap.org/wiki/Creating_your_own_tiles
一旦您拥有了自己的瓷砖,就设置属性目录结构,并将瓷砖图层指向它。
以下是使用Leaflet的示例:
// the path may be different depending on how you have the tiles saved.
// you will have to define the options object

new L.tileLayer('/tiles/{z}/{x}/{y}.png', {}).addTo(map);

请记住,文件路径是相对的,您可能需要确保为自定义瓷砖正确设置了约束条件。

3

如何使用Leaflet显示地图?默认情况下,Leaflet使用光栅图像。通常这些瓦片是通过互联网检索的。

如何使用离线文件显示地图?例如,因为没有互联网连接?

  1. 层级结构中的本地瓷砖。例如,使用以下脚本。缺点是这不是一个紧凑的格式。它需要一些准备工作:

    L.tileLayer('/map-tiles/{z}/map_{x}_{y}.png', { attribution: '地图数据 © ???', }).addTo(map);

  2. 包含栅格瓷砖的MBTiles文件。可以通过Leaflet.TileLayer.MBTiles.js插件显示此类文件。以下是示例脚本。

  3. VectorGrid是从MBTiles文件中读取矢量数据的紧凑候选项。另请参见说明

  4. Mapbox GL JS离线。在这种情况下,您将本地放置矢量文件。请参见演示

  5. 如@JaakL所建议的mobac.sourceforge.net。

广告选项3:OpenMapTiles.com生成非常紧凑的矢量格式MBTiles文件。因此,此解决方案对于选项3非常有用。

广告选项2:当您拥有MBTILES / Raster文件时,以下代码将正常工作。因此,它无法与上述MBTiles矢量文件一起使用。

在使用npm安装该软件包约1分钟后,我运行了演示。演示位于“node_modules \ Leaflet.TileLayer.MBTiles \ demo”文件夹下。效果很好。

然后我尝试显示阿姆斯特丹地图。不幸的是,我无法使其正常工作(作为新手)。我正在为POC调查此问题。

我该如何更新这个源代码以显示阿姆斯特丹地图?完成此操作将获得50加仑奖励。
<!DOCTYPE html>
<html>
<head>
<link href="https://unpkg.com/leaflet@1.0.0/dist/leaflet.css" rel="stylesheet" type="text/css" />
<script src="https://unpkg.com/leaflet@1.0.0/dist/leaflet-src.js"></script>
<script src="https://unpkg.com/sql.js@0.3.2/js/sql.js"></script>
<script src="../Leaflet.TileLayer.MBTiles.js"></script>
  <meta charset="utf-8">
  <title>Leaflet.TileLayer.MBTiles demo</title>
  <style>
    #map {
      width:600px;
      height:400px;
    }
  </style>
</head>
<body>
  <div id='map'></div>
  <script>
    var map = new L.Map('map');
    map.setView(new L.LatLng(52.361367, 4.923083), 18);
    var mb = L.tileLayer.mbTiles('./amsterdam_netherlands.mbtiles', {
        minZoom: 16,
        maxZoom: 20
    }).addTo(map);
    mb.on('databaseloaded', function(ev) {
        console.info('MBTiles DB loaded', ev);
    });
    mb.on('databaseerror', function(ev) {
        console.info('MBTiles DB error', ev);
    });
  </script>
</body>
</html>

我认为您需要在本地提供mbtiles文件。请参考:https://github.com/chelm/mbtiles-server - Michael
1
我认为Leaflet.TileLayer.MBTiles插件期望栅格瓦片,而OpenMapTiles网站提供的是矢量瓦片。 - ghybs
@MichaelYang - 感谢你的建议(以及其他答案)。在移动设备上运行本地服务器有点过于繁重了。访问本地文件更佳。 - tm1701
@ghybs - tx。 有没有一个好的Leaflet插件可以从OpenMapTiles文件中读取mbtiles(矢量)? 或者有没有提供(免费)MBTiles作为栅格文件的服务器? - tm1701
1
恐怕目前没有好的Leaflet插件可以在移动设备上快速渲染矢量瓦片,以便于在移动设备上使用。这对于移动浏览器来说太难了。此外,我认为现在你可能已经找不到像样的免费栅格瓦片mbtiles数据包了,因为供应商(openmaptiles、CARTO等)的离线数据包是矢量的,并且用于本地移动客户端。然而,我建议去查看mobac.sourceforge.net - 使用它,您可以轻松地创建mbtiles(或其他格式)的栅格瓦片数据包。 - JaakL
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接