Mapbox GL 使用外部地图

Posted

技术标签:

【中文标题】Mapbox GL 使用外部地图【英文标题】:Mapbox GL using external maps 【发布时间】:2015-10-07 20:46:00 【问题描述】:

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

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

现在的问题是:在使用 Mapbox GL 时是否可以使用我自己的地图数据?还是只能与 Mapbox 数据一起使用?

提前感谢您的帮助。也许您知道针对此问题的任何其他完善的解决方案?问题是,我想要矢量图块,而不是光栅图块。并且这个项目计划以后为ios开发..

【问题讨论】:

【参考方案1】:

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

查看示例移动应用“OSM2VectorTiles”,从自定义服务器或本地嵌入式 MBTiles 加载矢量切片。

安卓: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 客户端(Leaflet、...)兼容的 Web 应用程序,或者用于静态地图或具有与您相同外观和感觉的打印输出手机应用地图,可以查看https://github.com/klokantech/tileserver-gl

【讨论】:

您能否提供更多信息,什么是使用嵌入式 MBTiles 的正确方法? 完整的源代码展示了如何在 iOS 和 Android 上将嵌入式 MBTiles 与 Mapbox SDK 一起使用,现在可在以下位置获得:openmaptiles.com/mobile-app【参考方案2】:

您可以使用自己的图块。我尝试了两件事。生成我自己的Mapzen vector tiles(它们使用与 Mapbox 相同的格式)您也可以免费使用它们。这是他们的layer descriptions。这是一项工作量很大的工作。您需要拥有 postgresql 并将整个 OSM PBF 导出加载到数据库中,然后运行 ​​python 服务器,该服务器从该数据库请求数据并呈现矢量切片。我认为这是为了渲染队列中的所有图块,因为每页需要几秒钟来渲染可见图块。查询数据库服务器后,大部分时间都花在了python上。 它的优点是你可以得到漂亮的瓷砖。它基本上拥有你需要的一切,但更难定制。例如,如果您想为自行车道添加特定样式。您需要深入研究代码并更改几个查询模板和许多其他内容。

然后我尝试了Tilemaker。这只是一个 C++ 程序,它读取 OSM PBF 转储和 lua 配置脚本(您可以在其中指定要发送到瓦片的标签)并吐出 mapbox 瓦片。它的优点是设置和自定义更容易,并且所有图块都可以立即渲染。但是创建漂亮的瓷砖更难。 (AKA 加载所有不同的高速公路标签都是不同类型的道路。由您指定,但这已经在前面提到的 Mapzen 和 Mapbox 中有效)。

例如kind in Mapzen roads layer 在 mapzen 中,这已经被处理了,但在 tilemaker 中,您可以将所有从不同 OSM 标签获取道路类型的条件写入图层。而且它在土地使用标签中变得更加复杂,因为 kind 是:

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

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

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

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

我使用了Mapbox codeflow,它基本上是带有 gulp 脚本的 nodejs 服务器,当样式文件更改时,它会使用地图重新加载站点。除了 JSON 之外,它还支持 toml、JSON5 和 yml 的编写样式。它还可以很好地显示错误。 (仅缺少行号)目前它支持第 7 版的样式,但目前已推出 8 版。为了获取错误的行号,我使用了Mapbox GL style spec,它也可以将样式更新到新版本。 你也可以试试Glug,这是一种不同的风格语言,可以编译成 Mapbox GL 风格。它更紧凑一些。

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

【讨论】:

是否有人维护一组样式(或任何资源)以在 mapbox 和 mapzen 矢量图块之间切换? (这与任何版权/其他问题有冲突吗?) Mapzen 的 api 似乎更灵活,我刚刚开始探索他们的瓷砖样式,但目前我想避免的似乎是相当多的工作- - 特别是如果有人已经这样做了。谢谢! 最近我发现OSM2vector 维护了逆向工程的mapbox 样式。它也是 GitHub 上的一个开源项目。唯一的问题似乎是它的图块比 MapBox 落后 2 个版本。【参考方案3】:

如果您有一个正在运行的 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")) 

【讨论】:

以上是关于Mapbox GL 使用外部地图的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Mapbox Mapmatching API 输出与 mapbox-gl-js 一起使用?

通过 mapbox gl js 向 mapbox 中的地图添加一些基本标记

MapBox GL 地图页面保存为图片的方法

mapbox.gl源码解析——基本架构与数据渲染流程

Mapbox-GL setStyle 移除图层

Mapbox GL JS:将地图导出为 PNG 或 PDF?