如何用js代码获取坐标
2026-04-10 17:27
青罗 前台管理员
2026-04-13 09:59

参考以下代码:

// 二次开发API参考 https://www.shanhaibi.com/docs/v1/tx9rigt2ff6e0m1h/


export class SampleExtension {
  /*
   * 定义属性
   * 如果只想在类内部使用属性变量,不需要将属性变量展示在自定义设置项中,
   * 可以把它设置成 Private 属性,JavaScript 用"#"代表 Private 属性
   * 定义的属性可以使用中文名称
   */
  场景 = Element.empty();
  #isLinstenEvent = false;
  #clickObservable = null;
  #scene = null;
  #enableClick = false;
  #stopListenEvent = false;
  #currentPosition = "";
  #updateLineAxisFn = null;

  initEventListen() {
    if (this.#isLinstenEvent) return;
    if (!this.场景?.name) return;

    const { getScene, worldToScreen } = this.场景.getMountedInstance() || {};
    const { pickPositionOnSurface, updateLineAxis } = this.场景._getExtension("pick");
    this.#updateLineAxisFn = updateLineAxis;

    if (!getScene) return;
    this.#isLinstenEvent = true;
    this.#scene = getScene();
    this.#clickObservable = this.#scene.onPointerObservable.add(async (pointerInfo) => {
      if(!this.#enableClick || this.#stopListenEvent) return;
      const { type, event } = pointerInfo;
      const positionStr = await pickPositionOnSurface(pointerInfo.event.offsetX, pointerInfo.event.offsetY);
      if(!positionStr) return;
      const position = JSON.parse(positionStr);

      this.#updateLineAxisFn && this.#updateLineAxisFn(true, position);
      if(type !== 32 || event.button !== 0) return;
      if(event.buttons > 0) return;

      this.#currentPosition = `${position.x},${position.y},${position.z}`;

      this.element.emit("点位点击", {
        position: this.#currentPosition,
      });
      this.#stopListenEvent = true;
    })
  }

  removeEventListen() {
    if (!this.#scene) return;
    if (this.#clickObservable) {
      this.#scene.onPointerObservable.remove(this.#clickObservable);
      this.#clickObservable = null;
    }
    this.#isLinstenEvent = false;
  }

  async init() {
    this.element.addEventListener("开启点击交互", (ev)=>{
      this.#enableClick = true;
      this.#stopListenEvent = false;
    });

    this.element.addEventListener("关闭点击交互", (ev)=>{
      this.#enableClick = false;
      this.#updateLineAxisFn && this.#updateLineAxisFn(false);
    });

    this.initEventListen();
  }
  /**
   * 生命周期函数 组件销毁时调用,一般在此处清空监听事件
   *
   */
  destroy() {
    if (this.#isLinstenEvent) {
      this.removeEventListen();
    }
  }
}

相关问题

设置单点登录的时候,Cert ,Entry 在哪获取,怎么配置?
后端可以用js编辑业务逻辑吧?
我有本地shp数据和GeoJSON数据,但是导入进去后没有显示我的数据
可以写底层或者边缘侧的代码,前端只展示需要关联底层数据?
GeoJSON 文件如何下载
山海鲸鲸孪生中,我要实现通过点击标绘实现阀门的开关操作,当我点击开之后,调用二开代码去网络请求实现阀门的远程控制,这个过程需要时间,我希望当点击开之后,先让标绘显示开启中的动画,应该怎么实现
请求体可以是 json吗?还有就是api连接的请求头可以是动态的吗?
您好请问下载咱们的山海鲸后,想要短信登录,但是点击获取验证码就会在下方弹出“unable to verify the first certificate”,该怎么办?
加载geojson的三维项目,数据更新场景未变化,重新加载后鲸孪生黑屏丢失是什么原因?
我这里导入的geojson的文件,会有3D的立体效果吗,这个geojson的文件和我在鲸地图导入的geojson的文件有区别吗?
扫描关注公众号

更多数字孪生可视化干货内容等你发现

了解更多内容

扫一扫
加入官方微信群
咨询热线0571-88650917
地址 公司 邮箱

杭州市文一西路海创科技中心 311121

杭州多算科技有限公司

support@shanhaibi.com

关注山海鯨官方qq群,了解更多内容

QQ群号:788095444

Copyright © 2020-2026 多算科技, All Rights Reserved. 浙ICP备20006837号-5