ArcGIS API For JavaScript(8)之使用动态图层dynamicLayers实现多图层合并截图

news2024/12/26 23:29:14

场景还原:

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

        在前端要实现地图截图,首先想到的是使用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.TableDataSource
                var 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.TableDataSource
                var 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));

                    //图层ID
                    var 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);
                });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63884.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业物联网关-modbus数据采集程序(1-程序设计)

写代码之前 最近代码写慢了,磨了好久都没开始动手写代码。考虑的东西越多越多,甚至自己都认为过虑了。就像这个程序,写代码之前估计花了大半天或者一天在思考怎么写,不知道是好事还是年纪大了。所以专门写篇文章,把自…

为什么要选择 Redis?

文章目录前言一、选型二、协议三、客户端1、常见 java 客户端2、常见可视化工具:四、Redis 生态1、模块2、代理3、其他前言 Redis(Remote Dictionary Server),即「远程字典服务」是一个使用 ANSI C 编写的、开源的、支持网络的、…

【电力系统】基于YALMIP 的微网(光伏+风电+蓄电池+微电网+柴油机)优化调度模型附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

Unity—UGUI

每日一句:读数、学习 去更远的地方,才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例:用户名和密码 Toggle组件 案例:冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容 Character Limit 输入字符…

宝塔后渗透-添加用户_反弹shell

更新时间:2022年11月21日 1. 背景介绍 对于想拿到bt后台来说,非常的艰难:无非是通过bypass之后提权,直接拿到服务器的root权限,然后再去宝塔后台。 当然,还有一种运气十分爆棚的方法:发现了b…

Qt的Q_UNUSED()函数的功能

目录Qt Assistant(Qt 助手)构建场景其他一些平替方法参考Qt Assistant(Qt 助手) 函数名直译过来是【不用的;从未用过的】。 碰到陌生的函数不要慌,直接Qt Assistant查一哈。 Q_UNUSED(name) Indicates to …

负载均衡器 OpenELB ARP 欺骗技术解析

作者:大飞哥,视源电子运维工程师,KubeSphere 用户委员会广州站站长,KubeSphere Ambassador。 K8S 对集群外暴露服务有三种方式:NodePort,Ingress 和 Loadbalancer。NodePort 用于暴露 TCP 服务(4 层)&#…

基于5G智能网关的水泵远程监控系统方案

方案背景 水泵作为一种常见的水务设备,在日常的生产、生活中发挥重要的作用。为了保证生产、生活用水,也为了预防异常天气带来的过度降水,水泵具备的供水、排水作用都是不可忽视的。然而,很多地区的水泵管理模式依然停留在专人看…

毕业设计-基于机器视觉的手写字识别系统

目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科…

变焦镜头内参数如何获得?

很多时候,我们是使用相应的棋盘格标定进行相机内参数的获取,但是对于相机而言,如果要是焦距范围是测量比较远的物体,那么我们要进行注意相应的内参数就是不能够使用棋盘格标定法进行获取,因为不准. 由于项目的需要,这里我就是需要进行探究一下,如何通过自己调试直接设定内参数…

CSS 实现卡片边框渐变动画

前言 &#x1f44f;CSS实现卡片边框渐变动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 父容器添加背景渐变色 <div class"card"></div>.card {background: linear-gradient(0deg, …

Tensorboader图片和模型可视化

非常简单&#xff0c;10分钟搞懂1 Tensorboader介绍2 进行写入和运行&#xff08;共2步&#xff09;3 图像显示3.1 显示图片3.2 显示模型3.3 动态显示学习率等参考文献1 Tensorboader介绍 它就是1个可视化工具&#xff0c;需要用pip进行下载&#xff1b; 下载以后进行显示&a…

SpringCloud框架(三):微服务优化,Feign的最佳实现方案

SpringCloud环境搭建&#xff1a;生产和消费 RestTemplate Spring章节复习已经过去&#xff0c;新的章节SpringCloud开始了&#xff0c;这个章节中将会回顾微服务相关 主要依照以下几个原则 每一个组件的Demo和Coding上传到我的代码仓库在原有基础上加入一些设计模式&#xf…

数据结构与算法之图的应用

一.树之习题选讲-Tree Traversals Again 树习题-TTA.1 题意理解 非递归中序遍历的过程 1. Push的顺序为先序遍历(pre)2. Pop的顺序给出中序遍历(in) 树习题-TTA.2 核心算法 上图分别是先序、中序、后序遍历通过规律我们可以看到他们之间的位置分配 //伪代码 void solve(int …

Zabbix在X86服务器上的部署流程

服务器资源:Centos7、X86架构 部署zabbix服务端 #设置SELinux 成为permissive模式临时关闭selinux防火墙 setenforce 0 #获取zabbix的下载源和更换阿里源 https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm #解压zabbix包 …

探花交友_第4章_MongoDB基础(新版)

探花交友_探花交友_第4章_MongoDB基础(新版) 文章目录探花交友_探花交友_第4章_MongoDB基础(新版)课程介绍1. 通用设置1.1 需求分析1.1.1 需求分析1.1.2 数据库表1.1.3 实体类SettingsQuestionBlackList1.2 查询通用设置1.2.1 接口文档1.2.2 代码实现vo对象tanhua-app-serverSe…

易知微11月更新速递 | 预案集如何实现“一屏多端”联动指挥体系

伴随着“2022Easy Future秋季产品发布会”的举行&#xff0c;易知微也迎来了EasyV6.0的全新升级&#xff0c;通过新产品、新服务&#xff0c;助力实现一个能“数智视融合&#xff0c;虚实人联动”的数字增强世界。近一个月我们依旧奋力于产品迭代优化&#xff0c;又给大家带来了…

留学生Paper写作怎么进行深度解析?

对于留学生Paper而言&#xff0c;要想文章显得井井有条&#xff0c;逻辑结构在这个时候就显得很重要&#xff01;为什么这样说呢&#xff1f;首先我们要认识到一点&#xff0c;就是Paper必须做到内容和形式上统一。内容就是文章的主题和材料&#xff0c;形式是指逻辑结构和语言…

视觉小目标检测论文速读

视觉小目标检测论文速读 本文主要针对三篇文章典型文章。 一. SuperYOLO Super Resolution Assisted Object Detection in Multimodal Remote Sensing Imagery 1. 主要工作: 首先去掉Focus模块取保持HR特征, 避免分辨率下降&#xff0c;有效克服小目标空间损失的减少。利…

(一) SpringCloud+Security+Oauth2微服务授权初步认识

一 引言 再前面的security专题中 我们学习了单体架构基于SpringSecurity实现的授权方案,这种在业务量较小及业务的复杂度较低时比较实用,随着业务的复杂度越来越高,微服务架构也越来越被更多的公司使用&#xff0c;本文就微服务中的主流授权方案及oauth2中基本概念做简要概述。…