Angular+arcgisjs之平面地圖測距、測面積、搜尋

Carl@0709發表於2020-12-27

本文程式碼基於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;

相關文章