Mapbox GL使用外部地图



我想在我的Android应用程序中使用Mapbox GL。这个服务即将发布,我有一个关于使用渲染器的棘手问题。

我喜欢渲染器本身,但我真的想在应用程序中使用我自己的地图数据(而不是由Mapbox提供的付费数据)。例如,我想自己解析OpenStreetMaps数据,以某种方式定制它,然后放入渲染器中以在我的应用程序中显示它。

现在的问题:是否有可能使用我自己的地图数据,而使用Mapbox GL?或者它只能与Mapbox数据一起使用?

提前感谢您的任何帮助。也许你知道其他解决这个问题的好方法吗?问题是,我想要矢量贴图,而不是栅格贴图。并且这个项目计划以后针对iOS进行开发。

您可以使用MapBox开源SDK与您自己的贴片。Android、iOS或Node.JS的Mapbox Native渲染器可以直接用于托管在MapBox.com平台之外的贴图。

查看示例移动应用"OSM2VectorTiles"从自定义服务器或本地嵌入的MBTiles加载矢量贴图。

  • Android: https://play.google.com/store/apps/details?id=com.klokantech.osm2vectortiles
  • iOS: https://itunes.apple.com/us/app/osm2vectortiles/id1089255502

技巧是将API中的style属性指向您自己的JSON样式文件-它从您自己的服务器请求矢量图。一个例子:见https://gist.github.com/klokan/3eee87899644f5d82b3946bf0cd1e176

查看项目http://www.openmaptiles.org/,在那里你可以下载OpenStreetMap制作的矢量贴图,或者查看这个项目的文档,了解如何生成你自己的自定义矢量贴图。

矢量贴图本身的托管在https://openmaptiles.org/docs/或https://gis.stackexchange.com/questions/125037/self-hosting-mapbox-vector-tiles上进行描述

你可能需要在某个地方托管资产(字体字形+精灵)和JSON样式本身-或者将它们直接嵌入到你的移动应用程序中。

如果你想在服务器上用相同的JSON样式栅格化矢量图块——用于兼容旧web客户端的web应用程序(传单,…)或用于静态地图或打印输出与你的移动应用程序地图相同的外观,你可以检查https://github.com/klokantech/tileserver-gl

您可以使用自己的tile。我尝试了两件事。生成我自己的Mapzen矢量贴图(它们使用与Mapbox相同的格式),你也可以免费使用它们。下面是它们的图层描述。这是相当密集的工作。你需要postgresql和加载整个OSM PBF导出到数据库中,然后你运行python服务器请求数据从这个数据库和渲染矢量图。我认为这意味着在队列中呈现所有的瓷砖,因为每个页面需要几秒钟来呈现可见的瓷砖。大部分时间都花在查询DB服务器之后的python上。它的优点是你可以得到漂亮的瓷砖。它基本上有你需要的一切,但要定制要困难得多。例如,如果您想要添加特定样式的循环方式。你需要深入代码,修改几个查询模板和许多其他东西。

然后我尝试了瓷砖制造商。这只是一个c++程序,它读取OSM PBF转储和lua配置脚本(在其中您指定要发送什么标签到tile)并吐出mapbox tile。它的优点是更容易设置和自定义,并且所有的贴图都是一次呈现的。但是制作精美的瓷砖就更难了。所有不同的高速公路标签都是不同类型的道路。这取决于您的指定,但这已经在前面提到的Mapzen和Mapbox中起作用了。

例如Mapzen道路层中的kind在Mapzen中这已经被处理好了,但是在tilemaker中,你需要将所有从不同OSM标签中获得道路类型的条件写进一个层中。在土地使用标签中变得更加复杂因为kind是:

土地利用、休闲、自然、高速公路、航空和便利设施OSM标签的组合,或城市地区和公园或自然土地保护区。

当然,你可以有完全不同的标签,但最好有一个告诉你你正在看的土地用途。

你需要知道Mapbox, mapzen你的自定义Mapbox瓷砖都使用相同的格式,但每个将有不同的标签。因此,您为其中一个创建的样式可能不适用于另一个。

对于创建样式,您可以使用Mapbox Studio(但可能是无用的,因为它目前处于公测阶段,我不确定您是否可以在那里指定自己的瓷砖)。

我使用Mapbox codeflow,这基本上是nodejs服务器与gulp脚本,重新加载网站与地图时,风格文件的变化。除了JSON之外,它还支持toml、JSON5和yml的编写风格。它还能很好地显示错误。(只有行号丢失)目前它支持样式的版本7,但8目前已经出来了。为了获得行数错误,我使用了Mapbox GL样式规范,它也可以将样式更新到新版本。你也可以尝试Glug,这是一种不同风格的语言,它编译成Mapbox GL风格。它更紧凑一些。

对于使用tile,您还可以使用mb-util创建mbtiles并使用它们。

如果你有一个正在运行的Tileserver GL,它就像从mapbox的示例应用程序中更改以下行一样简单:

mapboxMap.setStyle(Style.MAPBOX_STREETS) {
        // Map is set up and the style has loaded. Now you can add data or make other map adjustments.
        }

mapboxMap.setStyle(Style.Builder().fromUri("https://maps.somedomain.com/styles/awesome_style/style.json")) {}

最新更新