我想在我的Android应用程序中使用Mapbox GL。这项服务即将发布,我有一个关于使用渲染器的棘手问题。
我喜欢渲染器本身,但我真的想在应用程序中使用我自己的地图数据(而不是Mapbox提供的数据和付费的数据)。例如,我想自己解析OpenStreetMaps数据,以某种方式自定义它,然后放入渲染器内部以在我的应用程序中显示它。
现在的问题是:在使用Mapbox GL时是否可以使用我自己的地图数据?或者它只能用于Mapbox数据?
提前感谢您的帮助。也许你知道其他任何做得好的解决方案吗?问题是,我想要矢量图块,而不是光栅图块。这个项目计划在以后为iOS开发..
答案 0 :(得分:8)
您可以将MapBox开源SDK与您自己的磁贴一起使用。适用于Android,iOS或Node.JS的Mapbox Native渲染器可直接用于MapBox.com平台之外托管的磁贴。
请参阅示例移动应用“OSM2VectorTiles”从自定义服务器加载矢量切片,或从嵌入式MBTiles本地加载。
诀窍是将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
答案 1 :(得分:2)
您可以使用自己的瓷砖。我尝试了两件事。生成我自己的Mapzen vector tiles(它们使用与Mapbox相同的格式)您也可以免费使用它们。这是他们的layer descriptions。这是非常耗费精力的工作。您需要拥有postgresql并将整个OSM PBF导出到数据库中,然后运行python服务器,该服务器从此数据库请求数据并呈现矢量切片。我认为这是为了渲染队列中的所有图块,因为每页需要几秒钟来渲染可见图块。查询DB服务器后,大部分时间都花在python上。 它的优点是你可以得到漂亮的瓷砖。它基本上拥有您需要的一切,但更难定制。例如,如果要为循环方式添加特定样式。您需要深入研究代码并更改几个查询模板和许多其他内容。
然后我尝试了Tilemaker。这只是C ++程序,它读取OSM PBF转储和lua配置脚本(您指定要发送到tile中的标记)并吐出mapbox tile。它的优点是设置和自定义更容易,并且所有图块一次渲染。但是创建漂亮的瓷砖更难。 (AKA加载所有不同的高速公路标签都是不同类型的道路。由您来指定,但这已经在之前提到的Mapzen和Mapbox中有效。)
例如kind in Mapzen roads layer在mapzen中已经处理过了,但是在tilemaker中,您可以编写所有将不同OSM标记中的道路类型转换为图层的条件。并且它在土地利用标签中变得更加复杂,因为种类是:
土地利用,休闲,自然,公路,航空和舒适性OSM标签,或城市区域和公园或自然地球保护区的组合。
当然,你可以拥有完全不同的标签,但很高兴有一个可以告诉你正在看什么土地的标签。
你知道Mapbox,mapzen你的自定义mapbox tile都使用相同的格式,但每个都有不同的标签。所以你为一个人创造的风格可能不会为另一个人工作。
对于创建样式,您可以使用Mapbox Studio(但可能没用,因为它目前处于公开测试状态,我不确定您是否可以在那里指定自己的图块。)
我使用Mapbox codeflow,它基本上是带有gulp脚本的nodejs服务器,当样式文件发生变化时,它会使用地图重新加载网站。除了JSON之外,它还支持在toml,JSON5和yml中编写样式。它也很好地显示错误。 (只缺少行号)目前它支持样式的第7版,但目前只有8个。为了获取错误的行号,我使用了Mapbox GL style spec,它也可以将样式更新为新版本。 您也可以尝试Glug这是一种不同的样式语言,它编译为Mapbox GL样式。它更紧凑。
对于使用瓷砖,您还可以使用mb-util创建mbtiles并使用它们。
答案 2 :(得分:0)
如果您正在运行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")) {}