• openlayer 鼠标点击船舶,打开船舶简单弹框


    背景:

    对创建的地图对象,可以添加上监听事件,常用的有:地图点击事件、鼠标移动事件。

    通过监听这些事件,又可以区分不同图层的不同要素,获取不同数据;

    根据这些数据,又可以发起网络请求、打开另一个弹框等后续操作。

    在这里,主要介绍对船舶的不同点击或鼠标移动事件,二者的实现思路,仅供参考。

    效果展示:

    船舶的点击效果:点击船舶,选中的船舶添加上选中效果,是一个红色框。2.选中弹框更详细

    船舶的鼠标移动效果:当鼠标移动到船舶对象上,选中的船舶变成选中效果,是原来船舶黑色边框变为红色边框,代表选中。 2.选中弹框包括一下基础信息。

    一、监听地图对象的点击事件

    1.监听鼠标点击

    1. //覆盖图层点击事件
    2. MAPutils.GlobalMap.on('singleclick', function (e) {
    3. ...
    4. 方法体
    5. ...
    6. })

    2. 鼠标点击触发的方法

    判断鼠标移动的地图对象是否存在。接着判断是哪一个图层,根据不同图层,触发不同是事件。这里自定义了一个事件featureClick(参数1,参数2).
    不同的实现思路,不同的代码

    1. /**
    2. * 图层点击事件
    3. * @return {Function}
    4. */
    5. featureClick: (function () {
    6. var _layerType = {
    7. ...
    8. // 船舶图层
    9. shipLayer: function (feature, offset) {
    10. // MAPutils.shipPop(feature.getId(), offset);
    11. MAPutils.drawFocus({ id: feature.getId(), layer: MAPutils.shipLayer });
    12. MAPutils.openShipDetailsV2(feature.getId());
    13. },
    14. ...
    15. }
    16. return function (feature, e) {
    17. var authId = feature.get('authId');
    18. // 如果此按钮是需要校验权限的并且此用户无权限,直接return
    19. if (authId && !WGAuth.click('button', authId))
    20. return;
    21. var layerType = feature.get("layerType"),
    22. offset = MAPutils.getLayerPixel(e);
    23. _layerType[layerType] && _layerType[layerType](feature, offset, e);
    24. }
    25. })(),

     3.打开详细的船舶弹框

    此处省略具体方法

    openShipDetailsV2:function(){

      //方法体

    主要是根据参数发起网络请求、打开详情弹框、在详情弹框中的操作等等

    }

    以上是鼠标点击的省略思路,参照上面的,这篇文章主要详细介绍鼠标移上船舶、移下船舶的具体实现思路。。。 

    二、监听地图对象的鼠标移动事件pointermove

    1.监听鼠标移动

    1. MAPutils.GlobalMap.on('pointermove', function (e) {
    2. if(e.dragging){
    3. return
    4. }
    5. const pixel = MAPutils.GlobalMap.getEventPixel(e.originalEvent);
    6. const hit = MAPutils.GlobalMap.hasFeatureAtPixel(pixel);
    7. if (hit) {
    8. MAPutils.GlobalMap.getTargetElement().style.cursor = 'pointer';
    9. var feature = MAPutils.GlobalMap.forEachFeatureAtPixel(e.pixel,function (feature) {return feature;});
    10. if (feature && feature.get("layerType") == "shipLayer") {
    11. if(feature !== MAPutils.oldFeature){
    12. MAPutils.oldFeature = feature
    13. MAPutils.featureMove(feature, e);
    14. }
    15. }else{
    16. MAPutils.oldFeature = null
    17. MAPutils.oldMmsi = null
    18. }
    19. }else{
    20. MAPutils.GlobalMap.getTargetElement().style.cursor = 'default';
    21. //关闭弹框
    22. MAPutils.DialogIndex && layer.close(MAPutils.DialogIndex || 0);
    23. }
    24. });

    核心代码:

    触发打开船舶简介弹框的核心代码:

    1. if (feature && feature.get("layerType") == "shipLayer") {
    2. if(feature !== MAPutils.oldFeature){
    3. MAPutils.oldFeature = feature
    4. MAPutils.featureMove(feature, e);
    5. }
    6. }else{
    7. MAPutils.oldFeature = null
    8. MAPutils.oldMmsi = null
    9. }
    10. 备注:判断鼠标移动的地图对象是否存在。接着判断是哪一个图层,根据不同图层,
    11. 触发不同是事件。这里自定义了一个事件featureMove(参数1,参数2).
    12. 特别说明:这里还做了一个防抖处理。因为鼠标移动事件触发很频繁。并且鼠标摸船
    13. 显示弹框,鼠标移开关闭弹框。我这里通过两个变量来做的防抖。
    14. 不同的实现思路,不同的代码、

    2.鼠标移动触发的方法

    封装代码:

    1. /**
    2. * 图层点击事件
    3. * @return {Function}
    4. */
    5. featureMove: (function () {
    6. var _layerType = {
    7. //鼠标移动到船舶上
    8. shipLayer: function (feature, offset) {
    9. var myFeature = feature.get('data')
    10. var myColor = MAPutils.getAisColor(myFeature.aisType)
    11. let _style = new ol.style.Style({
    12. stroke: new ol.style.Stroke({
    13. color: '#FF6B6B',
    14. width: 2
    15. }),
    16. fill: new ol.style.Fill({
    17. color: myColor
    18. })
    19. });
    20. feature.setStyle(_style);
    21. MAPutils.shipTipPop(feature.getId(), offset);
    22. }
    23. };
    24. return function (feature, e) {
    25. var authId = feature.get('authId');
    26. // 如果此按钮是需要校验权限的并且此用户无权限,直接return
    27. if (authId && !WGAuth.click('button', authId))
    28. return;
    29. var layerType = feature.get("layerType"),
    30. offset = MAPutils.getLayerPixel(e);
    31. _layerType[layerType] && _layerType[layerType](feature, offset, e);
    32. }
    33. })(),

    3.打开船舶详情弹框

     核心代码:

    1. /**
    2. * 船舶tips弹窗
    3. * @param id 船舶的id(mmsi)
    4. * @param {Array} offset 弹窗位置
    5. */
    6. shipTipPop: function (id, offset) {
    7. var data = {};
    8. var myTimer = 1000;
    9. if(MAPutils.oldMmsi !== id){
    10. MAPutils.oldMmsi = id
    11. }else{
    12. return;
    13. }
    14. debounce(function () {
    15. $.post('ship/getByMMSI', { mmsi: id }, function (res) {
    16. if (res.code == 200 && !!res.data) {
    17. data = res.data
    18. }
    19. ...
    20. //根据结果渲染弹框
    21. ...

  • 相关阅读:
    【C语言】函数指针数组和指向函数指针数组的指针
    水库大坝可视化智能远程监管方案,助力安全监测智能巡检
    spring之AOP简介
    华纳云:Ubuntu下开启php调试模式报错如何解决
    数据结构算法之——时间复杂度和空间复杂度
    这是我见过最详细易懂的Redis笔记(PDF可下载),上线三天破百万点赞
    计算机专业应该学哪些课程?或许我们还有更大的进步空间
    根据内参调整图像大小
    2342.数位和相等数对的最大和
    MybatisPlus性能分析与条件构造器wrapper
  • 原文地址:https://blog.csdn.net/weixin_45024453/article/details/140008312