Arcgis JS api4.18简单实现leaflet的divOverlay

本文介绍如何在 ArcGIS JavaScript API 中实现类似 Leaflet 的 divOverlay 功能,通过 HTML 和 CSS 构建覆盖物,并随地图拖动更新位置。

arcgis js api 简单实现leaflet的divOverlay

介绍

在leaflet里有一个非常好用divOverylay类,可以使用html+css构建元素直接叠加到地图,并随地图拖动实时改变位置,用于表现复杂的弹窗气泡或标注都很实用,但在arcgis js api 里没有相关的实现方式,这里参考leaflet的实现方式基于arcgis api实现类似的功能。

实现代码

// divOverlay.ts 类
const supportClass = ['esri.layers.FeatureLayer', 'esri.layers.GraphicsLayer'];
const getGeometryCenter = (geometry: __esri.Geometry) => {
   
   
  if (!geometry) {
   
   
    window.console.log(new Error('map:getGeometryCenter:几何对象为空'));
    return null
  }
  const {
   
    type } = geometry;
  // 获取图形中心点
  let center: __esri.Geometry | any = null;
  switch (type) {
   
   
    case 'point':
      center = geometry
      break;
    case 'polyline':
      center = geometry.extent.center;
      break;
    case 'polygon':
      // center = geometry.centroid;
      center = geometry.extent.center;
      break;
    case 'extent':
      center = geometry.center;
      break;
    default:
      break;
  }
  return center;
}
const setClass = (el: HTMLElement, name: string) => {
   
   
  if (!el.className['baseVal']) {
   
   
    el.className = name;
  } else {
   
   
    // in case of SVG element
    el.className['baseVal'] = name;
  }
};
const getClass = (el: HTMLElement) => {
   
   
  if (el['correspondingElement']) {
   
   
    el = el['correspondingElement'];
  }
  return el.className['baseVal'] === undefined ? el.className : el.className['baseVal'];
};
const hasClass = (el: HTMLElement, name: string) => {
   
   
  if (el.classList !== undefined) {
   
   
    return el.classList.contains(name);
  }
  const className = getClass(el);
  return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className);
};
function splitWords(str: string) {
   
   
  return trim(str).split(/\s+/);
}
const addClass = (el, name) => {
   
   
  if (el.classList !== undefined) {
   
   
    const classes = splitWords(name);
    for (let i = 0, len = classes.length; i < len; i++) {
   
   
      el.classList.add(classes[i]);
    }
  } else if (!hasClass(el, name)) {
   
   
    const className = getClass(el);
    setClass(el, (className ? className + ' ' : '') + name);
  }
};

export default class DivOverlay{
   
   
  declaredClass: string = 'divoverlay';
  uiKey: string = 'div-overlay';
  map: __esri.WebMap | __esri.WebScene;
  mapView: __esri.MapView | __esri.SceneView;
  source: __esri.Graphic[] | __esri.GraphicsLayerView | __esri.FeatureLayerView;
  options: any = {
   
   };
  container: any;
  data: any = [];
  domNodes: any = {
   
   };
  displayField: string = 'name';
  currentAlignment: string = 'top-center'; // top-center\top-left\top-right\bottom-center\bottom-left\bottom-right\left-center\right-center
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值