并非所有mapbox.com的服务在中国提供
Android 地图 SDK
并非所有mapbox.com的服务在中国提供
您可以使用运行时样式 Runtime styling,实时动态更改地图的外观。比如,根据当天内的时间使地图变亮或变暗,根据用户的活动来个性化公园的图标和颜色,或根据用户偏好,动态切换语言或调整标签大小以提高易读性。设置现有地图数据的样式或混合进自己的地图数据 - 即使对于海量数据集,运行时样式也很有效。
运行时样式依靠 Mapbox Studio 的设计能力而扩展,并直接向我们的 SDK 的移动开发者公开所有相同的属性和特性。
如果您希望快速地在地图上添加简单标注,可能需要使用标注。
数据源保存着要在地图中使用的图层所需的数据。Mapbox 支持很多不同的数据源类型,根据您的数据类型选择一个数据源类型。添加数据源不会立即使数据显示在地图中,因为数据源没有包含颜色或宽度之类的样式细节。图层引用一个源并对其进行视觉呈现。
创建新数据源时,需要两个参数:源 ID(字符串)和源日期。
矢量源切片必须用 Mapbox 矢量切片格式。所有使用矢量源的图层都必须指定source-layer
值。对于由 Mapbox 托管的矢量切片,url
值应为 Mapbox://mapid
形式。
// 添加矢量源图层VectorSource vectorSource = new VectorSource("vector-source", "mapbox://mapbox.mapbox-terrain-v2");mapboxMap.addSource(vectorSource);
如果栅格数据源切片为 TileJSON 格式,可以将其添加到您的地图。如果由 Mapbox 托管,url
值应为 mapbox://mapid
形式。
// 添加栅格数据源图层RasterSource rasterSource = new RasterSource("raster-source", "mapbox://mapbox.u8yyzaor");mapboxMap.addSource(rasterSource);
可以用几种不同方式添加 GeoJSON 源。您可以提供在线托管的 GeoJSON 原始数据的 URL,提供指向在应用的assets
资源文件夹中本地托管的 GeoJSON 文件的链接,也可以直接在代码内构建自己的 GeoJSON 要素集合。以下代码片段显示向地图中添加 GeoJSON 源的不同方法。
从 URL 添加 GeoJSON 源:
URL geoJsonUrl = new URL("https://url-to-geojson-file.geojson");GeoJsonSource geoJsonSource = new GeoJsonSource("geojson-source", geoJsonUrl);mapboxMap.addSource(geoJsonSource);
加载本地存储的 GeoJSON 文件。请使用以下找到的 loadJsonFromAsset()
方法或在 JSON 文件中使用自己的首选加载方式:
private String loadJsonFromAsset(String nameOfLocalFile) throws IOException { InputStream is = getAssets().open(nameOfLocalFile); int size = is.available(); byte[] buffer = new byte[size]; is.read(buffer); is.close(); return new String(buffer, "UTF-8");} GeoJsonSource source = new GeoJsonSource("geojson-source", loadJsonFromAsset("local_file.geojson"));mapboxMap.addSource(indoorBuildingSource);
创建 GeoJSON 要素集合,然后将其添加到您的地图:
// 创建列表来存储我们的线条坐标。List routeCoordinates = new ArrayList<Point>();routeCoordinates.add(Point.fromLngLat(-118.394391, 33.397676));routeCoordinates.add(Point.fromLngLat(-118.370917, 33.391142)); // 从坐标列表中创建 LineString,然后生成 GeoJSON FeatureCollection// 以便我们可以将该线条作为图层添加到地图。 LineString lineString = LineString.fromLngLats(routeCoordinates);FeatureCollection featureCollection = FeatureCollection.fromFeatures(new Feature[]{Feature.fromGeometry(lineString)}); GeoJsonSource geoJsonSource = new GeoJsonSource("geojson-source", featureCollection);mapboxMap.addSource(geoJsonSource);
在 GeoJSON 源中拥有数据的好处是您可以随时对数据源进行更新、移除或添加要素,提供解决方案来通过运行时样式 API 在地图中对数据进行动画处理。例如,通过 Android ValueAnimator,您可以通过更新 GeoJSON 数据中的坐标来移动要素。
ImageSource
允许在地图上显示地理信息的栅格图像。地理信息的栅格图像在用户缩放和旋转地图时会发生缩放和旋转。LatLngQuad
随附的栅格图像内容的地理位置可能是非轴对齐的。
// 设置图像四个角的纬度和经度坐标LatLngQuad quad = new LatLngQuad( new LatLng(46.437, -80.425), new LatLng(46.437, -71.516), new LatLng(37.936, -71.516), new LatLng(37.936, -80.425)); mapboxMap.addSource(new ImageSource(ID_IMAGE_SOURCE, quad, R.drawable)); // Add layerRasterLayer layer = new RasterLayer(ID_IMAGE_LAYER, ID_IMAGE_SOURCE);mapboxMap.addLayer(layer);
setImage()
方法是通过传入可绘制项来更新 ImageSource
图像的一种简便方法。
mapboxMap.getSource(ID_IMAGE_SOURCE)).setImage(R.drawable.image_to_use)
可能会出现这样情况,即您可能要绘制一个不符合标准的Point
、LineString
、Polygon
、MultiPoint
、MultiLineString
和 MultiPolygon
GeoJSON 几何图形的形状。CustomGeometrySource
可以帮助您实现此目标。
CustomGeometrySource source = new CustomGeometrySource(ID_GRID_SOURCE, GeometryTileProvider);mapboxMap.addSource(source);
CustomGeometrySource
用法的一个示例是在地图顶端创建一个黑色网格。可以在 Maps SDK for Android 测试应用程序的 GridSourceActivity
中找到该示例的代码。
RasterDemSource
目前支持 Mapbox 地形 RGB(mapbox://mapbox.terrain-rgb)和 Mapzen Terrarium 切片格式。
Mapbox 地形切片集用于将丘陵地形添加到任何 Mapbox 地图。运行时样式也可用于更改山体外观。
RasterDemSource rasterDemSource = new RasterDemSource("source-id", "mapbox://mapbox.terrain-rgb");mapboxMap.addSource(rasterDemSource); // Create hillshade layer source to mapHillshadeLayer hillshadeLayer = new HillshadeLayer("hillshade-layer-id", "source-id").withProperties( hillshadeHighlightColor(Color.parseColor(HILLSHADE_HIGHLIGHT_COLOR)), hillshadeShadowColor(Color.BLACK)); // Add hillshade layer to mapmapboxMap.addLayer(hillshadeLayer);
数据源用于保存数据,而图层用于生成样式和显示信息。根据数据源的几何图形,提供若干图层类型。除了 background 背景类型的图层,每个图层都需要引用一个源。您可以(可选)筛选要素,然后定义如何生成这些要素的样式。
每一图层提供一个 setProperties
API,其可用于以多种不同方式为图层设置样式。请注意,建议使用数据驱动的样式来减少地图需要呈现的图层数,而不是根据源数据中的某些情况而创建不同的图层。
背景图层类型是唯一的,因为它不需要数据源。背景图层可以是纯色或某种图案。
BackgroundLayer backgroundLayer = new BackgroundLayer("background-layer");backgroundLayer.setProperties( PropertyFactory.backgroundColor(Color.BLUE));
多边形图层是有封闭形状的几何图形,可用于标记地图上的区域。几何图形类似于一个由一系列坐标组成的线图层。该特定顺序中,第一个和最后一个点具有相同坐标。
FillLayer fillLayer = new FillLayer("layer-id", "source-id");fillLayer.setProperties( PropertyFactory.fillColor(Color.GREEN));
若要在添加几何图形后更改形状,该图层可以保持而无需进行任何更改,只应更新其使用的数据源即可。该图层将始终显示其源内的最新更新。
可以组合一系列坐标来创建在地图上显示的线段。在每对坐标之间,创建一个线段,它被绘制为直线并连接两个点。
开始之前,您需要确保层将使用的源将lineStrings
作为其几何图形的一部分,在 GeoJSON 源部分中可以看到创建此项的示例。一旦创建源并将其添加到地图,就可以启动lineLayer
并且可以设置属性。
LineLayer lineLayer = new LineLayer("line-layer", "line-source"); // 我们线条的图层属性。这是我们使线成为虚线,设置颜色等操作之处。 lineLayer.setProperties( PropertyFactory.lineDasharray(new Float[]{0.01f, 2f}), PropertyFactory.lineCap(Property.LINE_CAP_ROUND), PropertyFactory.lineJoin(Property.LINE_JOIN_ROUND), PropertyFactory.lineWidth(5f), PropertyFactory.lineColor(Color.parseColor("#e55e5e"))); mapboxMap.addLayer(lineLayer);
符号图层用图标或文本标签来指示地图中的单个位置。与 GL Makrers 和 Marker Views 类似,符号层可以表示相同的数据,并为地图内显示提供最大支持。首先,我们将演示如何将标记图像添加到地图,然后将其显示为符号层。
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.my_marker_icon);mapboxMap.addImage("my-marker-image", icon); SymbolLayer symbolLayer = new SymbolLayer("layer-id", "source-id");symbolLayer.setProperties( PropertyFactory.iconImage("my-marker-image")); mapboxMap.addLayer(symbolLayer);
符号图层不仅可以使用图像在地图上标记位置,还可以直接在地图上显示文本。文本符号图层在与以上给出的图像片段类似的过程中完成,只有图层属性发生变化。
SymbolLayer selectedMarker = new SymbolLayer("selected-marker-layer", "selected-marker") .withProperties( PropertyFactory.textField("Mapbox"), PropertyFactory.textColor(Color.BLACK), PropertyFactory.textOpacity(0.5f) ); mapboxMap.addLayer(selectedMarker);
栅格图层通常是显示在基本地图切片上的图像的集合。虽然矢量切片是首选,但是卫星图像或传统地图样式呈现为栅格图层。
RasterSource rasterSource = new RasterSource("source-id", "mapbox://mapbox.u8yyzaor");mapboxMap.addSource(rasterSource); RasterLayer rasterLayer = new RasterLayer("layer-id", "source-id");mapboxMap.addLayer(rasterLayer);
RasterLayer
的一个常见用例是将一层卫星图层添加到地图中:
// 添加栅格源图层RasterSource satelliteRasterSource = new RasterSource("satellite-raster-source", "mapbox://mapbox.satellite",512);mapboxMap.addSource(satelliteRasterSource);
点图层有一个来自源数据的单中心坐标。它是地图上绘制的地球表面点图层的地理精确投影。提供了一些默认属性,但是在第一次创建图层时可以覆盖这些属性。
VectorSource vectorSource = new VectorSource("source-id", "mapbox://mapbox.2opop9hr");mapboxMap.addSource(vectorSource); CircleLayer circleLayer = new CircleLayer("layer-id", "source-id");circleLayer.setSourceLayer("museum-cusco");museumsLayer.setProperties( PropertyFactory.visibility(Property.VISIBLE), PropertyFactory.circleRadius(8f), PropertyFactory.circleColor(Color.argb(1, 55, 148, 179)));
数据源和图层不是不可改变,您可以在地图呈现期间随时予以修改。例如,若要在添加到地图后更改图层的填充色,请使用 mapboxMap
对象来获取图层并设置属性。
FillLayer fillLayer = (FillLayer) mapboxMap.getLayer("fill-layer-id");if (fillLayer != null) { fillLayer.setProperties( PropertyFactory.fillColor(Color.GREEN) );}
在 GeoJSON 源中,您可以像这样修改、添加、移除或替换 FeatureCollection:
GeoJsonSource geoJsonSource = (GeoJsonSource) mapboxMap.getSource("geojson-source-id");if (geoJsonSource != null) { geoJsonSource.setGeoJson(myFeatureCollection);}
图层不可单击,并且不会为您公开任何事件侦听器来处理用户输入。相反,我们提供了单独的文档,来介绍地图查询功能,讨论对用户何时单击填充图层内的多边形如何进行检测(举例)。