MapBox Android版開(kāi)發(fā) 3 地圖樣式v9

前言

MapBox SDK允許自定義地圖的外觀煮纵》肆梗可以選擇地圖樣式式矫,也可以調(diào)整地圖的顏色、圖標(biāo)和字體來(lái)創(chuàng)建自定義地圖樣式预明。

有兩種方法自定義地圖的外觀:

  1. 使用Mapbox Studio創(chuàng)建自定義地圖樣式缩赛。
  2. 使用Android版Maps SDK在運(yùn)行時(shí)更新地圖功能,并可以動(dòng)態(tài)切換語(yǔ)言贮庞,調(diào)整標(biāo)簽大小以提高可讀性峦筒,根據(jù)一天中的時(shí)間調(diào)暗地圖,個(gè)性化圖標(biāo)和地圖顏色窗慎。

本文重點(diǎn)介紹MapBox默認(rèn)的樣式物喷,樣式相關(guān)的類和方法,以及如何動(dòng)態(tài)更新樣式并本地化語(yǔ)言遮斥。

MapBox樣式對(duì)比

風(fēng)格 常量 說(shuō)明 v9 v11
Mapbox Standard STANDARD A dynamic and performant 3D style that is the default for Mapbox maps. - standard
Mapbox Standard Satellite STANDARD_SATELLITE Combines updated satellite imagery and vector layers to offer users improved clarity and detail. - standard-satellite
Mapbox Streets MAPBOX_STREETS A complete base map, perfect for incorporating your own data. streets-v11 streets-v12
Outdoors OUTDOORS A general-purpose style tailored to outdoor activities. outdoors-v11 outdoors-v12
Light LIGHT Subtle light backdrop for data visualizations. light-v10 light-v11
Dark DARK Subtle dark backdrop for data visualizations. dark-v10 dark-v11
Satellite SATELLITE A beautiful global satellite and aerial imagery layer. satellite-v9 satellite-v9
Satellite Streets SATELLITE_STREETS Global satellite and aerial imagery with unobtrusive labels. satellite-streets-v11 satellite-streets-v12
Traffic Day TRAFFIC_DAY Color-coded roads based on live traffic congestion data. traffic-day-v2 traffic-day-v2
Traffic Night TRAFFIC_NIGHT Color-coded roads based on live traffic congestion data, designed to maximize legibility in low-light situations. traffic-night-v2 traffic-night-v2

主要類和方法

Style類

Style對(duì)象是指應(yīng)用程序中使用的Mapbox地圖樣式峦失。通過(guò)Style對(duì)象添加將SourceLayerImage添加到地圖上术吗。必須設(shè)置Style對(duì)象地圖才能正確顯示尉辑。如果樣式加載失敗或設(shè)置了無(wú)效樣式URL,地圖視圖將變?yōu)榭瞻捉嫌欤⒂|發(fā)MapView.OnDidFailLoadingMapListener回調(diào)隧魄。

地圖樣式是由多個(gè)組件組成的,其中最重要的是數(shù)據(jù)源 source 和圖層 layer隘蝎。

  • source 是地圖數(shù)據(jù)的來(lái)源购啄,定義地圖上顯示的數(shù)據(jù)類型和數(shù)據(jù)位置。
  • layer 是地圖樣式中的可視化組件嘱么,定義如何渲染數(shù)據(jù)源中的數(shù)據(jù)狮含。
  • 每個(gè)圖層都引用一個(gè)數(shù)據(jù)源,并指定如何將該數(shù)據(jù)源中的數(shù)據(jù)繪制到地圖上。
  • 一個(gè)數(shù)據(jù)源可以被多個(gè)圖層引用几迄,從而實(shí)現(xiàn)數(shù)據(jù)的復(fù)用和多層次的展示蔚龙。
  • 通過(guò)組合不同的數(shù)據(jù)源和圖層,可以創(chuàng)建出豐富多樣的地圖樣式映胁。

Style類成員變量

public class Style {

  static final String EMPTY_JSON = "{\"version\": 8,\"sources\": {},\"layers\": []}";

  private final NativeMap nativeMap;
  private final HashMap<String, Source> sources = new HashMap<>();
  private final HashMap<String, Layer> layers = new HashMap<>();
  private final HashMap<String, Bitmap> images = new HashMap<>();
  private final Builder builder;
  private boolean fullyLoaded;
  ......
}

Style類Layer方法

類型 方法 說(shuō)明
Layer getLayer(@NonNull String id) Get the layer by id
List< Layer > getLayers() Retrieve all the layers in the style
< T extends Layer > T getLayerAs(@NonNull String layerId) Tries to cast the Layer to T, throws ClassCastException if it's another type.
void addLayer(@NonNull Layer layer) Adds the layer to the map.
void void addLayerBelow(@NonNull Layer layer, @NonNull String below) Adds the layer to the map.
void addLayerAbove(@NonNull Layer layer, @NonNull String above) Adds the layer to the map.
void addLayerAt(@NonNull Layer layer, @IntRange(from = 0) int index) Adds the layer to the map at the specified index.
boolean removeLayer(@NonNull String layerId) Removes the layer
boolean removeLayer(@NonNull Layer layer) Removes the layer.
boolean removeLayerAt(@IntRange(from = 0) int index) Removes the layer.

默認(rèn)的MapBox樣式

/**
 * Indicates the parameter accepts one of the values from Style. Using one of these
 * constants means your map style will always use the latest version and may change as we
 * improve the style
 */
@StringDef({MAPBOX_STREETS, OUTDOORS, LIGHT, DARK, SATELLITE, SATELLITE_STREETS, TRAFFIC_DAY, TRAFFIC_NIGHT})
@Retention(RetentionPolicy.SOURCE)
public @interface StyleUrl {
}

public static final String MAPBOX_STREETS = "mapbox://styles/mapbox/streets-v11";
public static final String OUTDOORS = "mapbox://styles/mapbox/outdoors-v11";
public static final String LIGHT = "mapbox://styles/mapbox/light-v10";
public static final String DARK = "mapbox://styles/mapbox/dark-v10";
public static final String SATELLITE = "mapbox://styles/mapbox/satellite-v9";
public static final String SATELLITE_STREETS = "mapbox://styles/mapbox/satellite-streets-v11";
public static final String TRAFFIC_DAY = "mapbox://styles/mapbox/traffic-day-v2";
public static final String TRAFFIC_NIGHT = "mapbox://styles/mapbox/traffic-night-v2";

OnStyleLoaded 接口

/**
 * Callback to be invoked when a style has finished loading.
 */
public interface OnStyleLoaded {
  /**
   * Invoked when a style has finished loading.
   *
   * @param style the style that has finished loading
   */
  void onStyleLoaded(@NonNull Style style);
}

MapboxMap類

類型 方法 說(shuō)明
Style getStyle() Get the Style of the map.
void getStyle(@NonNull Style.OnStyleLoaded onStyleLoaded) Get the Style of the map asynchronously.
void setStyle(@Style.StyleUrl String style) Loads a new map style from the specified bundled style.
void setStyle(@Style.StyleUrl String style, final Style.OnStyleLoaded callback) Loads a new map style from the specified bundled style.
The callback to be invoked when the style has loaded
void setStyle(Style.Builder builder) Loads a new map style from the specified builder.
void setStyle(Style.Builder builder, final Style.OnStyleLoaded callback) Loads a new map style from the specified builder.
The callback to be invoked when the style has loaded

獲取樣式

/**
 * Get the Style of the map asynchronously.
 */
public void getStyle(@NonNull Style.OnStyleLoaded onStyleLoaded) {
  if (style != null && style.isFullyLoaded()) {
    onStyleLoaded.onStyleLoaded(style);
  } else {
    awaitingStyleGetters.add(onStyleLoaded);
  }
}

/**
 * Get the Style of the map.
 * <p>
 * Returns null when style is being loaded.
 * </p>
 *
 * @return the style of the map
 */
@Nullable
public Style getStyle() {
  if (style == null || !style.isFullyLoaded()) {
    return null;
  } else {
    return style;
  }
}

通過(guò)Style.StyleUrl設(shè)置樣式

/**
 * Loads a new map style from the specified bundled style.
 * <p>
 * This method is asynchronous and will return before the style finishes loading.
 * If you wish to wait for the map to finish loading, listen to the {@link MapView.OnDidFinishLoadingStyleListener}
 * callback or use the {@link #setStyle(String, Style.OnStyleLoaded)} method instead.
 * </p>
 * If the style fails to load or an invalid style URL is set, the map view will become blank.
 * An error message will be logged in the Android logcat and {@link MapView.OnDidFailLoadingMapListener} callback
 * will be triggered.
 *
 * @param style The bundled style
 * @see Style
 */
public void setStyle(@Style.StyleUrl String style) {
  this.setStyle(style, null);
}

/**
 * Loads a new map style from the specified bundled style.
 * <p>
 * If the style fails to load or an invalid style URL is set, the map view will become blank.
 * An error message will be logged in the Android logcat and {@link MapView.OnDidFailLoadingMapListener} callback
 * will be triggered.
 * </p>
 *
 * @param style    The bundled style
 * @param callback The callback to be invoked when the style has loaded
 * @see Style
 */
public void setStyle(@Style.StyleUrl String style, final Style.OnStyleLoaded callback) {
  this.setStyle(new Style.Builder().fromUri(style), callback);
}

通過(guò)Style.Builder設(shè)置樣式

/**
 * Loads a new map style from the specified builder.
 * <p>
 * If the builder fails to load, the map view will become blank. An error message will be logged in the Android logcat
 * and {@link MapView.OnDidFailLoadingMapListener} callback will be triggered. If you wish to wait for the map to
 * finish loading, listen to the {@link MapView.OnDidFinishLoadingStyleListener} callback or use the
 * {@link #setStyle(String, Style.OnStyleLoaded)} instead.
 * </p>
 *
 * @param builder The style builder
 * @see Style
 */
public void setStyle(Style.Builder builder) {
  this.setStyle(builder, null);
}

/**
 * Loads a new map style from the specified builder.
 * <p>
 * If the builder fails to load, the map view will become blank. An error message will be logged in the Android logcat
 * and {@link MapView.OnDidFailLoadingMapListener} callback will be triggered.
 * </p>
 *
 * @param builder  The style builder
 * @param callback The callback to be invoked when the style has loaded
 * @see Style
 */
public void setStyle(Style.Builder builder, final Style.OnStyleLoaded callback) {
  styleLoadedCallback = callback;
  locationComponent.onStartLoadingMap();
  if (style != null) {
    style.clear();
  }

  style = builder.build(nativeMapView);
  if (!TextUtils.isEmpty(builder.getUri())) {
    nativeMapView.setStyleUri(builder.getUri());
  } else if (!TextUtils.isEmpty(builder.getJson())) {
    nativeMapView.setStyleJson(builder.getJson());
  } else {
    // user didn't provide a `from` component, load a blank style instead
    nativeMapView.setStyleJson(Style.EMPTY_JSON);
  }
}

Style.Builder

類型 方法 說(shuō)明
Builder fromUrl(@NonNull String url) Will loads a new map style asynchronous from the specified URL.
Builder fromUri(@NonNull String uri) Will loads a new map style asynchronous from the specified URI.
Builder fromJson(@NonNull String styleJson) Will load a new map style from a json string.
Builder withSource(@NonNull Source source) Will add the source when map style has loaded.
Builder withSources(@NonNull Source... sources) Will add the sources when map style has loaded.
Builder withLayer(@NonNull Layer layer) Will add the layer when the style has loaded.
Builder withLayers(@NonNull Layer... layers) Will add the layers when the style has loaded.
Builder withLayerAt(@NonNull Layer layer, int index) Will add the layer when the style has loaded at a specified index.
Builder withLayerAbove(@NonNull Layer layer, @NonNull String aboveLayerId) Will add the layer when the style has loaded above a specified layer id.
Builder withLayerBelow(@NonNull Layer layer, @NonNull String belowLayerId) Will add the layer when the style has loaded below a specified layer id.
Builder withTransition(@NonNull TransitionOptions transition) Will add the transition when the map style has loaded.
Builder withImage(@NonNull String id, @NonNull Drawable drawable) Will add the drawable as image when the map style has loaded.
Builder ...... ......

示例代碼

地圖樣式類

設(shè)置地圖樣式木羹,樣式加載完成后重新本地化地圖語(yǔ)言。

public class MapStyle {
    MapboxMap map;

    public MapStyle(MapboxMap map) {
        this.map = map;
    }

    public void changeStyle(String style) {
        map.setStyle(style, new Style.OnStyleLoaded() {

            @Override
            public void onStyleLoaded(@NonNull Style style) {
                // Custom map style has been loaded and map is now ready 
                setLanguage(style);
            }
        });
    }

    public void setLanguage(@NonNull Style style) {
        final String chinese = "{name_zh-Hans}";
        List<Layer> layers = style.getLayers();
        for (Layer layer : layers) {
            if (layer instanceof SymbolLayer) {
                SymbolLayer symbolLayer = (SymbolLayer) layer;
                String id = symbolLayer.getId();
                if (id.contains("-label")) {
                    symbolLayer.setProperties(textField(chinese));
                }
            }
        }
    }
}

界面布局

v9-0布局.png
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapViewActivity">

    <com.mapbox.mapboxsdk.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toTopOf="@id/bottomView"
        app:layout_constraintTop_toTopOf="parent"
        app:mapbox_cameraTargetLat="32.2857965"
        app:mapbox_cameraTargetLng="104.293174"
        app:mapbox_cameraZoom="2"
        app:mapbox_uiCompassGravity="start|top" />

    <HorizontalScrollView
        android:id="@+id/bottomView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/background_dark"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/mapView">

        <RadioGroup
            android:id="@+id/RadioGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="horizontal"
            android:paddingHorizontal="10dp">

            <RadioButton
                android:id="@+id/streets"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="true"
                android:onClick="setMapStyle"
                android:text="基礎(chǔ)"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <RadioButton
                android:id="@+id/satellite"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="setMapStyle"
                android:text="影像"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <RadioButton
                android:id="@+id/satelliteStreets"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="setMapStyle"
                android:text="影像標(biāo)簽"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <RadioButton
                android:id="@+id/outdoors"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="setMapStyle"
                android:text="戶外"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <RadioButton
                android:id="@+id/light"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="false"
                android:onClick="setMapStyle"
                android:text="淺"
                android:textColor="@color/white"
                android:textStyle="bold" />

            <RadioButton
                android:id="@+id/dark"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:checked="false"
                android:onClick="setMapStyle"
                android:text="深"
                android:textColor="@color/white"
                android:textStyle="bold" />

        </RadioGroup>
    </HorizontalScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

控件響應(yīng)事件

public void setMapStyle(View view) {
    boolean checked = ((RadioButton) view).isChecked();
    if (!checked)
        return;

    int id = view.getId();
    if (id == R.id.streets) {
        mapStyle.changeStyle(Style.MAPBOX_STREETS);
    } else if (id == R.id.satellite) {
        mapStyle.changeStyle(Style.SATELLITE);
    } else if (id == R.id.satelliteStreets) {
        mapStyle.changeStyle(Style.SATELLITE_STREETS);
    } else if (id == R.id.outdoors) {
        mapStyle.changeStyle(Style.OUTDOORS);
    } else if (id == R.id.light) {
        mapStyle.changeStyle(Style.LIGHT);
    } else if (id == R.id.dark) {
        mapStyle.changeStyle(Style.DARK);
    }
}

運(yùn)行效果圖

基礎(chǔ) 影像 影像+標(biāo)簽
v9-1基礎(chǔ).png
v9-2影像.png
v9-3影像標(biāo)簽.png
戶外
v9-4戶外.png
v9-5淺.png
v9-6深.png

附不同樣式中的圖層

查看地圖樣式的圖層Z索引順序和圖層ID屿愚。

樣式 圖層
Mapbox Streets land, landcover, national-park, landuse, pitch-outline, water-shadow, waterway, water, hillshade, land-structure-polygon, land-structure-line, aeroway-polygon, aeroway-line, building-outline, building, tunnel-street-minor-low, tunnel-street-minor-case, tunnel-primary-secondary-tertiary-case, tunnel-major-link-case, tunnel-motorway-trunk-case, tunnel-construction, tunnel-path, tunnel-steps, tunnel-major-link, tunnel-pedestrian, tunnel-street-minor, tunnel-primary-secondary-tertiary, tunnel-oneway-arrow-blue, tunnel-motorway-trunk, tunnel-oneway-arrow-white, ferry, ferry-auto, road-path-bg, road-steps-bg, turning-feature-outline, road-pedestrian-case, road-minor-low, road-street-low, road-minor-case, road-street-case, road-secondary-tertiary-case, road-primary-case, road-major-link-case, road-motorway-trunk-case, road-construction, road-path, road-steps, road-major-link, road-pedestrian, road-pedestrian-polygon-fill, road-pedestrian-polygon-pattern, road-polygon, road-minor, road-street, road-secondary-tertiary, road-primary, road-oneway-arrow-blue, road-motorway-trunk, road-rail, road-rail-tracks, level-crossing, road-oneway-arrow-white, turning-feature, golf-hole-line, bridge-path-bg, bridge-steps-bg, bridge-pedestrian-case, bridge-street-minor-low, bridge-street-minor-case, bridge-primary-secondary-tertiary-case, bridge-major-link-case, bridge-motorway-trunk-case, bridge-construction, bridge-path, bridge-steps, bridge-major-link, bridge-pedestrian, bridge-street-minor, bridge-primary-secondary-tertiary, bridge-oneway-arrow-blue, bridge-motorway-trunk, bridge-rail, bridge-rail-tracks, bridge-major-link-2-case, bridge-motorway-trunk-2-case, bridge-major-link-2, bridge-motorway-trunk-2, bridge-oneway-arrow-white, aerialway, admin-1-boundary-bg, admin-0-boundary-bg, admin-1-boundary, admin-0-boundary, admin-0-boundary-disputed, building-number-label, road-label, road-number-shield, road-exit-shield, golf-hole-label, waterway-label, natural-line-label, natural-point-label, water-line-label, water-point-label, poi-label, transit-label, airport-label, settlement-subdivision-label, settlement-label, state-label, country-label, com.mapbox.annotations.points
Satellite background, satellite, com.mapbox.annotations.points
Satellite Streets background, satellite, tunnel-primary-secondary-tertiary-case, tunnel-major-link-case, tunnel-motorway-trunk-case, tunnel-path, tunnel-steps, tunnel-major-link, tunnel-pedestrian, tunnel-primary-secondary-tertiary, tunnel-oneway-arrow-blue, tunnel-motorway-trunk, tunnel-oneway-arrow-white, ferry, ferry-auto, road-pedestrian-case, road-street-low, road-street-case, road-secondary-tertiary-case, road-primary-case, road-major-link-case, road-motorway-trunk-case, road-path, road-steps, road-major-link, road-pedestrian, road-street, road-secondary-tertiary, road-primary, road-oneway-arrow-blue, road-motorway-trunk, road-oneway-arrow-white, bridge-pedestrian-case, bridge-primary-secondary-tertiary-case, bridge-major-link-case, bridge-motorway-trunk-case, bridge-path, bridge-steps, bridge-major-link, bridge-pedestrian, bridge-primary-secondary-tertiary, bridge-oneway-arrow-blue, bridge-motorway-trunk, bridge-major-link-2-case, bridge-motorway-trunk-2-case, bridge-major-link-2, bridge-motorway-trunk-2, bridge-oneway-arrow-white, aerialway, admin-1-boundary-bg, admin-0-boundary-bg, admin-1-boundary, admin-0-boundary, admin-0-boundary-disputed, road-label, road-number-shield, road-exit-shield, waterway-label, natural-line-label, natural-point-label, water-line-label, water-point-label, poi-label, transit-label, airport-label, settlement-subdivision-label, settlement-label, state-label, country-label, com.mapbox.annotations.points
Outdoors land, landcover, national-park, national_park-tint-band, landuse, pitch-outline, waterway-shadow, water-shadow, waterway, water, wetland, wetland-pattern, hillshade, contour-line, land-structure-polygon, land-structure-line, aeroway-polygon, aeroway-line, building-outline, building, tunnel-street-minor-low, tunnel-street-minor-case, tunnel-primary-secondary-tertiary-case, tunnel-major-link-case, tunnel-motorway-trunk-case, tunnel-construction, tunnel-path-smooth-rough, tunnel-path-cycleway-piste, tunnel-steps, tunnel-major-link, tunnel-pedestrian, tunnel-street-minor, tunnel-primary-secondary-tertiary, tunnel-oneway-arrow-blue, tunnel-motorway-trunk, tunnel-oneway-arrow-white, cliff, ferry, ferry-auto, road-path-bg, road-steps-bg, road-pedestrian-case, road-street-low, road-minor-case, road-street-case, road-secondary-tertiary-case, road-primary-case, road-major-link-case, road-motorway-trunk-case, road-construction, road-path-smooth, road-path-rough, road-path-cycleway-piste, road-steps, road-major-link, road-pedestrian, road-pedestrian-polygon-fill, road-pedestrian-polygon-pattern, road-polygon, road-minor, road-street, road-secondary-tertiary, road-primary, road-oneway-arrow-blue, road-motorway-trunk, road-rail, road-rail-tracks, level-crossing, road-oneway-arrow-white, golf-hole-line, gate-fence-hedge, bridge-path-bg, bridge-steps-bg, bridge-pedestrian-case, bridge-street-minor-low, bridge-street-minor-case, bridge-primary-secondary-tertiary-case, bridge-major-link-case, bridge-motorway-trunk-case, bridge-construction, bridge-path-smooth-rough, bridge-path-cycleway-piste, bridge-steps, bridge-major-link, bridge-pedestrian, bridge-street-minor, bridge-primary-secondary-tertiary, bridge-oneway-arrow-blue, bridge-motorway-trunk, bridge-rail, bridge-rail-tracks, bridge-major-link-2-case, bridge-motorway-trunk-2-case, bridge-major-link-2, bridge-motorway-trunk-2, bridge-oneway-arrow-white, aerialway-bg, aerialway, admin-1-boundary-bg, admin-0-boundary-bg, admin-1-boundary, admin-0-boundary, admin-0-boundary-disputed, contour-label, building-number-label, road-label, road-number-shield, road-exit-shield, golf-hole-label, waterway-label, natural-line-label, natural-point-label, water-line-label, water-point-label, poi-label, transit-label, airport-label, settlement-subdivision-label, settlement-label, state-label, country-label, com.mapbox.annotations.points
Light land, landcover, national-park, landuse, water-shadow, waterway, water, hillshade, land-structure-polygon, land-structure-line, aeroway-polygon, aeroway-line, building-outline, building, tunnel-street-minor-low, tunnel-street-minor-case, tunnel-primary-secondary-tertiary-case, tunnel-major-link-case, tunnel-motorway-trunk-case, tunnel-construction, tunnel-path, tunnel-steps, tunnel-major-link, tunnel-pedestrian, tunnel-street-minor, tunnel-primary-secondary-tertiary, tunnel-motorway-trunk, road-pedestrian-case, road-minor-low, road-street-low, road-minor-case, road-street-case, road-secondary-tertiary-case, road-primary-case, road-major-link-case, road-motorway-trunk-case, road-construction, road-path, road-steps, road-major-link, road-pedestrian, road-minor, road-street, road-secondary-tertiary, road-primary, road-motorway-trunk, road-rail, bridge-pedestrian-case, bridge-street-minor-low, bridge-street-minor-case, bridge-primary-secondary-tertiary-case, bridge-major-link-case, bridge-motorway-trunk-case, bridge-construction, bridge-path, bridge-steps, bridge-major-link, bridge-pedestrian, bridge-street-minor, bridge-primary-secondary-tertiary, bridge-motorway-trunk, bridge-rail, bridge-major-link-2-case, bridge-motorway-trunk-2-case, bridge-major-link-2, bridge-motorway-trunk-2, admin-1-boundary-bg, admin-0-boundary-bg, admin-1-boundary, admin-0-boundary, admin-0-boundary-disputed, road-label, waterway-label, natural-line-label, natural-point-label, water-line-label, water-point-label, poi-label, airport-label, settlement-subdivision-label, settlement-label, state-label, country-label, com.mapbox.annotations.points
Dark land, landcover, national-park, landuse, water-shadow, waterway, water, hillshade, land-structure-polygon, land-structure-line, aeroway-polygon, aeroway-line, building-outline, building, tunnel-street-minor-low, tunnel-street-minor-case, tunnel-primary-secondary-tertiary-case, tunnel-major-link-case, tunnel-motorway-trunk-case, tunnel-construction, tunnel-path, tunnel-steps, tunnel-major-link, tunnel-pedestrian, tunnel-street-minor, tunnel-primary-secondary-tertiary, tunnel-motorway-trunk, road-pedestrian-case, road-minor-low, road-street-low, road-minor-case, road-street-case, road-secondary-tertiary-case, road-primary-case, road-major-link-case, road-motorway-trunk-case, road-construction, road-path, road-steps, road-major-link, road-pedestrian, road-minor, road-street, road-secondary-tertiary, road-primary, road-motorway-trunk, road-rail, bridge-pedestrian-case, bridge-street-minor-low, bridge-street-minor-case, bridge-primary-secondary-tertiary-case, bridge-major-link-case, bridge-motorway-trunk-case, bridge-construction, bridge-path, bridge-steps, bridge-major-link, bridge-pedestrian, bridge-street-minor, bridge-primary-secondary-tertiary, bridge-motorway-trunk, bridge-rail, bridge-major-link-2-case, bridge-motorway-trunk-2-case, bridge-major-link-2, bridge-motorway-trunk-2, admin-1-boundary-bg, admin-0-boundary-bg, admin-1-boundary, admin-0-boundary, admin-0-boundary-disputed, road-label, waterway-label, natural-line-label, natural-point-label, water-line-label, water-point-label, poi-label, airport-label, settlement-subdivision-label, settlement-label, state-label, country-label, com.mapbox.annotations.points
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汇跨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子妆距,更是在濱河造成了極大的恐慌穷遂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娱据,死亡現(xiàn)場(chǎng)離奇詭異蚪黑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)中剩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門忌穿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人结啼,你說(shuō)我怎么就攤上這事掠剑。” “怎么了郊愧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵朴译,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我属铁,道長(zhǎng)眠寿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任焦蘑,我火速辦了婚禮盯拱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘例嘱。我一直安慰自己狡逢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布拼卵。 她就那樣靜靜地躺著奢浑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪间学。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音低葫,去河邊找鬼详羡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嘿悬,可吹牛的內(nèi)容都是我干的实柠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼善涨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窒盐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起钢拧,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蟹漓,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后源内,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體葡粒,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年膜钓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了嗽交。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颂斜,死狀恐怖夫壁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情沃疮,我是刑警寧澤盒让,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站忿磅,受9級(jí)特大地震影響糯彬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葱她,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一撩扒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吨些,春花似錦搓谆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至偶器,卻和暖如春斩萌,著一層夾襖步出監(jiān)牢的瞬間缝裤,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工颊郎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留憋飞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓姆吭,卻偏偏與公主長(zhǎng)得像榛做,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子内狸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容