当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


JavaScript ArcGIS VectorTileLayer用法及代码示例


基本信息

以下是所在类或对象的基本信息。

AMD: require(["esri/layers/VectorTileLayer"], (VectorTileLayer) => { /* code goes here */ });

ESM: import VectorTileLayer from "@arcgis/core/layers/VectorTileLayer";

类: esri/layers/VectorTileLayer

继承: VectorTileLayer > Layer > Accessor

自从:用于 JavaScript 4.0 的 ArcGIS API

用法说明

概述

VectorTileLayer 访问缓存的数据切片并以矢量格式呈现。它类似于缓存上下文中的WebTileLayer;但是,WebTileLayer 呈现为一系列图像,而不是矢量数据。与光栅图块不同,矢量图块可以适应其显示设备的分辨率,并且可以重新设置样式以用于多种用途。 VectorTileLayer 提供样式化的Map,同时利用缓存的栅格Map切片和矢量Map数据。

VectorTileLayer 的显示方式由 Mapbox Style Specification 定义。 VectorTileLayer 样式信息与其图块分开存储。这意味着一组矢量图块可以通过多种方式设置样式,而无需为每种样式生成新的图像缓存。这有助于节省空间并加快创建新Map样式的过程。

ArcGIS Vector Tile Style Editor 用于设计自定义矢量底图。请参阅 Design custom basemaps with the new ArcGIS Vector Tile Style Editor 以了解有关使用 ArcGIS 矢量切片样式编辑器设计自定义矢量底图的更多信息。

如果从不同的域请求矢量切片服务,则需要 CORS enabled serverproxy

创建VectorTileLayer

VectorTileLayers 可以通过以下三种方式之一创建:从 URL(服务 URL 或样式 URL)、ArcGIS 门户项目 ID 或 JSON 样式对象。

引用服务 URL 或样式 URL

要从服务创建 VectorTileLayer 实例,您必须将 url 属性设置为层的 REST 端点。为了使图层在视图中可见,必须将其添加到视图引用的Map中。有关向Map添加图层的信息,请参阅Map.add()

require(["esri/layers/VectorTileLayer"], function(VectorTileLayer){
  // create a new instance of VectorTileLayer from the service endpoint
  const layer = new VectorTileLayer({
    // esri world vector tile service
    url: "https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer"
  });
  map.add(layer);  // adds the layer to the map
});

要从样式 URL 创建 VectorTileLayer,您必须将 url 属性设置为图层的样式端点。

// create a new instance of VectorTileLayer from the vector tiles style endpoint
const layer = new VectorTileLayer({
  // esri colored pencil style
  url:
   "https://www.arcgis.com/sharing/rest/content/items/4cf7e1fb9f254dcda9c8fbadb15cf0f8/resources/styles/root.json"
});
map.add(layer);  // adds the layer to the map

引用 ArcGIS 门户项目 ID

如果 ArcGIS Online 或 ArcGIS Enterprise 中存在项目,您还可以根据其门户项目 ID 创建 VectorTileLayer。例如,以下代码片段显示如何使用 PortalItem 属性将新的 VectorTileLayer 实例添加到Map。

// points to the charted territory vector tile portal item in ArcGIS Online
// https://www.arcgis.com/home/item.html?id=1c365daf37a744fbad748b67aa69dac8
let layer = new VectorTileLayer({
 portalItem:{
   id: "1c365daf37a744fbad748b67aa69dac8"
 }
});
map.add(layer);  // adds the layer to the map

引用样式 JSON 对象

要从样式 JSON 对象创建 VectorTileLayer 实例,请将图层的样式属性设置为指向样式 JSON 对象。查看 VectorTileLayer from JSON 示例以了解其实际情况。

// create a new instance of VectorTileLayer from style JSON object
// by setting the layer's style property
const layer = new VectorTileLayer({
  style: {
    glyphs: "glyphsUrl/{fontstack}/{range}.pbf",
    version: 8,
    sprite: "spritesUrl/sprites/sprite",
    sources: {
      esri: {
        url: "https://basemaps.arcgis.com/arcgis/rest/services/World_Basemap_v2/VectorTileServer",
        type: "vector"
      }
    },
    layers: [ ... ]
  }
});
map.add(layer);  // adds the layer to the map

更新VectorTileLayer 样式

要更新 VectorTileLayer 的样式,您可以通过调用图层的 loadStyle() 方法来替换整个样式。如果要修改样式属性,可以使用 setLayoutProperties 或 setPaintProperties 方法。

替换整个样式

VectorTileLayer 的样式可以在图层初始化并添加到Map后整体替换。这可以通过调用该层的loadStyle()方法来完成。此方法将从样式 JSON 对象或样式 url 加载样式,并将替换图层的当前样式。此操作将重新加载整个图层。

// add a mid-century vector tile layer from its portal item
let layer = new VectorTileLayer({
 portalItem:{
   id: "7675d44bb1e4428aa2c30a9b68f97822"
 }
});
map.add(layer);  // adds the layer to the map

// replace the style of this layer to point to modern antique style
layer.loadStyle(
  "https://www.arcgis.com/sharing/rest/content/items/effe3475f05a4d608e66fd6eeb2113c0/resources/styles/root.json"
);

vectortiles-loadstyle

更新样式层的各种属性

VectorTileLayer初始化后,可以更改VectorTileLayer当前样式中style layers的属性。 VectorTileLayer 提供了许多辅助方法,允许您更新样式图层的属性,而无需重新加载图层。这只能在 2D MapView 中完成。

在 4.10 版本中,我们引入了 getLayoutProperties、getPaintProperties、setLayoutProperties 和 setPaintProperties。这些方法可以直接访问样式图层的 paintlayout 属性。查看 VectorTileLayer from JSON 示例以了解其实际情况。

// get layout properties of "Admin0 point/large" style layer
const layoutProperties = vtLayer.getLayoutProperties("Admin0 point/large");

// change the text-transform layout property to upper case
layoutProperties["text-transform"] = "uppercase";
layer.setLayoutProperties("Admin0 point/large", layoutProperties);

// get the paint properties for the marine area/1 layer
const paintProperties = vtLayer.getPaintProperties("Marine area");

// change the fill-color paint property for the layer.
paintProperties["fill-color"] = "#93CFC7";
layer.setPaintProperties("Marine area/1", paintProperties);

在版本 4.18 中,我们添加了以下辅助方法:getStyleLayer、setStyleLayer、deleteStyleLayer、getStyleLayerVisibility 和 setStyleLayerVisibility。 setStyleLayer 方法将允许您添加新的样式层或重新排序样式层。它还允许您重写或更改 style layer 的任何属性,包括 filtersource-layerlayoutpaint 。 deleteStyleLayer 方法从样式中删除指定的样式层,setStyleLayerVisibility 方法切换样式层的可见性。查看 VectorTileLayer - update style layers 示例以了解其实际情况。

// change paint and layout properties of a style layer
const styleLayer = layer.getStyleLayer("City small scale/x large admin0 capital");
styleLayer.paint["text-color"] = "#E400E0";
styleLayer.paint["text-halo-color"] = "#E400E0";
styleLayer.layout["icon-size"] = 1.5;

// delete a style layer from the current style
layer.deleteStyleLayer("Marine areas");

// add a new style layer on top of the existing style
const styleLayer = { style layer json object}
layer.setStyleLayer(styleLayer, 0)

vectortiles-setstylelayer

已知限制

  • VectorTileLayer 打印需要 ArcGIS Server 10.5.1 或更高版本。
  • 对于使用 ArcGIS 服务器 10.5.1 或 10.6.0 打印安全 VectorTileLayers,print 将为 VectorTileLayer 创建一个客户端图像以在打印输出中使用。这有一些与大尺寸打印质量相关的限制以及对浏览器窗口高度/宽度比的依赖性。
  • VectorTileLayer 样式中用于backgroundfill 样式图层的图案大小应为2 的幂,以确保获得最佳效果。

相关用法


注:本文由纯净天空筛选整理自arcgis.com大神的英文原创作品 VectorTileLayer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。