并非所有mapbox.com的服务在中国提供
Android 地图 SDK
并非所有mapbox.com的服务在中国提供
翻译:王荣 审阅:唐立
Android 版 Mapbox Maps SDK 允许完全自定义地图外观。您可以选择一个由我们制图团队设计的 Mapbox 核心样式,也可以通过调整地图的颜色、图标和字体来设置适合您的应用程序界面或公司品牌的地图样式。
自定义地图外观的方式有两种:使用 Mapbox Studio 创建自定义地图样式并将其加载到您的应用程序中,或在运行时使用 Android 版 Maps SDK 更新地图要素。
通过实时运行样式,您可以动态更改地图样式和观感。例如:基于一天中的不同时段调整地图明暗、根据用户活动更改个性化图标和地图颜色、动态切换语言、或根据用户喜好放大标签以提高可读性。
一个Style
对象是指在您的应用程序中使用的 Mapbox 地图样式。数据源、图层和图像通过地图样式显示在地图上,因此它们是通过 Style 对象添加和检索的,而不是将它们添加到实际的MapboxMap对象中。
首先必须创建一个Style
对象并将其分配给地图,地图才能正确显示。使用以下方法创建一个Style
对象:
Style
类常量中找到的默认Mapbox样式asset://
或path://
使用原始样式的JSON字符串或引用样式JSON如果无法加载样式或设置了无效的样式网址,则地图视图将变为空白。系统将在 Android logcat 中记录一条错误消息,同时MapView.OnDidFailLoadingMapListener
回调将被触发。
如果您需要加载全新的地图样式,则必须以编程方式更改地图样式URL。调用mapboxMap.setStyle()
并把样式URL作为参数。
mapboxMap.setStyle(new Style.Builder().fromUri(uniqueStyleUrl), new Style.OnStyleLoaded() { @Override public void onStyleLoaded(@NonNull Style style) { // Custom map style has been loaded and map is now ready }});
mapboxMap.setStyle(Style.Builder().fromUri(uniqueStyleUrl)) { // Custom map style has been loaded and map is now ready }
除了强大的自定义地图样式功能外,Mapbox 还提供了六种专业设计的地图样式:
Maps SDK 的Style
类具有private static final String
默认的 Mapbox 样式 URL。当您需要通过setStyle()
方法或其他方式传递样式 URL 时,可以在项目中方便地引用这些样式。例如:
mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() { @Override public void onStyleLoaded(@NonNull Style style) { // Custom map style has been loaded and map is now ready }});
mapboxMap.setStyle(Style.MAPBOX_STREETS) { // Custom map style has been loaded and map is now ready }
检索地图图层是实时调整地图视觉外观的第一步。每个地图样式都包含大量地图图层,每个图层都有一个 ID。在专业设计的 Mapbox 街道(Mapbox Streets)
样式中,图层有这样一些 ID:土地利用(landuse)
, 居名地(settlement-label)
, 自然点(natural-point-label)
, 和 建筑(building)
。
mapboxMap.getStyle(new Style.OnStyleLoaded() { @Override public void onStyleLoaded(@NonNull Style style) { Layer singleLayer = style.getLayer(UNIQUE_LAYER_ID); }});
mapboxMap.getStyle { val singleLayer = it.getLayer(UNIQUE_LAYER_ID) }
您可以在 Mapbox Studio 中查看地图样式的图层 Z-index 顺序和图层 ID。查看该信息的另一种方法是将地图加载到设备后,将每个图层 ID 打印到 Android logcat。
mapView.getMapAsync(new OnMapReadyCallback() {@Override public void onMapReady(@NonNull final MapboxMap mapboxMap) { mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() { @Override public void onStyleLoaded(@NonNull Style style) { for (Layer singleLayer : style.getLayers()) { Log.d(TAG, "onMapReady: layer id = " + singleLayer.getId()); } } }); }});
mapView?.getMapAsync { mapView?.getMapAsync { mapboxMap -> mapboxMap.setStyle(Style.MAPBOX_STREETS) { for (singleLayer in it.layers) { Log.d(TAG, "onMapReady: layer id = " + singleLayer.id) } } }}
有了单独的地图图层后,您就可以使用数据驱动样式(data-driven styling ) 和 表达式(expressions) 来调整图层的属性。例如,以下是用实时运行样式将水系(water)
图层的蓝色更改为更深的蓝色的实例:
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mapboxMap.getStyle(new Style.OnStyleLoaded() { @Override public void onStyleLoaded(@NonNull Style style) { Layer waterLayer = style.getLayer("water"); if (waterLayer != null) { waterLayer.setProperties(PropertyFactory.fillColor(Color.parseColor("#004f6b"))); } } }); }});
button.setOnClickListener { mapboxMap.getStyle { val waterLayer = it.getLayer("water") waterLayer?.setProperties(PropertyFactory.fillColor(Color.parseColor("#004f6b"))) }}
更改地图样式会触发“地图事件”。阅读地图更改事件文档 以获取更多有关地图事件的信息、以及如何在地图样式加载完成后显示或重新显示数据的方法。