本文代码基于Angular8和arcgis js 4.16。
代码里会涉及到一个地图变量mapView,初始化如下:
const map = new Map({
basemap: 'osm',
});
this.mapView = new MapView({
container: this.mapContainer.nativeElement,
center: [113.280637, 23.125178],
zoom: 12,
map,
});
官网提供了许多小组件,很多操作不需要开发者自己实现,比如本文的测距、测面积、搜索,这些小组件均满足基本需求。
测距
平面地图测距官网:DistanceMeasurement2D
const [DistanceMeasurement2D] = await loadModules(['esri/widgets/DistanceMeasurement2D']);
this.distanceWidget = new DistanceMeasurement2D({
view: this.mapView,
});
this.mapView.ui.add(this.distanceWidget, 'top-right');
// 清除测距小组件
// this.mapView.ui.remove(this.distanceWidget);
// this.distanceWidget = null;
测面积
平面地图测面积官网:AreaMeasurement2D
const [AreaMeasurement2D] = await loadModules(['esri/widgets/AreaMeasurement2D']);
this.areaWidget = new AreaMeasurement2D({
view: this.mapView,
});
this.mapView.ui.add(this.areaWidget, 'top-right');
// 清除测面积小组件
// this.mapView.ui.remove(this.areaWidget);
// this.areaWidget= null;
搜索
一般图层资源数据集的每个数据会存在多个属性,比如面积、名称等等,那么用户输入关键词进行搜索时应从多个数据源属性中搜索。
多数据源搜索官网:Search
const [Search] = await loadModules(['esri/widgets/Search']);
const searchSources = [];
// 遍历图层,为每个图层设置搜索数据源
if (
this.mapView.map.allLayers &&
this.mapView.map.allLayers.items &&
this.mapView.map.allLayers.items.length > 1
) {
// 排除底图,即this.mapView.map.allLayers.items[0],索引从1开始
for (let index = 1; index < this.mapView.map.allLayers.items.length; index++) {
const fields = [];
if (
this.mapView.map.allLayers.items[index].fields &&
this.mapView.map.allLayers.items[index].fields.length > 0
) {
this.mapView.map.allLayers.items[index].fields.forEach(f => fields.push(f['name']));
}
searchSources.push({
layer: this.mapView.map.allLayers.items[index],
searchFields: fields.slice(0, 6), // 经试验,searchFields只能设置6个,否则即使关键词存在于数据源属性中也会查不出来
extractMatch: false,
outFields: ['*'],
placeholder: '输入关键词',
});
}
}
this.searchWidget = new Search({
view: this.mapView,
sources: [...searchSources],
});
this.mapView.ui.add(this.searchWidget, 'top-right');
// 清除搜索小组件
// this.mapView.ui.remove(this.searchWidget);
// this.searchWidget= null;