地图服务 ArcGIS API for JavaScript基础用法全解析

地图服务 ArcGIS API for JavaScript基础用法全解析

前言

在接触ArcGIS之前,开发web在线地图时用过Leaflet来构建地图应用,作为一个轻量级的开源js库,在我使用下来Leaflet还有易懂易用的API文档,是个很不错的选择。在接触使用ArcGIS后,我发现其API文档的阅读体验很不尽人意。尽管它提供了详尽的接口描述和参数说明,但由于文档的复杂性和缺乏直观的示例,对于初学者来说可能难以理解和应用,经过几天的努力,手写了多个helloworld,并终于整理出了地图的基本用法。包括,地图打点、自定义点popup,折线栅栏、区域覆盖物、热力图、以及地图上的操作(区域多边形圈选、地图绘制)。demo已上传git,具体源码可直接查看:https://gitee.com/fcli/arcgis-demo.git

地图初始化

1、首先我们需要准备一个地图服务地址,安装@arcgis/core依赖包

yarn add @arcgis/core

2、初始化一个地图

import MapView from '@arcgis/core/views/MapView';let map = new Map();const view: any = new MapView({container: 'viewDiv',map: map,zoom: 4});

3、设置地图中心点、通过地图服务创建基础图层

view.when(() => {let pt = new Point({x: -3385.861498285485,y: -4869.908083566152,spatialReference: view.spatialReference});// 定位到中心点view.goTo({center: pt,zoom: 2
});
//基础图层
let layerUrl = 'http://xxx.xxx.xxx.xxx/arcgis/rest/services/BaseMap/MapServer'; //地图服务URL
let layer = new TileLayer({ url: layerUrl, title: 'baseMap' });
mapLayers.value = layer;
map.layers.add(layer);

地图增加marker点

根据预先配置的测试点,通过Graphic对象包装point点,最终添加到图层上。

//撒点
const renderPoint = () => {let pointGraphicArr: any = [];pointList.forEach((item: any) => {// First create a point geometrylet point = {type: 'point', // autocasts as new Point()longitude: item.COORDX,latitude: item.COORDY,spatialReference: myMapView.spatialReference};//点样式,(可设置图片,或者自定义颜色的marker,参考symbol)let markerSymbol = {// type: 'picture-marker',// url: img,// width: 5,// height: 5type: 'simple-marker',color: [226, 119, 40]};// 创建点的属性let attributes = {Name: item.ADDRESS,Owner: item.TASKID};// Create a graphic and add the geometry and symbol to itlet pointGraphic = new Graphic({geometry: point,symbol: markerSymbol,attributes: attributes});pointGraphicArr.push(pointGraphic);});pointGraphics = pointGraphicArr;//自定义渲染popupsetTimeout(() => {renderPopup();}, 500);return pointGraphics;
}

撒点上图

view.graphics.addMany(renderPoint());

绘制多变形

与绘制marker点类似,将polyline对象添加到Graphic中,最后都通过view.graphics.addMany添加到地图图层上。具体代码实现如下:

//多边形折线
const rendPolyline = () => {const polyline = {//线的坐标信息type: 'polyline', // autocasts as new Polyline()paths: [[-4466.80859375, -8273.7109375],[-3475.872802734375, -6549.30810546875],[-4307.0634765625, -5647.63525390625],[-4466.80859375, -8273.7109375]],spatialReference: myMapView.spatialReference};const lineSymbol = {//线的样式type: 'simple-line',color: [226, 119, 40],width: 2};const lineAtt = {//线的属性Name: 'Keystone Pipeline',Owner: 'TransCanada',Length: '3,456 km'};const polylineGraphic = new Graphic({//创建线对象并且绑定属性以及弹出框信息geometry: polyline,symbol: lineSymbol,attributes: lineAtt});return [polylineGraphic];
}

绘制多边形覆盖物

可自定义覆盖面的样式,包括背景颜色,边框等属性。

//绘制多边形覆盖层面
const rendPolygon = () => {const rings = [[-4226.57763671875, -10710.984375],[-5061.92724609375, -8761.8974609375],[-5428.50244140625, -10374.7802734375]];const polygon = {//面的坐标信息type: 'polygon',rings: rings,spatialReference: myMapView.spatialReference};const fillSymbol = {//面的样式type: 'simple-fill',color: [227, 139, 79, 0.8],outline: {// autocasts as new SimpleLineSymbol()color: [255, 255, 255],width: 1}};const polygonGraphic = new Graphic({//创建面图斑geometry: polygon,symbol: fillSymbol});//数组return [polygonGraphic];
}

热力图实现

首先定义热力图render的值,根据不同的权重占比渲染不同的颜色,注意ObjectID必须需要,然后通过FeatureLayer添加到地图图层上,此处根据count作为权重字段。

//热力图
const rendHeatmap = () => {//热力图渲染var heatmapRenderer = new HeatmapRenderer({//设置渲染器field: 'count', //设置的权重字段colorStops: [{ color: 'rgba(0, 255, 150, 0)', ratio: 0 },{ color: '#32C5E9', ratio: 0.083 },{ color: '#67E0E3', ratio: 0.166 },{ color: '#9FE6B8', ratio: 0.249 },{ color: '#FFDB5C', ratio: 0.332 },{ color: '#ff9f7f', ratio: 0.415 },{ color: '#fb7293', ratio: 0.498 },{ color: '#E062AE', ratio: 0.581 },{ color: '#E690D1', ratio: 0.664 },{ color: '#e7bcf3', ratio: 0.747 },{ color: '#9d96f5', ratio: 0.83 },{ color: '#8378EA', ratio: 0.913 },{ color: '#96BFFF', ratio: 1 }],radius: 10,maxDensity: 0.01625,minDensity: 0});let features: any = [];pointList.forEach((item: any, index: number) => {features.push({geometry: {type: 'point',x: item.COORDX,y: item.COORDY,spatialReference: myMapView.spatialReference},attributes: {count: 1,ObjectID: index //重要!!!}});});const hfields = [new Field({name: 'count',alias: 'count',type: 'string'})];var featureLayer = new FeatureLayer({id: '热力图',source: features, //点数据集title: '热力图',objectIdField: 'ObjectID',fields: hfields, //权重字段renderer: heatmapRenderer});myMap.add(featureLayer);
}

绘制点、线、面、圈、矩形

原理都是通过监听鼠标事件,依赖Draw对象的到不同的地图操作效果

创建Draw

 //自定义绘制点、线、面const draw = new Draw({view: view});

划线:

 var action = draw.create('polyline', {mode: 'click'});

画多边形面

 var action = draw.create('polygon', {mode: 'click' //点击方式加点});

画点

var action = draw.create('point', {mode: 'click' //点击方式加点});

画圆

 var action = draw.create('circle', {mode: 'click' //点击方式加点});

画矩形

var action = draw.create('rectangle', {mode: 'click' //点击方式加点});

具体实现请参考源码,此处不一一列出

自定义实现展示多个popup

由于官方的popup弹出层只能展示一个,而且不能自定义html内容,所以通过自定义实现。
通过view.toScreen能够获取到地图上点距离屏幕top、left的距离,因此,只需要将自定义的popup层在地图进行缩放,移动时动态改变popup的位置,就能实现popup跟随地图移动。

 <div class="popup-content" v-for="(item, index) in popupData" :key="index":style="{ top: item.y - 24 + 'px', left: item.x - 30 + 'px' }">自定义弹出层</div>//自定义渲染popup
const renderPopup = () => {let popupDataArr: any = [];pointGraphics.forEach((item: any) => {let screen = myMapView.toScreen(item.geometry);popupDataArr.push(screen);});popupData.value = popupDataArr;
}view.on('resize', () => {
renderPopup();
});view.on('drag', () => {
renderPopup();
});
//滚轮事件
view.on('mouse-wheel', () => {
setTimeout(() => {renderPopup();
}, 200);
});

最后

由于ArcGIS API for JavaScript 是英文文档,对于英文不好的同学来说实在不友好,example也比较少不够直观,网上相关资料也不多,各位掘友们路过点赞收藏,说不定以后用到呢。

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

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

相关文章

简单地将附件POST到Notes应用中

大家好&#xff0c;才是真的好。 这半年我们会讲很多开发知识&#xff0c;这篇紧接上篇《通过URL将HTML表单数据创建到Domino应用中》&#xff0c;讲述如何将附件POST到Note应用中。 原理是一样&#xff0c;首先&#xff0c;你得有一个表单&#xff0c;我们用html写一个&…

Android 缩减、混淆处理和优化应用

为了尽可能减小应用的大小&#xff0c;您应在发布 build 中启用缩减功能来移除不使用的代码和资源。启用缩减功能后&#xff0c;您还会受益于两项功能&#xff0c;一项是混淆处理功能&#xff0c;该功能会缩短应用的类和成员的名称&#xff1b;另一项是优化功能&#xff0c;该功…

云HIS:新一代云架构医院信息管理系统源码(java语言)

云HIS信息管理云平台&#xff0c;提供全方位的临床系统应用&#xff0c;是国内领先的以云计算为基础&#xff0c;以云计算赋能医疗机构&#xff0c;是颠覆传统医疗信息化业态的技术与模式创新&#xff0c;以SaaS方式&#xff0c;为医疗机构提供信息系统服务&#xff0c;满足从医…

HashMap系列- key到i的转换

1.key转换成hash >>>表示无符号的右移&#xff1a;按照二进制把数字右移指定数位&#xff0c;高位直接补零&#xff0c;低位移除。 ^&#xff08;按位异或运算&#xff09;&#xff1a;运算规则&#xff1a;相同的二进制数位上&#xff0c;数字相同&#xff0c;结果…

Deep Learning(wu--84)调参、正则化、优化--改进深度神经网络

文章目录 2偏差和方差正则化梯度消失\爆炸权重初始化导数计算梯度检验OptimizationMini-Batch 梯度下降法指数加权平均偏差修正RMSpropAdam学习率衰减局部最优问题 调参BNsoftmax framework 2 偏差和方差 唔&#xff0c;这部分在机器学习里讲的更好点 训练集误差大&#xff…

基数排序简单了解

基数排序是根据数字每一位从低到高去进行分类排序的 比如对于数组[1, 11, 2, 12]&#xff0c;从个位数开始&#xff0c;1和11分到了桶1&#xff0c;2和12分到了桶二&#xff0c;接着十位数&#xff0c;1和2分到了一桶&#xff0c;但由于在上一次分桶中&#xff0c;2在1之后&am…

【生信分析】基因组学导论

由于工作需要&#xff0c;现在开始跨行学生信&#xff01; 祝我成功 目标&#xff1a;通过一周的学习能对对不同高通量测序数据集&#xff08;RNA-seq、ChIP-seq、BS-seq 和多组学集成&#xff09;进行分析。 配置环境 if (!requireNamespace("BiocManager", quiet…

详解ES6中的symbol

ES6 引入了一种新的原始数据类型 Symbol&#xff0c;表示独一无二的值。 Symbol的值是唯一的&#xff0c; 用来解决命名冲突的问题; 它是JavaScript 语言的第七种数据类型&#xff0c;是一 种类似于字符串的数据类型&#xff1b; 特点如下&#xff1a; 创建唯一值&#xff1…

二叉树的前、中和后序遍历的递归与迭代实现

1. 前序遍历 1.1 递归 /*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val (valundefined ? 0 : val)* this.left (leftundefined ? null : left)* this.right (rightundefined ? null : right)* }*/ /*** param …

Vue学习笔记-activated和deactivated生命周期

作用 路由组件所独有的2个生命周期 activated生命周期函数用于在路由组件每次由消失到出现时所调用的函数deactivated生命周期函数用于路由组件每次由出现到消失时&#xff08;无论是否缓存&#xff09;所调用的函数 案例 定义一个NewsVue组件&#xff0c;要求&#xff1a;…

PyTorch分布式overview

PyTorch分布式overview 文章目录 PyTorch分布式overviewtorch.nn.DataParallel分布式数据并行训练(DistributedDataParallel)接触DDP, 从这个例子开始分布式数据并行(DistributedDataParallel)基本用例(Basic Use Case)Setup 单机的模型并行最好的实践DataParallel和Distribute…

C语言能判断一个变量是int还是float吗?

C语言能判断一个变量是int还是float吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&…

C语言词法陷阱

目录 前言 1、理解函数声明 最简单的声明符 函数和指针类型 其它组合 typedef简化 2、运算符优先级 C语言运算符优先级表 补充内容 3、作为语句结束标志的分号 多写分号 漏写分号 分号与函数声明 4、switch语句 5、函数调用 6、“悬挂”else引发的问题 前言 …

初识消息队列

1、消息 消息&#xff08;Message&#xff09;是指在应用间传送的数据。消息可以非常简单&#xff0c;比如只包含文本字符串&#xff0c;也可以更复杂&#xff0c;可能包含嵌入对象。 2、消息队列 消息队列&#xff08;Message Queue&#xff09;是一种应用间的通信方式&#…

学生档案管理系统研究

摘 要 学生档案管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生档案管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案&#xff0c;这种管理方式存在着许多缺点,如:效率低…

Ant Design正式推出企业级设计体系,抢先了解!

企业级产品设计体系AntDesign是蚂蚁集团体经过大量项目实践和总结&#xff0c;逐步打磨出的产品。随着这两年B端产品的逐渐白热化&#xff0c;越来越多的用户对更好的用户体验有了进一步的要求。 作为专门为国内生产研究团队量身定制的在线协作工具&#xff0c;设计师可以直接在…

Kubernetes(K8s)DashBoard的使用-11

DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实&#xff0c;为了提供更丰富的用户体验&#xff0c;kubernetes还开发了一个基于web的用户界面&#xff08;Dashboard&#xff09;。用户可以使用Dashboard部署容器化的应用&#xff0c;还可以…

tomcat AJP文件包含漏洞(CVE-2020-1938)

漏洞介绍 CVE-2020-1938 是一个影响 Tomcat 的 AJP 文件包含漏洞。攻击者可以利用该漏洞通过 Tomcat AJP Connector 读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如配置文件或源码。 如果目标应用有文件上传功能,攻击者还可以利用文件包含漏洞实现远程代码执行,造成…

【EI会议征稿中】第三届光学与机器视觉国际学术会议(ICOMV 2024)

第三届光学与机器视觉国际学术会议(ICOMV 2024) 2024 3rd International Conference on Optics and Machine Vision 第三届光学与机器视觉国际学术会议(ICOMV 2024)将于2024年1月19-21日在中国南昌举行。本次会议将围绕“光学”与"机器视觉”等研究领域展开讨论&#xf…