基于ArcGIS JS API封装dojo微件(以工具条为例)
1.应用场景:
我们知道ArcGIS JS API自带了一些微件(或者说是控件),比如缩放按钮、定位按钮等等。但是有的时候这些微件的样式不太符合项目实际要求,或者是项目上想要把这些组合起来,这时候我们就需要自己封装一套微件了。下面用一个工具条微件作为例子,总结一下过程,效果图:
2.封装步骤:
一个微件可以用一个dojo模块表示,在dojo模块中定义一个类,使用时直接实例化类就可以了。最后有整段代码。
2.1 定义模块
通过define定义模块,基本格式:
define([依赖模块],function(){//回调函数return 0; //下步会定义一个类,返回
});
封装微件一般会依赖这几个模块:
"dijit/_WidgetBase",//微件基类
"dijit/_TemplatedMixin",
"dijit/_OnDijitClickMixin",
2.2 定义类
通过declare定义类,基本格式:
declare("类名",[依赖的类],{//类的主体//定义基本属性,构造方法等
});
2.3 定义html模板
微件需要通过DOM节点进行展示,要先定义好基本模板,Toolbar.html
<ul class="toolbar"><li><img src="./Toolbar/assets/放大.png" title="放大" data-dojo-attach-event="ondijitclick:mapZoomIn"></li><li><img src="./Toolbar/assets/缩小.png" title="缩小" data-dojo-attach-event="ondijitclick:mapZoomOut"></li><li><img src="./Toolbar/assets/平移.png" title="平移" data-dojo-attach-event="ondijitclick:mapPan"></li><li class="no-border"><img src="./Toolbar/assets/全图.png" title="默认视图" data-dojo-attach-event="ondijitclick:mapZoomToFullExtent"></li>
</ul>
2.4 定义样式
为了让微件布局更好看,需要css样式,Toolbar.css
div,ul,li{padding: 0;margin: 0;list-style: none;
}.toolbar{position: absolute;top: 20px;right: 300px;height: 42px;width: 172px;overflow: hidden;background-color: #fff;border-radius: 8px;-moz-box-shadow: -6px 6px 5px #cccccc;-webkit-box-shadow:-6px 6px 5px #cccccc;box-shadow: -6px 6px 5px #cccccc;
}
.toolbar>li{float: left;position: relative;height: 26px;width: 41px;border-right: 2px solid #f5f5f5;margin: 8px 0 0 0;cursor: pointer;
}
.toolbar>li.no-border{border: 0;width: 40px;
}
2.5 添加属性、构造函数、基本方法
Toolbar.js
define(["dojo/_base/declare","esri/toolbars/navigation","dijit/_WidgetBase","dijit/_TemplatedMixin","dijit/_OnDijitClickMixin","dojo/text!./templates/Toolbar.html",
], function (declare,Navigation,_WidgetBase,_TemplatedMixin,_OnDijitClickMixin,template,
) {return declare([_WidgetBase,_TemplatedMixin,_OnDijitClickMixin], {_map: null,_naviBar: null,templateString:template,//html模板constructor: function (options) {var me = this;me._map = options.map;me._naviBar = new Navigation(me._map);},//平移mapPan: function() {this._naviBar.activate(Navigation.PAN);},//地图放大mapZoomIn: function() {this._naviBar.activate(Navigation.ZOOM_IN);},//地图缩小mapZoomOut: function() {this._naviBar.activate(Navigation.ZOOM_OUT);},//缩放至全图mapZoomToFullExtent: function() {this._naviBar.zoomToFullExtent();},});
});
2.6 测试
注意:要使用自己封装的本地模块,必须添加dojo配置,否则在加载模块时会找不到
index.html
<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no"/><title>My Dijit</title><link rel="stylesheet" href="https://js.arcgis.com/3.27/esri/css/esri.css"><link rel="stylesheet" href="Toolbar/style/Toolbar.css"><style>html, body, #map {height: 100%;margin: 0;padding: 0;}</style><script>var package_path = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/'));var dojoConfig = {// The locationPath logic below may look confusing but all its doing is// enabling us to load the api from a CDN and load local modules from the correct location.packages: [{name: "myDijit",location: package_path + '/Toolbar'}]};</script><script src="https://js.arcgis.com/3.27/"></script><script>var _map,_toolbar;require(["esri/map","myDijit/Toolbar","dojo/domReady!"], function(Map,Toolbar) {_map = new Map("map", {basemap: "topo", //For full list of pre-defined basemaps, navigate to http://arcg.is/1JVo6Wdcenter: [-122.45, 37.75], // longitude, latitudezoom: 13});var mapDiv = document.getElementById("map");var mapToolDiv = document.createElement('div');mapToolDiv.id = 'mapToolbar_';var options = {map:_map,};_toolbar = new Toolbar(options);// new Toolbar(options,srcDomRef);_toolbar.placeAt(mapToolDiv);mapDiv.appendChild(mapToolDiv);});//https://developers.arcgis.com/javascript/3/jshelp/intro_custom_dijit.html//https://github.com/Esri/arcgis-dijit-home-button-js//https://dojotoolkit.org/reference-guide/1.10/quickstart/writingWidgets.html#//构造方法,var params={}//<!--注意html模板内的DOM节点属性应采用dojo可识别的,如单击监听事件data-dojo-attach-event="ondijitclick:,而不是(onclick)--></script>
</head><body>
<div id="map"></div>
</body>
</html>
3. 踩坑提醒:
3.1 dojoConfig要在引入init.js文件之前先加上,否则配置不会生效;
3.2 微件类的构造函数传参时不要直接把map对象传进去,要用对象包一层:
var toolbar = new Toolbar(_map);//有问题var options = {map:_map}
var toolbar = new Toolbar(options);//正常constructor: function(options){map = options.map;
}
3.3 注意html模板内的DOM节点属性应采用dojo可识别的,如单击监听事件data-dojo-attach-event="ondijitclick:,而不是onclick,直接用οnclick="fun1()"是没作用的。
<!--点击无反应-->
<img src="./Toolbar/assets/平移.png" title="平移" onclick="mapPan ()"><!--点击正常-->
<img src="./Toolbar/assets/平移.png" title="平移" data-dojo-attach-event="ondijitclick:mapPan">
源代码下载地址:https://download.csdn.net/download/wml00000/10972736
参考资料链接:
https://developers.arcgis.com/javascript/3/jshelp/intro_custom_dijit.html
https://github.com/Esri/arcgis-dijit-home-button-js
https://dojotoolkit.org/reference-guide/1.10/quickstart/writingWidgets.html#
基于ArcGIS JS API封装dojo微件(以工具条为例)相关推荐
- 基于ArcGIS JS API实现的两种距离和面积测量方式
文章目录 前言 开发思路 主要代码 效果测试 效果图 测试页面 开发总结 参考链接 前言 在一些地图地图应用中,距离.面积测量属于基础功能.ArcGIS API for JavaScript有单独提供 ...
- 基于ArcGIS JS API实现垂直滑动缩放条
文章目录 需求背景 需求分析 效果图 完整代码 注意事项 严格来说并不是基于ArcGIS JS API,应该是基于Dojo的dijit里面的VerticalSlider和VerticalRule,但是 ...
- 基于ArcGIS JS API 4.11实现对FeatureLayer的多变量渲染
文章目录 需求背景 需求分析 开发过程 效果图 注意事项 参考链接 在线示例 需求背景 有一个二维数组,里面包含几万个表示高度的值,现在要把这些高度值在地图上展示出来.可以通过小立方体的方式展现,长宽 ...
- 基于ArcGIS JS API 的点击查询功能
应用场景: 点击地图要素,弹出信息窗,左边显示点击要素的图层树(因为是查询的多个图层),右边显示当前所选要素的所有属性数据,可通过树插件实现动态控制要显示的要素.如果不想把属性表里面的所有属性全部显示 ...
- 基于three.js 和ArcGIS JS API 建筑物立面动态特效渲染
基于three.js 和ArcGIS JS API 建筑物立面波纹墙动态渲染 简介 基于ArcGIS JS API 和 three.js 波纹墙扩展类ripplewallRenderer 波纹墙扩展类 ...
- 15 ArcGIS JS API 4.17更改测量控件黄白相间的默认样式
问题描述 在使用ArcGIS API for JavaScript 4.17开发项目时,有一个需求是需要在地图上添加距离测量和面积测量的控件,这其实很简单,直接调用ArcGIS JS API自带的测量 ...
- 三维地图前端arcgis_【ArcGIS JS API + eCharts系列】实现二、三维网络路径图的绘制...
概述 前面两篇文章通过扩展EchartsLayer.js这个图层类,实现了使用ArcGIS JS API和eCharts,在二维和三维场景下绘制迁徙图和散点图.这篇文章继续通过绘制网络路径图的例子,再 ...
- 03 【ArcGIS JS API + eCharts系列】实现二、三维散点图的绘制
概述 上一篇文章中我们介绍了如何使用ArcGIS JS API和eCharts结合,在二维和三维场景下绘制迁徙图.这篇文章我们来介绍下如何在二维和三维场景下绘制散点图,其实散点图跟迁徙图一样,它的绘制 ...
- 02 【ArcGIS JS API + eCharts系列】实现二、三维迁徙图的绘制
概述 上一篇文章通过纯前端的方式实现了ArcGIS JS API和eCharts的普通二维图表绘制,因为这些图表绘制其实是跟地理坐标无关的,只需要设置图表的位置即可,所以仅仅用了纯前端的方式去实现.这 ...
最新文章
- 自定义报错返回_Keras编写自定义层--以GroupNormalization为例
- 牛X!Github项目中文榜,你想知道不想知道的都有!
- 用Apache Server配置php,cgi服务器
- [No0000C0]百度网盘真实地址解析(不用下载百度网盘)20170301
- python爬虫模块取cookie_[ Python爬虫实战 ] Python使用cookies - pytorch中文网
- edoc2中标电子文件管理标准ERMS制定项目
- 解决matplotlib的中文问题
- 使用Gensim进行主题建模(二)
- TCP BBR - 一键安装最新内核并开启 TCP BBR
- Vscode tab键使用
- 六行shell脚本实现Android手机自动刷抖音极速版
- java毕业设计——基于java+java-swing的泡泡堂网络游戏设计与实现(毕业论文+程序源码)——泡泡堂网络游戏
- redis集群工具redis-trib制作并打包上传到私有Harbor
- 通过游戏,ACCU和乌克兰进行测试
- DNS劫持、流量劫持,HTTP/HTTPS劫持
- iphone6+总显示无服务器,iphone6一直显示无服务为什么啊
- 如何设计手机端banner图【电商小白】
- 【学习OpenCV4】OpenCV入门精讲(C++/Python双语教学)
- 高中信息技术c语言编程题,高中信息技术招聘C语言编程题精选.doc
- 【线代】转置、共轭转置
热门文章
- MFC 多文档中同时打开多个文档
- 汇总运行在Hadoop YARN上的开源系统
- Day 22: 使用Spring、MongoDB和AngularJS开发单页面应用
- Machine Learning week 6 quiz: Advice for Applying Machine Learning
- Android我的便签-----SQLite的使用方法
- hash_hmac函数使用不当造成的安全问题
- Android图表和图形创建库:EazeGraph
- NO.111 禅道导出数据做透视表,让你轻松做年终工作总结。
- sscanf函数中类型不匹配警告引发的BUG和思考
- Simulink中进行电容充放电的一种简单仿真