3D 地图渲染-区域纹理图添加

news2025/4/11 0:35:24
  1. 引入-初始化地图(关键代码)
// 初始化页面引入高德 webapi -- index.html 文件
<script src = 'https://webapi.amap.com/maps?v=2.0&key=您申请的key值'></script>

// 添加地图容器
<div id='container' ></div>

// 地图初始化应该在地图容器 div 已经添加到 DOM 树之后
 let map = {};
// 初始化背景地图--封装方法
export const mapInit = (
  id = 'index-overView',
  opts = {},
  styleId = 'amap://styles/XXXXXXXXXXXXXXXXXXXXXXXXX'
) => {
  // fc35552908a5c4f34b7330621230b0bd
  // if(Object.keys(map).length === 0){
  // }
  map = new AMap.Map(
    id,
    Object.assign(
      {
        mapStyle: styleId,
        zoom: 8,
        center: [110.412427, 29.303573]
        // pitch: 50,
        // viewMode: '3D',
        // features: ['bg', 'road'],
      },
      opts
    )
  );
  return map;
};

// 初始化
this.map = mapInit('mapContainer2', {
     mask: mask,
     viewMode: '3D',
     pitch: this.pitchList[this.currentAreaList.length - 1],
     zoom: 9.3,
     center: [120.66888, 29.686606],
     features: ['bg', 'road'],
     dragEnable: true,
     zoomEnable: true,
     layers: [imageLayer]
});
  1. 设置3d-这时候只需要给版块添加个wall ,把版块抬起来就可以了(关键代码)
// 添加高度面(只有添加了这个,才会有立体的感觉,这里用2.0版本,Object3DLayer会报错,所以改用1.0版本)
var object3Dlayer = new AMap.Object3DLayer({ zIndex: 1 });
var height = -50000;
var color = '#00C2FF'; //rgba   384C4B — 242D2D  56,76,75  36,45,45    0.2,0.3,0.3   0.15,0.18,0.18
 var wall = new AMap.Object3D.Wall({
          path: bounds,
          height: height,
          color: color
});
wall.transparent = true;
object3Dlayer.add(wall);

this.map.add(object3Dlayer);

//修改当前光照-----重点 这里通过修改光照 能到达更好的立体效果
this.map.AmbientLight = new AMap.Lights.AmbientLight([1, 1, 1], 0.5);
this.map.DirectionLight = new AMap.Lights.DirectionLight(
          [0, 2, -14],
          [1, 1, 1],
          0.5
);
  1. 添加纹理图-将图片放在地图上
    注意:图片一定要按实际比例;图片背景必须透明;图片边界和地图四个点相交,如下图:
    在这里插入图片描述
 // 添加纹理地图
var imageLayer = new AMap.ImageLayer({
     url: require('/src/assets/images/entService-platform/texture.png'),
     // 3d模式下,不要轻易改动 bounds 的经纬度值哈,不然你会后悔的,很难调。2d 下通过获取西南方向,和东北方向的经纬度即可
     bounds: new AMap.Bounds(
     [119.194408, 29.128922],
     [122.143352, 30.943633]
        ),
    zIndex: 2
});

这里面的 bounds 是图片中的左下角坐标,和右上角坐标 ,需要自己计算,调试步骤:
1、通过https://lbs.amap.com/demo/javascript-api-v2/example/district-search/draw-district-boundaries 使用DistrictSearch 绘制城市版块,画出该省市的边界线
2、找到边界线,东西南北的四个顶点坐标, 如上图 标的数字
3、图片左下角坐标 , 是 点1 的经度 和 点2 的纬度
4、图片右上角坐标 , 是 点4 的经度 和 点3 的纬度

这样就得到了bounds 的值
这里四个点通过找到4个点 在拾取器上搜索关键字直接获取到经纬度
点位拾取器
注意:这四个点的坐标,要么计算出来,要么就给地图添加点击事件.通过点击事件获取这四个点的坐标

  1. 完整代码
 initMap() {
      let district = new AMap.DistrictSearch({
        extensions: 'all',
        subdistrict: 1,
        level: this.currentLevel
      });
      district.search(this.activeName, async (status, result) => {
        var districtList = result.districtList[0].districtList;

        var bounds = result.districtList[0]['boundaries'];
        var mask = [];
        this.polygons = [];
        for (var i = 0; i < bounds.length; i++) {
          mask.push([bounds[i]]);
        }
        // 添加纹理地图
        var imageLayer = new AMap.ImageLayer({
          url: require('/src/assets/images/entService-platform/texture.png'),
          // 3d模式下,不要轻易改动 bounds 的经纬度值哈,不然你会后悔的,很难调。2d 下通过获取西南方向,和东北方向的经纬度即可
          bounds: new AMap.Bounds(
            [119.194408, 29.128922],
            [122.143352, 30.943633]mapInit
          ),
          zIndex: 2
        });

        this.map = mapInit('mapContainer2', {
          mask: mask,
          viewMode: '3D',
          pitch: this.pitchList[this.currentAreaList.length - 1],
          zoom: 9.3,
          center: [120.66888, 29.686606],
          features: ['bg', 'road'],
          dragEnable: true,
          zoomEnable: true,
          layers: [imageLayer]
        });

        // 添加高度面(只有添加了这个,才会有立体的感觉,这里用2.0版本,Object3DLayer会报错,所以改用1.0版本)
        var object3Dlayer = new AMap.Object3DLayer({ zIndex: 1 });
        var height = -50000;
        var color = '#00C2FF'; //rgba   384C4B — 242D2D  56,76,75  36,45,45    0.2,0.3,0.3   0.15,0.18,0.18
        var wall = new AMap.Object3D.Wall({
          path: bounds,
          height: height,
          color: color
        });
        wall.transparent = true;
        object3Dlayer.add(wall);

        this.map.add(object3Dlayer);

        //修改当前光照
        this.map.AmbientLight = new AMap.Lights.AmbientLight([1, 1, 1], 0.5);
        this.map.DirectionLight = new AMap.Lights.DirectionLight(
          [0, 2, -14],
          [1, 1, 1],
          0.5
        );

        this.map.clearMap();
        let that = this;
        this.map.on('click', e => {
          that.$emit('closeDatePicker');
          // window.infoWindow.close();
        });

        this.getPolyline(bounds);

        getBounds({ searchName: '绍兴市' }).then(res => {
          this.countiesCenter = res.districtList.map(v => {
            return {
              name: v.name,
              center: [v.center.lng, v.center.lat]
            };
          });
          this.changeMapLevel();
        });
      });
    },
    //添加外围描边--- 外围需要更明显的边界的话 需要单独给外围 描边
    getPolyline(bounds) {
      for (var i = 0; i < bounds.length; i++) {
        new AMap.Polyline({
          path: bounds[i],
          isOutline: true,
          outlineColor: '#CAECF9',
          borderWeight: 3,
          strokeColor: '#69FFFD',
          strokeWeight: 2,
          strokeOpacity: 1,
          map: this.map
        });
      }
    },

补充:高德地图掩模(背景设置透明的前提下)

  • mask 方式
  • 设置卫星图层 new AMap.TileLayer.Satellite({ opacity: 0 })

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

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

相关文章

【Linux】条件变量封装类及环形队列的实现

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

离线部署kubesphere(已有k8s和私有harbor的基础上)

前言说明&#xff1a;本文是在已有k8s集群和私有仓库harbor上进行离线安装kubesphere&#xff1b;官网的离线教程写都很详细&#xff0c;但是在部署部份把搭建集群和搭建仓库也写一起了&#xff0c;跟着做踩了点坑&#xff0c;这里就记录下来希望可以帮助到需要的xdm。 1.根据官…

非阻塞IO,fcntl,多路转接,select,poll,epoll,reactor

IO次数会影响程序的效率&#xff0c;在编程中往往会尽量减少IO次数&#xff0c;用以提高程序的效率&#xff0c;例如缓冲区,就是减少IO次数提高效率的一种方式&#xff1b;而IO影响效率的最大原因其实是因为IO等拷贝&#xff0c;在进行IO时往往需要拷贝的数据就绪&#xff0c;或…

Redis常用的数据结构及其使用场景

字符串(String) string 是 redis 最基本的类型&#xff0c;你可以理解成与 Memcached 一模一样的类型&#xff0c;一个 key 对应一个 value。 string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据&#xff0c;比如jpg图片或者序列化的对象。 string 类型是 R…

PhotoShop学习04

1.背景图层 最下面的被锁锁住的图层为背景图层&#xff0c;背景图层充当整个图层的背景&#xff0c;名字标注为背景&#xff0c;无法修改背景图层的排序始终位于图层最底部。 当我想把上方的图层移动到背景图层之后&#xff0c;发现无法移动图层无法移动&#xff0c;把背景图层…

服务器有2张显卡,在别的虚拟环境部署运行了Xinference,然后又建个虚拟环境再部署一个可以吗?

环境: 云服务器Ubuntu系统 2张 NVIDIA H20 96GB Qwen2.5-VL-72B-Instruct-AWQ Qint4量化 AWQ 是 “Activation - Aware Weight Quantization” 的缩写,即激活感知权重量化。它是一种针对大型模型的先进量化算法,通过在权重量化过程中引入对激活值的感知,最小化量化误差…

K8s中CPU和Memory的资源管理

资源类型 在 Kubernetes 中&#xff0c;Pod 作为最小的原子调度单位&#xff0c;所有跟调度和资源管理相关的属性都属于 Pod。其中最常用的资源就是 CPU 和 Memory。 CPU 资源 在 Kubernetes 中&#xff0c;一个 CPU 等于 1 个物理 CPU 核或者一个虚拟核&#xff0c;取决于节…

任务挂起和恢复

任务挂起和恢复API函数 下面用按键和震动传感器验证任务挂起和恢复API函数&#xff1a; PA7接震动传感器&#xff0c;按键引脚为PA0&#xff0c;提前初始化好GPIO引脚 key.c #include "key.h" #include "stm32f10x.h"void KeyInit() {GPIO_InitTypeDef …

【NLP 55、投机采样加速推理】

目录 一、投机采样 二、投机采样改进&#xff1a;美杜莎模型 流程 改进 三、Deepseek的投机采样 流程 Ⅰ、输入文本预处理 Ⅱ、引导模型预测 Ⅲ、候选集筛选&#xff08;可选&#xff09; Ⅳ、主模型验证 Ⅴ、生成输出与循环 骗你的&#xff0c;其实我在意透了 —— 25.4.4 一、…

如何在 Windows 上安装 Python

Python是一种高级编程语言&#xff0c;由于其简单性、多功能性和广泛的应用范围而变得越来越流行。如何在 Windows 操作系统中安装 Python 的过程相对简单&#xff0c;只需几个简单的步骤。 本文旨在指导您完成在 Windows 计算机上下载和安装 Python 的过程。 如何在 Windows…

selectdb修改表副本

如果想修改doris&#xff08;也就是selectdb数据库&#xff09;表的副本数需要首先确定是否分区表&#xff0c;当前没有数据字典得知哪个表是分区的&#xff0c;只能先show partitions看结果 首先&#xff0c;副本数不应该大于be节点数 其次&#xff0c;修改期间最好不要跑业务…

Metabase:一个免费开源的BI平台

今天给大家介绍一个开源数据可视化分析工具&#xff1a;Metabase。它可以帮助用户快速连接数据库、执行查询并创建交互式仪表盘&#xff0c;即使非技术人员也能快速上手。 Metabase 支持多种数据源&#xff0c;包括 MySQL、PostgreSQL、Oracle、SQL Server、SQLite、MongoDB、P…

第15届蓝桥杯省赛python组A,B,C集合

过几天就省赛了&#xff0c;一直以来用的是C&#xff0c;Python蓝桥杯也是刚刚开始准备&#xff08;虽然深度学习用的都是python&#xff0c;但是两者基本没有任何关系&#xff09;&#xff0c;这两天在做去年题时犯了很多低级错误&#xff0c;因此记录一下以便自己复查 PS&am…

为什么有的深度学习训练,有训练集、验证集、测试集3个划分,有的只是划分训练集和测试集?

在机器学习和深度学习中&#xff0c;数据集的划分方式取决于任务需求、数据量以及模型开发流程的严谨性。 1. 三者划分&#xff1a;训练集、验证集、测试集 目的 训练集&#xff08;Training Set&#xff09;&#xff1a;用于模型参数的直接训练。验证集&#xff08;Validati…

虚拟现实 UI 设计:打造沉浸式用户体验

VR UI 设计基础与特点 虚拟现实技术近年来发展迅猛&#xff0c;其独特的沉浸式体验吸引了众多领域的关注与应用。在 VR 环境中&#xff0c;UI 设计扮演着至关重要的角色&#xff0c;它是用户与虚拟世界交互的桥梁。与传统 UI 设计相比&#xff0c;VR UI 设计具有显著的特点。传…

前端Uniapp接入UviewPlus详细教程!!!

相信大家在引入UviewPlusUI时遇到很头疼的问题&#xff0c;那就是明明自己是按照官网教程一步一步的走&#xff0c;为什么到处都是bug呢&#xff1f;今天我一定要把这个让人头疼的问题解决了&#xff01; 1.查看插件市场 重点&#xff1a; 我们打开Dcloud插件市场搜素uviewPl…

【性能优化点滴】odygrd/quill在编译期做了哪些优化

Quill 是一个高性能的 C 日志库&#xff0c;它在编译器层面进行了大量优化以确保极低的运行时开销。以下是 Quill 在编译器优化方面的关键技术和实现细节&#xff1a; 1. 编译时字符串解析与格式校验 Quill 在编译时完成格式字符串的解析和校验&#xff0c;避免运行时开销&…

02 反射 泛型(II)

目录 一、反射 1. 反射引入 2. 创建对象 3. 反射核心用法 二、泛型 1. 泛型的重要性 &#xff08;1&#xff09;解决类型安全问题 &#xff08;2&#xff09;避免重复代码 &#xff08;3&#xff09;提高可读性和维护性 2. 泛型用法 &#xff08;1&#xff09;泛型类 …

元宇宙浪潮下,前端开发如何“乘风破浪”?

一、元宇宙对前端开发的新要求 元宇宙的兴起&#xff0c;为前端开发领域带来了全新的挑战与机遇。元宇宙作为一个高度集成、多维互动的虚拟世界&#xff0c;要求前端开发不仅具备传统网页开发的能力&#xff0c;还需要掌握虚拟现实&#xff08;VR&#xff09;、增强现实&#…

2025年3月 Scratch 图形化(二级)真题解析 中国电子学会全国青少年软件编程等级考试

2025.03Scratch图形化编程等级考试二级真题试卷 一、选择题 第 1 题 甲、乙、丙、丁、戊五人参加100米跑比赛&#xff0c;甲说:“我的前面至少有两人&#xff0c;但我比丁快。”乙说:“我的前面是戊。”丙说:“我的后面还有两个人。”请从前往后&#xff08;按照速度快慢&a…