ArcGIS API For JavaScript(8)之使用动态图层dynamicLayers实现多图层合并截图
创始人
2024-03-20 01:40:27
0

场景还原:

        定位某个矢量图斑范围面,过滤展示该图斑,以图斑为中心,截图图斑周边并附带影像底图的截图。

        在前端要实现地图截图,首先想到的是使用arcgis rest api中的export接口,这是没问题的,export方法可以很轻松的实现图片导出。官网rest api导出截图的参考地址如下:

Export Map—ArcGIS REST APIs | ArcGIS Developers

        通过bbox控制导出范围,用于定位到指定图斑范围;layers控制要导出的图层;layerDefs控制图层过滤条件。

        通过设置这几个属性,基本上可以满足大部分需求,但layers只能控制单个服务内部的所有图层,无法满足影像数据的叠加,因为影像都会发布成切片,也不可能放在动态服务中一同发布。为了实现影像底图等多图层的叠加,需要动态图层dynamicLayers。

首先需了解下什么是动态图层。

        动态图层它是需要依附于一个开启动态图层的地图服务,然后把数据资源所在位置注册为这个地图服务的动态工作空间(shape、raster、filegdb、database等),也就是将动态工作空间寄宿到该服务里,在Web前端调用的时候指定图层关联的数据源进行符号化、查询等操作。

开启动态服务的过程可参考以下文章,不再截图操作。
ArcGIS server使用动态工作空间的服务发布及利用ArcGIS API for Javascript添加动态图层_最后的精灵的博客-CSDN博客

        了解动态图层后,开始使用在服务上添加动态图层,考虑到矢量图斑要素方便存储到地理空间数据库,影像由于数据量可能很大,一般用文件存储在服务器中,因此可以考虑在影像服务上开启动态图层,关联上矢量要素图层。本文只做示例,展示在矢量图层上开启动态图层。

 保存后重启地图服务方可生效。

参考代码:

以下展示两种方式:

(1)将动态图层数据以要素图层方式加载到地图,使用export的dynamicLayers属性参数设置。

                var workspaceId = "xizh";var layerName = "sde.sde.zrbhdbhtb1";console.log("当前增加的图层名:" + layerName);//定义一种数据源//1.TableDataSourcevar tableDS = new TableDataSource();tableDS.workspaceId = workspaceId;tableDS.dataSourceName = layerName;//2.定义动态图层数据var layerSource = new LayerDataSource();layerSource.dataSource = tableDS;//3.以featurelayer来加载,支持在此基础上的query操作。注意url地址var featureLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/YSKJ/CheckSpot/MapServer/dynamicLayer", {id: layerName,mode: FeatureLayer.MODE_ONDEMAND,outFields: ["*"],infoTemplate: new InfoTemplate(tableDS.dataSourceName, "${*}"),source: layerSource}); map.addLayer(featureLayer);//设置图层渲染featureLayer.on("load", function () {var renderer = new SimpleRenderer(createSymbol(featureLayer.geometryType));featureLayer.setRenderer(renderer);dynamicLayerInfos = baseLayer.createDynamicLayerInfosFromLayerInfos();console.log(dynamicLayerInfos)const dynamicLayers = [{id: 102,source: {type: "dataLayer",dataSource: {type: "table",workspaceId: "xizh",dataSourceName: dom.byId("dynamicLayers").value,},},// definitionExpression: "",drawingInfo: {renderer: {type: "simple",symbol: {type: "esriSFS",style: "esriSFSSolid",color: [166, 36, 100, 255],outline: {type: "esriSLS",style: "esriSLSSolid",color: [0, 0, 255, 255],width: 2.0}}},transparency: 0,showLabels: true,labelingInfo: [{labelPlacement: "esriServerPolygonPlacementAlwaysHorizontal",labelExpression: "[zhqbhdmc]",useCodedValues: false,symbol: {type: "esriTS",color: [255, 255, 0, 255],verticalAlignment: "bottom",horizontalAlignment: "left",font: {family: "sim-sun",size: 10,style: "normal",weight: "bold",decoration: "none"}}}]}},{id: 101,source: {type: "mapLayer",mapLayerId: 0}}];esriRequest("http://localhost:6080/arcgis/rest/services/YSKJ/CheckSpot/MapServer/export", {query: {format: "png8",f: "json",bbox: "21.362888485827725,-39.40536624794468,212.63711151417232,98.94486123571511",size: "400,400",dpi: 200,dynamicLayers: JSON.stringify(dynamicLayers)}}).then(res => {console.log(res);});})

(2)将动态图层数据添加到原动态服务中,以layers属性参数设置。

                var workspaceId = "xizh";var layerName = "sde.sde.zrbhdbhtb1";console.log("当前增加的图层名:" + layerName);//定义一种数据源//1.TableDataSourcevar tableDS = new TableDataSource();tableDS.workspaceId = workspaceId;tableDS.dataSourceName = layerName;//2.定义动态图层数据var layerSource = new LayerDataSource();layerSource.dataSource = tableDS;//3.更新到现有的dynamicmapservicelayer中console.log("加载前:");printMsg(dynamicLayerInfos);var dynamicLayerInfo = new DynamicLayerInfo();dynamicLayerInfo.id = dynamicLayerInfos.length;dynamicLayerInfo.name = layerName;dynamicLayerInfo.source = layerSource;dynamicLayerInfos.splice(0, 0, dynamicLayerInfo);  //将新加的图层添加在数组最前面,在地图中会绘制在最上面。baseLayer.setDynamicLayerInfos(dynamicLayerInfos);console.log("加载后:");printMsg(dynamicLayerInfos);//根据图层几何类型设置符号var dynamicLayerUrl = baseLayer.url + "/dynamicLayer";var layerJson = {"source": layerSource.toJson()};var layersRequest = esriRequest({url: dynamicLayerUrl,content: {layer: JSON.stringify(layerJson),f: "json"},handleAs: "json",callbackParamName: "callback"});layersRequest.then(function (response) {console.log("Success: ", response.geometryType);var lyrDrawingOptions = new LayerDrawingOptions();lyrDrawingOptions.renderer = new SimpleRenderer(createSymbol(response.geometryType));//图层IDvar layerId = dynamicLayerInfos.length - 1;drawingOptions[layerId] = lyrDrawingOptions;baseLayer.setLayerDrawingOptions(drawingOptions);//esriRequest("http://localhost:6080/arcgis/rest/services/YSKJ/CheckSpot/MapServer/export", {query: {format: "png8",f: "json",bbox: "21.362888485827725,-39.40536624794468,212.63711151417232,98.94486123571511",size: "400,400",dpi: 200,// dynamicLayers: JSON.stringify(dynamicLayers)}}).then(res => {console.log(res);});}, function (error) {console.log("Error: ", error.message);});

上一篇:Unity—UGUI

下一篇:3 内存访问

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...