问题来源:有个网友问如何调用arcgis的api将图层组的子图层全部显示出来。
这里呢,他选择arcgis,所以MapImageLayer类可以满足他的需要。
MapServer 既可用动态图层方式,也可用瓦片方式加载
如何判断区分动态图层和瓦片图层
首先,瓦片又区分矢量瓦片与栅格瓦片,常见的MapServer 。MapServer 既可用动态图层方式,也可用瓦片方式加载。
动态图层通常使用 Dynamic Map Service(动态地图服务)来发布。Dynamic Map Service 提供了一个动态地图图层,它会在客户端请求时动态生成地图图像。这种服务可以让用户对地图进行交互操作,如缩放、平移和查询。动态地图服务通常使用基于矢量数据的渲染方式,因此可以提供更高精度的地图显示效果。
瓦片图层通常使用 Tiled Map Service(切片地图服务)来发布。Tiled Map Service 提供了一个预先生成的地图图像集合,这些图像按照一定的规则进行分割并存储为瓦片,客户端在请求时直接获取预先生成好的瓦片图像进行拼接,以形成完整的地图。由于瓦片图层是基于预先生成的图像进行显示,因此它的渲染速度相对较快,适合于大规模地图的显示。
1.1 发布服务选择
在 ArcMap 中发布服务时,选择“根据数据动态”表示选择发布成动态图层,选择“使用缓存中的切片”表示瓦片图层。
1.2 从图层服务判断
通过查看 MapServer 的服务类型,可以区分动态图层和瓦片图层。如果服务类型为 Dynamic Map Service,则该服务提供的是动态地图图层,如果服务类型为 Tiled Map Service,则该服务提供的是瓦片地图图层。
1、动态图层(矢量)
Single Fused Map Cache: false
2、瓦片图层
Single Fused Map Cache: true
ArcGIS和Cesium中不同图层加载所使用的API
ArcGIS
ArcGIS 的动态图层和瓦片图层使用了不同的服务类型,因此在加载时需要使用不同的对象来进行加载。
1、使用MapImageLayer API加载矢量图层
在 REST API 页面中,sublayers 参数指定了要显示的子图层 ID 号动态图层。
const layer = new MapImageLayer({
url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer",
sublayers: [
{
id: 3,//对应自己发布的服务的图层id号
visible: false//对可见性进行设置,非必要,可根据自己的目标效果选择
},
{
id: 2,
visible: true
},
{
id: 1,
visible: true
},
{
id: 0,
visible: true
}
]
});
map.add(layer);
MapImageLayer 类的强大,在于能够对sublayers属性进行设置
https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-MapImageLayer.html
2、使用WebTileLayerAPI加载瓦片图层
var layer = new WebTileLayer({
urlTemplate: "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}"
});
map.add(layer);
Cesium
说明:Cesium原生接口仅支持,坐标系有3857、4326。但如 4490 或 4610 等经纬度图层也是可以显示的。注意瓦片不行,会报错。
1、加载矢量(动态)图层
如下图,在 Cesium 中发布的瓦片也当动态图层方式调用。需要有如下信息,Dynamic Layer
let imageryProvider =new Cesium.ArcGisMapServerImageryProvider({
url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer',
usePreCachedTilesIfAvailable: false,
// layers: '0,2' // layer图层这里可以过滤图层的显示
}),
var layer = viewer.scene.imageryLayers.addImageryProvider(layerProvider);
2、瓦片图层
// false 为动态图层
var layerProvider = new Cesium.ArcGisMapServerImageryProvider({
usePreCachedTilesIfAvailable: true,
url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer'
});
var layer = viewer.scene.imageryLayers.addImageryProvider(layerProvider);
或者可以通过使用 Cesium 的 WebMapTileServiceImageryProvider 对象来加载瓦片图层
var imageryProvider = new Cesium.WebMapTileServiceImageryProvider({
url: 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/WMTS',
layer: 'World_Imagery',
style: 'default',
format: 'image/jpeg',
tileMatrixSetID: 'default028mm',
maximumLevel: 19
});
viewer.imageryLayers.addImageryProvider(imageryProvider);
在 Cesium 中,发布的瓦片也当动态图层方式调用。需要有如下信息,Dynamic Layer