ArcGIS API for javascript 4.16案例学习笔记(1)图层控制
子曰,温故而知新。目前还没项目做,记在纸上,字写得太潦草,还是写在网上吧,可以随时看。
第一个例子就不从写hello word版的地图开始了,4.16案例名叫layers-mapimagelayer-sublayers。大概就是地图子图层控制吧。
先看效果图:

效果呢,就是点击下面的按钮, 控制Map中的layer显示或者关闭。
开始代码部分:
二、我们先看整体代码骨架
var renderer = {};
var layer = new MapImageLayer();
var map = new Map();
var view = new MapView();
layer.when();
var sublayersElement = document.querySelector();
sublayersElement.addEventListener("click", function (event){})
声明renderer对象,用来给下面MapImageLayer实例化里面的layer设置样式。然后Map类加载MapImageLayer,并通过MapView显示。layer.when()用来控制下面一排按钮 的样式,如果是可见的,那就高亮显示,最后给下面一排按钮添加点击事件,通过事件,控制图层是否显示。总体思路就是这样,下面开始细分各个部分代码。
二、代码细分
1.
var renderer = {
type: "simple", // autocasts as new SimpleRenderer()
symbol: {
type: "simple-line", // autocasts as new SimpleLineSymbol()
color: [255, 255, 255, 0.5],
width: 0.75,
style: "long-dash-dot-dot"
}
};
第一个属性type,是渲染器的类型,通过查询API文档,它还有:"classbreaks"|"dictionary"|"dotdensity"|"heatmap"|"simple"|"unique-value"这些类型,有一些我也没试过,需要自行探索,本文的是一个简单的渲染,比如最后一个unique-value,惟一值类型,用过arcgis的可以知道,这个就是按要素图层的值来渲染,比如要分别显示不同年龄段的样式,就按不同的年龄段为一个值。
第二个属性symbol,他到底有哪些属性,读者可以自行查询,在esri/symbols/Symbol里面。type是符号类型,API里列举的其他类型有:"simple-marker"|"picture-marker"|"simple-line"|"simple-fill"|"picture-fill"|"text"|"shield-label-symbol"|"point-3d"|"line-3d"|"polygon-3d"|"web-style"|"mesh-3d"|"label-3d"|"cim"。本文是线型。color、width表颜色,线宽。style应该是类似css样式。这个不太清楚。
2、
var layer = new MapImageLayer({
url:
"https://sampleserver6.arcgisonline.com/arcgis/rest/services/USA/MapServer",
sublayers: [
{
id: 2,
visible: true
},
{
id: 4,
visible: false,
title: "Railroads",
renderer: renderer,
source: {
// indicates the source of the sublayer is a dynamic data layer
type: "data-layer",
// this object defines the data source of the layer
// in this case it's a feature class table from a file geodatabase
dataSource: {
type: "table",
// workspace name
workspaceId: "MyDatabaseWorkspaceIDSSR2",
// table name
dataSourceName: "ss6.gdb.Railroads"
}
}
},
{
id: 1,
visible: true
},
{
id: 0,
visible: true
}
]
});
MapImageLayer的实例化,指出url属性,这个url,复制到浏览器看,你会发现有四个图层,本文只要了2,1,0,还有一个ID为4的图层为url之外的。本例代码设置了一开始加载图层,id为4的图层为不可见(visible:false)。指定了前面创建的样式,source指定了图层的来源,type为这个东西是图层数据,关于他还有什么其他类型,请自行查找api。
3、
var map = new Map({
basemap: "dark-gray",
layers: [layer]
});
var view = new MapView({
container: "viewDiv",
map: map,
zoom: 4,
center: [-99, 39]
});
加载。简单,不多废话
4
layer.when(function () {
layer.sublayers.map(function (sublayer) {
var id = sublayer.id;
var visible = sublayer.visible;
var node = document.querySelector(
".sublayers-item[data-id='" + id + "']"
);
if (visible) {
node.classList.add("visible-layer");
}
});
});
我们来看下官方解说 Wait for Layer to load and update the page to refelect which layers are visible in the Map Service.就是等待图层加载页面,然后反射到下面的按钮,让按钮样式变化。
一开始没学过es6,直接上手学习这个,被这段代码搞蒙了,后面问了一下公司的高哥,才知道这个是map数组的用法。
layer.sublayers.map会把layer里面的子图层给遍历出来,取出一个,我就查他的id,还是是否可见,如果可见,那么我通过id,找到css样式中的这个按钮,给这个按钮添加样式,也就是改变按钮样式。
前期加载界面全部完成,接下来写鼠标的点击事件
5
var sublayersElement = document.querySelector(".sublayers");
sublayersElement.addEventListener("click", function (event) {
var id = event.target.getAttribute("data-id");
if (id) {
var sublayer = layer.findSublayerById(parseInt(id));
var node = document.querySelector(
".sublayers-item[data-id='" + id + "']"
);
sublayer.visible = !sublayer.visible;
node.classList.toggle("visible-layer");
}
});
先获取四个按钮的DOM,为这四个按钮添加点击事件,通过 event.target.getAttribute获取点击的id,然后再通过id获取子图层,最后把子图层的visible取反,再把按钮样式切换(toggle功能)。
好了,全部完毕。
三、总结
1、怎么拿到子图层?通过layer.findSublayerById(id)。拿到之后,可以进一步控制它的可见性。
2、怎么拿到css样式的属性?通过event.target.getAttribute获取。
更多推荐

所有评论(0)