【超图 SuperMap3D】【基础API使用示例】54、超图SuperMap3D -鼠标左键拖拽绘制圆

news2024/12/23 20:16:30

前言

引擎下载地址:[添加链接描述](http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id=2524)
通过左键按下拖拽的方式在地图上进行贴地的圆绘制
完整代码拷贝直接本地运行即可查看效果

效果

在这里插入图片描述

核心代码

// 绘制圆形
function startDrawCircleHandler () {
  if (circleEntity) {
    viewer.entities.remove(circleEntity)
    circleEntity = null
  }
  customPanel.innerHTML = '请按下鼠标左键拖拽进行拉框放大操作'
  showTooltip = true
  circle.classList.add('active')
  disableMouseOperateHandler()

  function downHandler (e) {
    drawStatus = true
    customPanel.innerHTML = '拖动松开以结束绘制'
    center = viewer.scene.pickPosition(e.position)
  }

  function upHandler () {
    drawStatus = false
    showTooltip = false
    customPanel.style.left = '-10000px'
    customPanel.style.top = '-10000px'
    customPanel.style.display = 'none'
    circle.classList.remove('active')
    resetMouseOperateHandler()
    handler.removeInputAction(SuperMap3D.ScreenSpaceEventType.LEFT_DOWN)
    handler.removeInputAction(SuperMap3D.ScreenSpaceEventType.LEFT_UP)

    // TODO 调用iserver服务查询
    // 可参考 https://www.bilibili.com/read/cv22219129/
  }

  handler.setInputAction(downHandler, SuperMap3D.ScreenSpaceEventType.LEFT_DOWN)
  handler.setInputAction(upHandler, SuperMap3D.ScreenSpaceEventType.LEFT_UP)
}

// 地图上move操作
function mousemoveHandler (SuperMap3D) {
  handler.setInputAction((e) => {
    if (showTooltip) {
      // 点击的位置显示面板
      customPanel.style.left = e.endPosition.x + 20 + 'px'
      customPanel.style.top = e.endPosition.y + 'px'
      customPanel.style.display = 'block'
    }
    if (drawStatus) {
      end = viewer.scene.pickPosition(e.endPosition)
      radius = getDistanceHandler(center, end)
      drawCircleHandler(radius)
    }
  }, SuperMap3D.ScreenSpaceEventType.MOUSE_MOVE)
}

// 绘制圆
function drawCircleHandler (radius) {
  if (circleEntity) {
    circleEntity.ellipse.semiMinorAxis = new SuperMap3D.CallbackProperty(function () {
      return radius;
    }, false)
    circleEntity.ellipse.semiMajorAxis = new SuperMap3D.CallbackProperty(function () {
      return radius;
    }, false)
  } else {
    circleEntity = viewer.entities.add({
      position: center,
      ellipse: {
        semiMinorAxis: radius,
        semiMajorAxis: radius,
        // height: 0,
        material: SuperMap3D.Color.GREEN.withAlpha(0.5),
        outline: true, // height must be set for outline to display
        // clampToGround: true,
        disableDepthTestDistance: Number.POSITIVE_INFINITY
      }
    })
  }
}

完整代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
  <meta name="viewport"
    content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
  <title></title>

  <link href="https://www.supermapol.com/webgl/Build/SuperMap3D/Widgets/widgets.css" rel="stylesheet">
  <link href="https://www.supermapol.com/webgl/examples/webgl/css/pretty.css" rel="stylesheet">
  <link href="https://www.supermapol.com/webgl/examples/webgl/style/colorCorrection.css" rel="stylesheet">
  <link href="https://www.supermapol.com/webgl/examples/webgl/css/bootstrap-select.min.css" rel="stylesheet">
  <script src="https://www.supermapol.com/webgl/examples/webgl/js/jquery.min.js"></script>
  <script src="https://www.supermapol.com/webgl/examples/webgl/js/bootstrap.min.js"></script>
  <script src="https://www.supermapol.com/webgl/examples/webgl/js/bootstrap-select.min.js"></script>
  <script src="https://www.supermapol.com/webgl/examples/webgl/js/tooltip.js"></script>
  <script src="https://www.supermapol.com/webgl/examples/webgl/js/slider.js"></script>
  <script src="https://www.supermapol.com/webgl/examples/webgl/js/config.js"></script>
  <script type="text/javascript" src="https://www.supermapol.com/webgl/Build/SuperMap3D/SuperMap3D.js"></script>

  <link rel="stylesheet" href="https://www.supermapol.com/webgl/web/libs/bootstrap/css/bootstrap.min.css">
  <link href="https://www.supermapol.com/webgl/examples/webgl/style/flood.css" rel="stylesheet">
  <style>
    .circle {
      position: fixed;
      left: 100px;
      top: 100px;
    }

    .circle.active {
      color: red;
    }

    .custom-panel {
      position: fixed;
      left: -1000px;
      top: -1000px;
      z-index: 1;
      border-radius: 10px;
      display: none;
      color: #fff;
      background-color: rgba(0, 0, 0, 0.3);
    }
  </style>
</head>

<body>
  <div id="Container"></div>
  <button class="circle" onclick="startDrawCircleHandler()">绘制</button>
  <div class="custom-panel"></div>

  <script type="text/javascript">
    let viewer, handler
    const initMouseOperate = {}
    const customPanel = document.querySelector('.custom-panel')
    const circle = document.querySelector('.circle')
    function onload (SuperMap3D) {
      var EngineType = getEngineType()
      viewer = new SuperMap3D.Viewer('Container', {
        navigation: false, // 默认为true,是否显示导航罗盘控件。隐藏可在初始化场景时设置为false
        animation: true, //是否创建动画小器件,左下角仪表
        contextOptions: {
          contextType: Number(2)  // Webgl2:2  WebGPU:3
        }
      })

      viewer.scenePromise.then(function (scene) {
        handler = new SuperMap3D.ScreenSpaceEventHandler(viewer.scene.canvas) // event事件处理程序
        init(SuperMap3D, scene, viewer)
        mousemoveHandler(SuperMap3D)
        setInitOperateInfoHandler()
      })
    }
    function init (SuperMap3D, scene, viewer) {
      viewer.imageryLayers.addImageryProvider(new SuperMap3D.BingMapsImageryProvider({
        url: 'https://dev.virtualearth.net',
        mapStyle: SuperMap3D.BingMapsStyle.AERIAL,
        key: URL_CONFIG.BING_MAP_KEY//当场景出现黑球时可至官网(https://www.bingmapsportal.com/)申请key
      }))
      viewer.resolutionScale = window.devicePixelRatio

      scene.lightSource.ambientLightColor = new SuperMap3D.Color(0.65, 0.65, 0.65, 1)

      var widget = viewer.Widget

      try {
        //添加S3M图层服务
        var promise = scene.open(URL_CONFIG.SCENE_XGPARK)
        SuperMap3D.when(promise, function (layers) {
          setInitCameraViewHandler()
        }, function (e) {
          errorPanelHandler(widget, e)
        })
      }
      catch (e) {
        errorPanelHandler(widget, e)
      }
    }

    let drawStatus = false
    let showTooltip = false
    let center, end, radius, circleEntity
    // 绘制圆形
    function startDrawCircleHandler () {
      if (circleEntity) {
        viewer.entities.remove(circleEntity)
        circleEntity = null
      }
      customPanel.innerHTML = '请按下鼠标左键拖拽进行拉框放大操作'
      showTooltip = true
      circle.classList.add('active')
      disableMouseOperateHandler()

      function downHandler (e) {
        drawStatus = true
        customPanel.innerHTML = '拖动松开以结束绘制'
        center = viewer.scene.pickPosition(e.position)
      }

      function upHandler () {
        drawStatus = false
        showTooltip = false
        customPanel.style.left = '-10000px'
        customPanel.style.top = '-10000px'
        customPanel.style.display = 'none'
        circle.classList.remove('active')
        resetMouseOperateHandler()
        handler.removeInputAction(SuperMap3D.ScreenSpaceEventType.LEFT_DOWN)
        handler.removeInputAction(SuperMap3D.ScreenSpaceEventType.LEFT_UP)

        // TODO 调用iserver服务查询
        // 可参考 https://www.bilibili.com/read/cv22219129/
      }

      handler.setInputAction(downHandler, SuperMap3D.ScreenSpaceEventType.LEFT_DOWN)
      handler.setInputAction(upHandler, SuperMap3D.ScreenSpaceEventType.LEFT_UP)
    }

    // 地图上move操作
    function mousemoveHandler (SuperMap3D) {
      handler.setInputAction((e) => {
        if (showTooltip) {
          // 点击的位置显示面板
          customPanel.style.left = e.endPosition.x + 20 + 'px'
          customPanel.style.top = e.endPosition.y + 'px'
          customPanel.style.display = 'block'
        }
        if (drawStatus) {
          console.log('move');
          console.log(viewer.scene.pickPosition(e.endPosition));
          end = viewer.scene.pickPosition(e.endPosition)
          radius = getDistanceHandler(center, end)
          drawCircleHandler(radius)
        }
      }, SuperMap3D.ScreenSpaceEventType.MOUSE_MOVE)
    }

    // 绘制圆
    function drawCircleHandler (radius) {
      if (circleEntity) {
        circleEntity.ellipse.semiMinorAxis = new SuperMap3D.CallbackProperty(function () {
          return radius;
        }, false)
        circleEntity.ellipse.semiMajorAxis = new SuperMap3D.CallbackProperty(function () {
          return radius;
        }, false)
      } else {
        circleEntity = viewer.entities.add({
          position: center,
          ellipse: {
            semiMinorAxis: radius,
            semiMajorAxis: radius,
            // height: 0,
            material: SuperMap3D.Color.GREEN.withAlpha(0.5),
            outline: true, // height must be set for outline to display
            // clampToGround: true,
            disableDepthTestDistance: Number.POSITIVE_INFINITY
          }
        })
      }
    }

    // 计算两点之间的距离\半径
    function getDistanceHandler (center, end) {
      // 创建两个世界坐标点
      const point1 = new SuperMap3D.Cartesian3(center.x, center.y, center.z);
      const point2 = new SuperMap3D.Cartesian3(end.x, end.y, end.z);

      // 计算两点之间的距离
      return SuperMap3D.Cartesian3.distance(point1, point2);
    }

    // 设置相机视角,便于查看模型
    function setInitCameraViewHandler () {
      viewer.scene.camera.setView({
        destination: new SuperMap3D.Cartesian3.fromDegrees(114.2158, 22.4169, 419),
        orientation: {
          up: new SuperMap3D.Cartesian3(-0.1629169048778112, 0.7143202157541026, 0.6805914424014209),
          direction: new SuperMap3D.Cartesian3(0.5945902470233576, -0.4793925407032518, 0.6454806194323606),
          heading: 5.899584294129949
        }
      })
    }

    // 错误面板
    function errorPanelHandler (widget, e) {
      if (widget._showRenderLoopErrors) {
        var title = '渲染时发生错误,已停止渲染。'
        widget.showErrorPanel(title, undefined, e)
      }
    }

    // 记录存储初始化时的操作信息
    function setInitOperateInfoHandler () {
      initMouseOperate.zoomEventTypes = JSON.parse(JSON.stringify(viewer.scene.screenSpaceCameraController.zoomEventTypes))
      initMouseOperate.tiltEventTypes = JSON.parse(JSON.stringify(viewer.scene.screenSpaceCameraController.tiltEventTypes))
      initMouseOperate.lookEventTypes = JSON.parse(JSON.stringify(viewer.scene.screenSpaceCameraController.lookEventTypes))
      initMouseOperate.translateEventTypes = viewer.scene.screenSpaceCameraController.translateEventTypes
      initMouseOperate.enableTranslate = viewer.scene.screenSpaceCameraController.enableTranslate
      initMouseOperate.enableTilt = viewer.scene.screenSpaceCameraController.enableTilt
      initMouseOperate.enableZoom = viewer.scene.screenSpaceCameraController.enableZoom
      initMouseOperate.enableRotate = viewer.scene.screenSpaceCameraController.enableRotate
    }

    // 还原鼠标操作
    function resetMouseOperateHandler () {
      viewer.scene.screenSpaceCameraController.tiltEventTypes = initMouseOperate.tiltEventTypes
      viewer.scene.screenSpaceCameraController.lookEventTypes = initMouseOperate.lookEventTypes
      viewer.scene.screenSpaceCameraController.translateEventTypes = initMouseOperate.translateEventTypes
      viewer.scene.screenSpaceCameraController.enableTranslate = initMouseOperate.enableTranslate
      viewer.scene.screenSpaceCameraController.enableTilt = initMouseOperate.enableTilt
      viewer.scene.screenSpaceCameraController.enableZoom = initMouseOperate.enableZoom
      viewer.scene.screenSpaceCameraController.enableRotate = initMouseOperate.enableRotate
      viewer.scene.screenSpaceCameraController.zoomEventTypes = initMouseOperate.zoomEventTypes
    }

    // 禁止鼠标操作
    function disableMouseOperateHandler () {
      viewer.scene.screenSpaceCameraController.zoomEventTypes = []
      viewer.scene.screenSpaceCameraController.tiltEventTypes = []
      viewer.scene.screenSpaceCameraController.lookEventTypes = []
      viewer.scene.screenSpaceCameraController.translateEventTypes = []
      viewer.scene.screenSpaceCameraController.enableTranslate = false
      viewer.scene.screenSpaceCameraController.enableTilt = false
      viewer.scene.screenSpaceCameraController.enableZoom = false
      viewer.scene.screenSpaceCameraController.enableRotate = false
    }

    if (typeof SuperMap3D !== 'undefined') {
      window.startupCalled = true
      onload(SuperMap3D)
    }
  </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1553580.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天学习一点点之注解处理器 APT

APT&#xff08;Annotation Processing Tool&#xff09;是一种处理注解的工具&#xff0c;它能够对源代码文件进行检测并找出其中的注解&#xff0c;然后对其进行额外的处理。由于注解处理过程是在编译时完成的&#xff0c;并不会影响程序的运行时性能。 APT 能做什么&#x…

3D人体姿态估计项目 | 从2D视频中通过检测人体关键点来估计3D人体姿态实现

项目应用场景 人体姿态估计是关于图像或视频中人体关节的 2D 或 3D 定位。一般来说&#xff0c;这个过程可以分为两个部分&#xff1a;(1) 2D 视频中的 2D 关键点检测&#xff1b;(2) 根据 2D 关键点进行 3D 位姿估计。这个项目使用 Detectron2 从任意的 2D 视频中检测 2D 关节…

车载以太网AVB交换机 gptp透明时钟 8口 千兆/百兆可切换 SW1100TR

SW1100TR车载以太网交换机 一、产品简要分析 8端口千兆和百兆混合车载以太网交换机&#xff0c;其中包含2个通道的1000BASE-T1采用罗森博格H-MTD接口&#xff0c;5通道100BASE-T1泰科MATEnet接口和1个通道1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现车载以太网多通道…

【LeetCode】LeetCode 547. 省份数量(Java版 什么是并查集)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、题目描述 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直…

STM32看似无法唤醒的一种异常现象分析

1. 引言 STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性&#xff0c;被广泛用于各类工业产品中&#xff0c;包括一些需要低功耗需求的应用。 2. 问题描述 用户使用 STM32G0B1 作为汽车多媒体音响控制器的控制芯片&#xff0c;用来作为收音机频道存贮…

【有芯职说】数字芯片BES工程师

一、 数字芯片BES工程师简介 今天来聊聊数字芯片BES工程师&#xff0c;其中BES是Back End Support的缩写&#xff0c;就是后端支持的意思。其实这个岗位是数字IC前端设计和数字IC后端设计之间的一座桥&#xff0c;完成从寄存器传输级设计到具体工艺的mapping和实现。这个岗位在…

[flume$1]记录一个启动flume配置的错误

先总结&#xff1a;Flume配置文件后面&#xff0c;不能跟注释 报错代码&#xff1a; [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event. Exception follows. org.apache.flume.EventDeliveryException: Failed to open…

如何在 Mac Pro 上恢复丢失的数据?

无论您多么努力&#xff0c;几乎不可能永远不会无意中删除 Mac 上的文件。当您得知删除后清空了垃圾箱时&#xff0c;您的处境可能看起来很黯淡。不要灰心。我们将教您如何使用本机操作系统功能或数据恢复工具恢复丢失的数据。奇客数据恢复Mac版可帮助恢复已从 Mac Pro 计算机上…

《Vision mamba》论文笔记

原文出处&#xff1a; [2401.09417] Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Vision Mamba: Efficient Visual Representation Learning with Bidirectional St…

YOLOv9 实现多目标跟踪

YOLOv9项目结合了YOLOv9的快速目标检测能力和DeepSORT的稳定跟踪能力&#xff0c;实现了对视频流中多个对象的实时、准确检测和跟踪。在具体应用中&#xff0c;该项目能够对视频中的行人、车辆或其他物体进行实时定位、识别和持续跟踪&#xff0c;即使在复杂环境、对象互相遮挡…

SlerfTools:简化操作,激发Solana生态创新潜能

在区块链世界的快速演变中,Solana生态系统以其独特的高性能吸引了全球的目光。然而,随着生态系统的蓬勃发展,用户和开发者面临的挑战也日渐增多。正是在这样的背景下,一个名为SlerfTools的新星项目应运而生,它承诺将为Solana带来一场革命性的变革。 项目的诞生 SlerfTools并非…

原创度检测工具分享,文章质量检测方便又简单

文章检测有利于我们了解文章内容的质量高低&#xff0c;而在以往我们检测文章只能依靠手动去检测&#xff0c;这是相当消耗工作时间的&#xff0c;但是在原创度检测工具出来之后&#xff0c;很多人开始检测文章质量就改用原创度检测工具了&#xff0c;因为使用原创度检测工具是…

YOLOv5-小知识记录(四)

0. 写在前面 本篇介绍SPP模块、FPN模块模块&#xff0c;主要也是对YOLOv5的内容的补充&#xff1a; Yolo系列算法-理论部分-YOLOv4-CSDN博客 Yolo系列算法-理论部分-YOLOv5-CSDN博客 上一篇&#xff1a; YOLOv5-小知识记录(三)-CSDN博客 1. PANet&#xff08;Path A…

49 el-input 的 模型 视图 双向同步

前言 这里来看一下 el-input 这边的 数据 和 视图的双向绑定 最开始 我以为 这部分的处理应该是 vue 这边实现的, 但是跟踪调试了一下 发现这部分的处理是业务这边 自己实现的 这部分 还是有一些 值得记录的东西, 从这里 要去理解的而是 vue 这边从宏观的框架上面来说 帮我们…

mac系统使用经验

mac安装brew brew是macos下的一个包管理工具&#xff0c;类似与centos的yum&#xff0c;ubuntu的apt-get等。 自动脚本(全部国内地址)&#xff08;在Mac os终端中复制粘贴回车下面这句话) /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/H…

基于CNN-RNN的动态手势识别系统实现与解析

一、环境配置 为了成功实现基于CNN-RNN的动态手势识别系统&#xff0c;你需要确保你的开发环境已经安装了以下必要的库和工具&#xff1a; Python&#xff1a;推荐使用Python 3.x版本&#xff0c;作为主要的编程语言。TensorFlow&#xff1a;深度学习框架&#xff0c;用于构建…

开放平台 - 互动玩法演进之路

本期作者 1. 背景 随着直播业务和用户规模日益壮大&#xff0c;如何丰富直播间内容、增强直播间内用户互动效果&#xff0c;提升营收数据变得更加关键。为此&#xff0c;直播互动玩法应运而生。通过弹幕、礼物、点赞、大航海等方式&#xff0c;用户可以参与主播的直播内容。B站…

书生·浦语大模型实战营(第二期):书生·浦语大模型全链路开源体系

非常开心能够参加到第二期的书生浦语大模型实战营&#xff0c;经过第一期的学习&#xff0c;初步了解了如何使用xtuner对模型进行微调&#xff0c;以及如何部署。遗憾的是没有更加深入学习并实现一个项目&#xff0c;此次学习过程中希望可以更进一步。 大模型称为发展通用人工…

安卓国内ip代理app,畅游网络

随着移动互联网的普及和快速发展&#xff0c;安卓手机已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;由于地理位置、网络限制或其他因素&#xff0c;我们有时需要改变或隐藏自己的IP地址。这时&#xff0c;安卓国内IP代理App便成为了一个重要的工具。虎观代理…

C++——C++11线程库

目录 一&#xff0c;线程库简介 二&#xff0c;线程库简单使用 2.1 传函数指针 ​编辑 2.2 传lamdba表达式 2.3 简单综合运用 2.4 线程函数参数 三&#xff0c;线程安全问题 3.1 为什么会有这个问题&#xff1f; 3.2 锁 3.2.1 互斥锁 3.2.2 递归锁 3.3 原子操作 3…