我认为你的假设是正确的。MapBox 似乎确实希望您使用他们的 API 和 API 密钥。
但是,如果您可以回退到光栅图块,则可以使用部分解决方案。或者您可以从 OSM 数据而不是从 mapbox 服务器获取矢量 mbtiles。
mapbox 离线支持 android/ios
我在 2017 年 4 月联系了 mapbox 支持,我被告知虽然您可以从 MapBox studio 下载的样式文件不包含图块,但有一种方法可以让它们在 Android/iOS 上离线渲染。
如果您想离线使用 Mapbox 地图,您需要按照适用于 Android 或 iOS 的示例进行操作,具体取决于您的平台。本质上,移动 SDK 接收指向您在 Mapbox Studio 中创建的自定义样式的样式 URL,并且 SDK 处理保持地图离线所需的所有其他资源(字体、图标、图块集等)的下载。查看我们的离线地图指南,了解更多有关其工作原理的信息。
链接:
快速浏览一下示例代码,图块的下载似乎是在应用程序内完成的,但提前完成了,例如在您安装应用程序之后,您仍然有网络连接。关于您的计费问题,我没有立即看到您的 Mapbox API 密钥是否完全包含在此下载中。每个离线区域有 6000 个离线磁贴限制。
不适用于桌面:该网站还提到离线不是 MapboxGl-JS 的选项,因此您必须破解它才能使您的离线区域在桌面网络浏览器上可用。
mapbox studio 导出为 mbtiles...
据说设置中有一个不明显的选项可以将您的源下载为 mapbox studio classic中的 mbtiles 文件。github 上的一个mapbox 经典问题有一个按钮应该在哪里的屏幕截图。现在这个选项可能已经消失了。
该 github 项目https://github.com/klokantech/vector-tiles-sample提供了项目/工具的链接,这些项目/工具可以将 mbtiles 文件分解为其包含的 pbf 文件,这些文件是每个矢量瓦片的 protobuf 压缩格式(https ://github.com/mapbox/mbutil)。略显陈旧。
一种可能有效的方法是提前缓存从 MapBox 检索到的每个图块的网络请求,然后在您的 APP 中代理对缓存的请求。我不确定这是否违反 ToS。您可能必须以编程方式使用您希望缓存的所有 XYZ 坐标进行操作。
与tippecanoe一起潜水以产生矢量瓷砖
您可以使用tippecanoe 创建矢量图块(并自己托管)。这不是 MapBox,我知道。但从长远来看,它可能会让你走得更远。
关于它的简短博客文章:http: //fuzzytolerance.info/blog/2017/02/02/Making-your-own-tiles-with-Tippecanoe/
您创建的mbtiles,您可以将它们分层,并可能使用开源maputnik(有点像mapbox的样式编辑器)对它们进行样式设置。然后你用你自己的服务器来服务 mbtiles,并将你的样式插入到mapboxGL-js或 openlayers 中。
TileMill -- (.mbtiles with raster tiles) 后备
TileMill 仍然可用(但已弃用),在桌面上运行,并允许您从 shapefile 创建地图(例如,您可以在https://mapzen.com/data/metro-extracts获取单个城市的 openstreetmap shapefile /)。
TileMill 会在流程结束时为您提供一个 mbtiles 文件。虽然,mbtiles 包含光栅图块,而不是矢量图块。矢量瓷砖可以动态设置样式,因此当您想要使用字体适应各种情况或调整照明时,它在移动设备上非常有用。
光栅图块可能就足够了,因为在您的应用程序中,您可能能够在该基础层之上渲染其他交互式对象。OpenLayers 是一种可移植的框架,您可以在其中执行此操作,例如,允许用户绘制对象或单击您从数据库中加载的与地图数据分开的兴趣点。
获取基于 OSM 的矢量图块而不是 mapbox
现在似乎有一个矢量瓦片的替代制造商, http: //openmaptiles.org(以前是http://osm2vectortiles.org)。
你可以去这里,为你选择的城市下载一个 mbtiles 文件,例如:https://openmaptiles.org/downloads/#city,然后使用磁贴服务器为你的应用程序提供该文件(本地)。(或使用上述工具之一将其分解为单独的 pbf 文件并从本地磁盘/内存中读取文件)
通过这种方法,您可以将来自 OSM 的矢量 mbtiles 与您在 mapbox studio 中创建的样式(mapbox studio 允许您下载包含 .json 样式的 zip 文件)相结合,您仍然可以使用 MapBoxGL 来显示它。
有 Maputnik http://maputnik.com/,您可以使用它来编辑 mapboxgl 样式文件(编辑器与本地存储一起使用)。并且大概有https://github.com/boundlessgeo/ol-mapbox-style允许您将该样式转换为适合 OpenLayer 样式 API 的一段代码。