jsapi有提供popup功能,但缺点很多,例如地图上只能同时显示一个popup,popup内容有限制等

本文提供另一个方法,原理不用jsapi,在地图外用一个普通的div放在地图上面,再监听地图的鼠标移动等时间控制这div跟着地图联动

本文代码可能存在跟框架的css等绑定,不一定能直接运行,在此只提供实现思路

本文代码用到vue的绑定

初始化,写入popup的数据也在此

  1. popupInit: function () {
  2. //popup初始化
  3.  
  4. //填入popup的数据
  5. this.popupInfos = [];
  6.  
  7. this.popupInfos.push({
  8. //地图坐标
  9. x: 113.566806,
  10. y: 22.22445,
  11. //popup内容的文字,只是个示范,当然格式不限
  12. text: "我是第一个",
  13. //是否显示,不是必须的
  14. show: true,
  15. //样式
  16. style: {
  17. //div的位置,单位是屏幕坐标
  18. top: "-1000px",
  19. left: "-1000px",
  20. },
  21. });
  22.  
  23. this.popupInfos.push({
  24. x: 113.57418,
  25. y: 22.2234205,
  26. text: "我是第2222个",
  27. show: true,
  28. style: {
  29. top: "-1000px",
  30. left: "-1000px",
  31. },
  32. });
  33.  
  34. this.popupInfos.push({
  35. x: 113.5928,
  36. y: 22.226853,
  37. text: "我不显示的",
  38. show: false,
  39. style: {
  40. top: "-1000px",
  41. left: "-1000px",
  42. },
  43. });
  44. },

移动popup位置的方法

  1. //移动popup位置
  2. relocatePopup: function () {
  3. for (let i = 0; i < this.popupInfos.length; i++) {
  4. let popupInfo = this.popupInfos[i];
  5.  
  6. //把popup所在的地图坐标转为屏幕坐标
  7. let point = mapUtil.geometry.xyToPoint(this.apiInstance, popupInfo.x, popupInfo.y, this.mapView.spatialReference);
  8. let screenPoint = this.mapView.toScreen(point);
  9.  
  10. let x = screenPoint.x;
  11. let y = screenPoint.y;
  12. //重新设置popup的div的位置
  13. popupInfo.style.top = y - 114 + 'px';
  14. popupInfo.style.left = x - 100 + 'px';
  15. }
  16. },

监听地图事件以实现popup和地图位置联动,这段代码通常在map加载完成时执行

  1. //地图弹窗移动的实现
  2. //由于popup只是一个在jsapi外部的一般的div,因此这div的移动要自行编码实现
  3. //原理是监听地图所有的会改变地图显示范围的事件(也就是popup需要移动的事件),然后根据地图坐标转换为屏幕坐标,最终重新设置div的位置
  4. //地图拖动事件
  5. this.mapView.on('drag', function (e) {
  6. this.relocatePopup();
  7. }.bind(this));
  8. //滚轮事件
  9. this.mapView.on('mouse-wheel', function (e) {
  10. this.relocatePopup();
  11. }.bind(this));

html部分,地图和popup的代码截取,用了vue和element-ui实现绑定

  1. <div style="height: 100%;">
  2. <el-row style="height: 100%;">
  3. <el-col :span="20" style="height: 100%;">
  4. <el-row style="height: 100%;overflow: hidden;">
  5. <!--地图的div-->
  6. <div class="mapContainer" id="mapDemo1"></div>
  7. <!--地图弹窗的html部分-->
  8. <!--popupInfos是弹窗的数据源,其他跟一般的div没区别-->
  9. <!--PS:注意,要使popup不会超出地图以外是通过父级div的overflow: hidden来实现-->
  10. <div class="infoWindowItem" v-for="(popupInfo,index) in popupInfos" :style="popupInfo.style"
  11. v-show="popupInfo.show">
  12. <div class="item">
  13. <span class="content">{{popupInfo.text}}</span>
  14. </div>
  15. </div>
  16. </el-row>
  17. </el-col>

实现效果,底图是天地图

arcgis jsapi接口入门系列(9):可以同时显示多个的地图popup的更多相关文章

  1. arcgis jsapi接口入门系列(0):总览

    开发环境: arcgis jsapi版本4.9 由于我们这套代码是基于vue,webpack开发的,会有少数vue代码,但总体不影响 里面还有些我们公司的js库和html css,给出的代码不能百分百 ...

  2. arcgis jsapi接口入门系列(5):几何(点线面)基本操作

    点 point: function () { //通过wkt生成点 //wkt,代表点的坐标 let wkt = "POINT(113.566806 22.22445)"; //w ...

  3. arcgis jsapi接口入门系列(2):图层基础操作

    //图层相关demo layerFun: function () { //获取地图的所有图层(不包括的图层类型:底图图层(basemaps)) let layers = this.map.layers ...

  4. arcgis jsapi接口入门系列(10):图形高亮

    jsapi也有提供高亮的实现接口,但这里没用,而用的是一种改变图形(graphic)样式的思路 本文实现效果是:地图有多个面图形,当鼠标移动到面的上方,面高亮显示,鼠标移出后高亮解除 初始化 //高亮 ...

  5. arcgis jsapi接口入门系列(3):各种类型的图层添加

    这里说的tomcat切片,是指arcgis server切片后,把切片图片文件用tomcat发布(其他任意web服务器发布都行) //添加tomcat切片图层 addTomcatTileLayer: ...

  6. arcgis jsapi接口入门系列(6):样式

    symbol: function () { //线样式 //样式详情请看官方文档 let style = { //线颜色,支持多种格式: //CSS color string:例如"dodg ...

  7. arcgis jsapi接口入门系列(4):用代码在地图画点线面

    PS:用代码画点这样写是为了跟后面的用鼠标画点线面区分出来 画点 drawPointGraphic: function () { //点有多种样式:一般的点,显示文字,显示图片 //一般的点 let ...

  8. arcgis jsapi接口入门系列(8):鼠标在地图画面

    初始化,每个map执行一次 PS:画点也差不多,都是用SketchViewModel,因此本demo没有专门写画点的 drawPolygonInit: function () { //画几何对象初始化 ...

  9. arcgis jsapi接口入门系列(7):鼠标在地图画线

    初始化,每个map执行一次就行 drawPolylineInit: function () { //画几何对象初始化 //新建一个图形图层用于存放画图过程中的图形 let layer = new th ...

随机推荐

  1. struts2的使用知识点

    最开始学习java的时候学习过struts,但是对配置和struts的理解深度不够,现在工作虽然再用,但是自己搭建环境和使用心得始终很零散,所以现在决定重新理一遍,有条理的学习一下struts. 至于 ...

  2. cassandra自启动服务器脚本

    新建一个文件. vi /etc/rc.d/init.d/vi cassandra2 #!/bin/sh # chkconfig: # description: service -- # process ...

  3. HDOj-1412

    {A} + {B} Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  4. hadoop版本与支持的hbase版本对照…

    hadoop版本与支持的hbase版本对照表 分类: hbase2013-05-20 17:19 701人阅读 评论(2) 收藏 举报 HbaseHadoop As of Hive 0.9.0 the ...

  5. OpenType字体与TrueType字体的区别

    TrueType采用几何学中二次B样条曲线及直线来描述字体的外形轮廓,其特点是:TrueType既可以作打印字体,又可以用作屏幕显示:由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按照打 ...

  6. 干货:SEO长尾关键词优化方法和技巧

    在网站SEO优化上,优化比较成功的网站,根据SEO界前辈的经验结论,网站的总流量主要来源于长尾关键词,占网站总流量的80%.长尾关键词主要分布在网站的文章页,其次就是栏目页title.标签页.专题页等 ...

  7. 3. 关于sql注入的综合题

    关于sql注入的综合题                          ----------南京邮电大学ctf : http://cms.nuptzj.cn/ 页面上也给了好多信息: 根据这个sm. ...

  8. 黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南

    目录 修改默认源,为apt-get安装提速 安装python 和 python pip 安装 zsh 安装powerline-font中的特定字体 安装powerline-shell 修改~目录下的配 ...

  9. Candies

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 30247   Accepted: 8409 Descrip ...

  10. selenium+Python搭建

    安装环境:windows 7 64位   1.安装python,版本为python2.7 1)下载安装包. 在python官方网站选择下载python2版本的windows安装包:python-2.7 ...