arcgis for js 4.X自定义气泡点击地图对象弹出对话框

Posted 左直拳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arcgis for js 4.X自定义气泡点击地图对象弹出对话框相关的知识,希望对你有一定的参考价值。

题目的意思是,arcgis for js 4.X自定义气泡,点击地图对象弹出对话框,而不是弹出气泡。对话框是vue页面组成的自定义对话框,不是地图页面的对象。

基本思路:
1)气泡模板(PopupTemplate)的内容类型设为函数
2)该函数向地图页面的父页面发送消息,然后关闭气泡
3)地图页面的父页面接收到消息后,弹出对话框

整个过程,气泡一闪而过,甚至根本无法察觉,就好像点击地图对象,直接弹出了对话框。

在arcgis for js 3.X时代,类似的功能我也搞过,原理为气泡内容是一个iframe,在iframe页面触发对话框弹出,然后关闭气泡。相关文章:
arcgis for js 3.X通用百变气泡解决方案

在arcgis for js 4.X,也可以这么搞。但iframe嵌入的页面(是一个VUE页面)有个身份验证问题,就想采用消息通知的机制,可能更灵活些。

上代码:

1、地图页面

//popupTemplate.content可以是一个函数,有意思:
var popupIt = _getPopup(mapView, function (name) 
    //弹出对话框
    _emit(
      target: "bathPop",
      data: 
        name: name,
      ,
    );
);

//定义气泡等  
var options = 
  id: "起一个好记的名字",
  url: "地图服务地址",
  sublayers: [//4.X的ImageMapLayer,也就是3.X的动态图层ArcGISDynamicMapServiceLayer
    
      id: 31,//地图服务某子图层的ID
      outFields: ["*"],
      popupTemplate: 
        title: "name",
        content: popupIt,//这是上面定义的函数
      ,
    ,
  ],
;

_addLayer(mapView, options);

function _addLayer(mapView, options) 
  require(["esri/layers/MapImageLayer"], function (MapImageLayer) 
    var layer = new MapImageLayer(options);
    mapView.map.add(layer);
  );

function _emit(json) 
  //地图是用iframe嵌入到vue页面的,因此要通知vue
  //postMessage只负责发送消息,不传递数据。如果要传递数据,只能自己序列化成字符串,放在第一个参数
  window.parent.postMessage(JSON.stringify(json), "*");

function _getPopup(mapView, callback) 
  return function () 
    new Promise(function (resolve) 
      var timer1 = setInterval(function () 
      	//需要获得被点击地图对象的信息
      	//为了保证能获取到,使用了定时器,直到获取成功才转到下一步,否则循环等待
      	//应该还有其他更好的途径,但我还不知道
        if (!mapView.popup.content.title || mapView.popup.content.title === "") 
          return;
        
        clearInterval(timer1);//清除定时器
        if (callback && typeof callback === "function") 
          callback(mapView.popup.content.title);
        
        resolve();//转向下一步
      , 200);
    ).then(function () //这就是所谓的下一步
      mapView.popup.close();
    );
  ;

2、地图页面的父页面

<template>
  <page-container navi="map" noFooter="true">
    <iframe
      ref="mapIframe"
      src="地图页面"
      class="mapIframe"
      frameborder="0"
      scrolling="false"
      allowfullscreen="true"
    />
  </page-container>
  <pop></pop>
</template>

<script setup>
import  ref, onMounted, nextTick  from "vue";

const init = () => 
  //监听消息
  window.addEventListener("message", popIt.bind(this));

  function popIt(ev) 
    const data = ev.data;
    try 
      if (data && data.indexOf("") === 0) //是json
        //弹出对话框
      
     catch (ex) 
      console.log(ex);
    
  
;

onMounted(() => 
  nextTick(() => 
    init();
  );
);
</script>

<style scoped>
.mapIframe 
  width: 100%;
  height: calc(100vh - 50px);

</style>

以上是关于arcgis for js 4.X自定义气泡点击地图对象弹出对话框的主要内容,如果未能解决你的问题,请参考以下文章

arcgis api 4.x for js之图层管理篇

arcgis api 4.x for js之图层管理篇

arcgis for js 3.X通用百变气泡解决方案

arcgis api 4.x for js 结合 Echarts4 实现统计图(附源码下载)

304Arcgis_for_js热力图4.21(03)

arcgis api for js入门开发系列二十一气泡窗口信息动态配置模板