高德地图+threejs打造智慧景区大屏

原文地址

前言

本项目是一个智慧景区(商场)项目,项目主旨在于对景区的智能化管理,是对AI赋能的具象化,告别传统后台管理模式,从大屏中可以实现一个完整景区(商场)的集中化管理,可以对景区内部设施,店铺、人流量和人物画像进行精准分析。也可以配合智能相机、智慧消防对景区(商场)内的人防安全进行远程管理,现在杭州的景区公共卫生间也都实现智能化,甚至你可以在游客端(模拟的,现在所有内容都在同一个大屏)看到距离你最近的卫生间还剩几个坑儿,景区智慧大屏只是一个载体,集成的智慧体越多,大屏的功能就越强大。

本项目代码使用umi+react+高德地图amap+threejs开发的一款景区管理项目,其中模型使用svg文件并嵌入高德地图中,实现新增景区、绑定店铺、绑定点位设施等功能,使用高德地图的导航功能,可以直接导航到景区内。页面内容包含景区的创建和景区大屏展示,在大屏展示中可以对商铺和点位进行绑定,另页面中集成了coze的ai智能系统,可进行对话,绑定商铺活动或者一些可自动化生产的内容,将在视频演示中详细讲解。

视频介绍地址

jvideo

源码下载

体验地址

下面跟着作者一步一步来实现吧~

技术栈

  • 高德地图AMAP
  • THREE.JS
  • indexDB
  • react + UMI

环境

  • nodejs: v18.19.0
  • umi: 4.1.8
  • react: 18.0.33
  • threejs: 0.152.2
  • @amap/amap-jsapi-loader: “^1.0.1”

高德地图部分

@amap/amap-jsapi-loader 是高德官网提供的地图JSAPI加载器,可以避免多种异步加载API的错误用法

创建高德地图实例

import AMapLoader from '@amap/amap-jsapi-loader';
export const CreateAMap = () => {
   
    return new Promise((resolve, reject) => {
   
        // 申请好的Web端开发者Key,首次调用 load 时必填
        AMapLoader.load({
   
            "key": "**************", 
            "version": "2.0",
             // 需要使用的的插件列表,如比例尺'AMap.Scale'等,
            "plugins": ["AMap.Walking", "AMap.Driving"],
            "Loca": {
   
                version: '2.0.0'
            },
          
        }).then(async (res) => {
   
            resolve(res)
        }).catch((error) => {
   
            reject(error)
        })
    })

}

在使用高德地图的时候,需要成为开发者并创建一个 Key,在构建AMAP实例还需要以下几个必要的元素,版本号2.0,plugins插件,项目中用到了AMap.Walking 步行规划,当然你可以加入自己想要的插件,比如AMap.Driving 驾驶路线规划。Loca是用于可视化内容的,比如灯光、镜头、路径等元素。

现在地图实例创建好了,那么我们开始创建地图,首先我这里选择的主题是系统默认的黑色3d主题地图,如果想要一个完全属于自己风格的地图可以在官网的 自定义地图服务中创建(需要额度)

调用

useAsyncEffect(async () => {
   
    AMapRef.current = await CreateAMap()
    if (containerRef.current) {
   
        createMap()
    }
}, [])

将AMAP实例存放在AMapRef.current中,在后面的方法中都可以使用,并且在containerRef.current存在的时候绘制地图,containerRef.current是将要绘制地图的容器,id为container

绘制地图

在实例创建好以后就该绘制地图了,绘制地图使用实例中的 AMAP.Map方法,接受两个参数,第一个是地图容器,第二个是配置项:new AMap.Map(div: (String | HTMLDivElement), opts: MapOptions)

const createMap = async () => {
   
    let AMap = AMapRef.current
    // 创建地图
    var map = new AMap.Map("container", {
   
        resizeEnable: true,
        center: [119.986, 30.2235],//地图中心点
        zoom: 17.4, //地图显示的缩放级别
        viewMode: '3D',//开启3D视图,默认为关闭
        buildingAnimation: true,//楼块出现是否带动画
        pitch: 45,
        rotation: 45,
        features: ['bg', 'building'], // 只显示建筑、道路、区域
        // showLabel: false,  // 隐藏标注信息
        mapStyle: "amap://styles/grey",
        showIndoorMap: false,
        // rotateEnable: false,
        // pitchEnable: false,
        zIndex: 9
    });
    mapRef.current = map

    var loca = new (window as any).Loca.Container({
   
        map,
        zIndex: 9
    });
    locaRef.current = loca

    ……
}

以上配置项都是基础需要配置的,可以参照官网上面的介绍进行配置,这里需要说明一点是featuresviewMode一个是过滤标注信息,项目中去掉了其他的元素,只展示了建筑和背景,而mapStyle则是官网提供的一个3d黑色主题的风格,当然,你用自己的自定义地图生成的地址也可以放在这里,下面从图中看一下具体创建出一个什么样的地图

绘制地图1.jpg

从图中可以看到一个类似矩形的区域,那个就是本次要做的景区——闲林埠,下一步就是要将自制的景区模型加载到高德地图中

首先说明,本人不是UI,只是一个技术死宅,对于美术上的事儿一窍不通,在做的过程中,就有一种感觉,我加入的3d景区,还不如高德原本的模型好看~,勿喷

清除多余楼块

从地图中可以看出,3d地图中已经存在了很多默认的模型,那么咱们如果将自己的模型加入进去就会互相影响,所以我们首先要做的就是清除景区区域原有的模型 使用高德提供的官方图层AMap.Buildings,在官网中可以找到围栏的功能styleOpts.areas,去除原有模块就使用这个api实现的。

export const cleanBuild = (AMap: any, map: 
### Three.js 开发示例教程 #### 一、Three.js 基础入门 学习 Three.js 需要不断实践并积累经验。可以通过阅读官方文档、参与在线课程以及完成实际项目来提升技能[^1]。对于初学者来说,了解其核心概念非常重要,例如场景(Scene)、相机(Camera)和渲染器(Renderer),这些构成了 Three.js 的基础框架。 #### 二、结合高德地图实现景区 为了创建一个功能强景区展示系统,可以将高德地图与 Three.js 进行集成。这种方法能够提供高度互动性的用户体验,并支持显示复杂的三维地理信息模型。具体实施过程如下: - **初始化项目环境**: 设置好必要的依赖项和技术栈。 - **集成高德地图API**: 使用高德的地图服务作为底层数据源。 - **配置 Three.js 3D 场景**: 构建虚拟空间以承载所有的视觉元素。 - **融合两者优势**: 将二维地图视图转换成三维立体表现形式。 - **增强用户交互体验**: 加入手势控制或其他输入方式让操作更加直观便捷。 - **最后一步——优化和完善**: 对整体性能进行调整确保流畅运行同时考虑跨平台兼容性等问题[^2]。 #### 三、适配及相关技术要点 在构建型显示应用时还需要注意几个方面: - **幕分辨率处理**:根据不同设备尺寸自动调节画面比例保持最佳观看效果; - **路径/视角漫游设计**:规划合理的浏览路线引导观众探索整个演示内容; - **引入天空盒(Skybox)** :营造逼真的外部环境氛围增加沉浸感; - **关注程序执行效率**:减少不必要的计算负担提高帧率稳定性; 此外,在某些特殊场合下可能还会涉及更高级别的定制需求比如模拟天气变化或者加入粒子特效等等[^3]。 #### 四、案例分享 - 赛博朋克风格数字地球 下面这个例子展示了如何采用现代前端技术和图形学原理共同打造出极具未来科技气息的作品。“赛博朋克2077”主题下的全球地形可视化界面不仅外观惊艳而且具备丰富的功能性模块可供开发者参考借鉴: 主要特性包括但不限于以下几个部分: - 应用了 `THREE.Spherical` 来定义球形坐标从而精确描绘星球表面特征; - 利用自定义着色器(Shaders)配合缓动函数(TWEEN library)制作动态飞行轨迹线条(Flying Lines); - 导入调试面板(dat.GUI)方便快速修改参数测试不同组合方案的效果呈现; - CSS 属性如 clip-path 达到裁剪图像边界形成独特轮廓形状的目的; - ECharts 插件负责统计图表绘制满足业务数据分析报表的要求; - radial-gradient 方法生成环状渐变图案适用于仪表盘指示区域填充颜色过渡自然美观方; - GlitchPass 特效插件增添随机闪烁干扰现象模仿电子信号失真艺术手法; 完整代码片段如下所示 (仅截取部分内容): ```javascript // 初始化场景对象 const scene = new THREE.Scene(); // 定义摄像机角度范围 camera.position.set(0, 0, 5); // 创建WebGLRenderer实例绑定至DOM容器内 renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); function animate() { requestAnimationFrame(animate); // 循环调用自身刷新画面 renderer.render(scene, camera); // 执行绘图命令输出最终成果 } animate(); ``` 以上仅为简化版示范仅供参考实际运用当中还需依据具体情况灵活调整各项设置参数[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙华鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值