ArcGIS JSAPI 高级教程 - 创建渐变色材质的自定义几何体

    • 核心代码
    • 完整代码
    • 在线示例

工作中遇到一个比较复杂的功能,其中用到渐变色,于是研究了一下,发现虽然 JS API 不直接支持渐变色,但是也可以自定义创建渐变色,通过 Mesh 自定义顶点、索引来实现。

这里简单介绍一下原理,并且提供在线渐变色示例。

在这里插入图片描述

本文包括 核心代码、完整代码以及在线示例


核心代码

介绍一下原理:首先通过 canvas 创建渐变色,可以选择两个颜色或者多个颜色。

根据想要创建的几何体,构建顶点和索引数据,简单图形的话,根据经验即可,如果是复杂几何体,

可以通过一些工具来获取,然后通过 Mesh 创建几何体对象即可,最终添加到地图中。

// 创建渐变色
function createLinearGradient() {const canvas = document.createElement("canvas");const width = 32 * 32;const height = 32 * 32;canvas.width = width;canvas.height = height;const ctx = canvas.getContext("2d");ctx.globalAlpha = globalAlpha;// Create the linear gradient with which to fill the canvasconst gradient = ctx.createLinearGradient(0, 0, width, 0);// 这里创建三个渐变色,可随意调整gradient.addColorStop(0, "#0000ff");gradient.addColorStop(0.5, "#ff0000");gradient.addColorStop(1, "#ffffff");// Fill the canvas with the gradient patternctx.fillStyle = gradient;ctx.fillRect(0, 0, width, height);return canvas;
}const uv = 1;// 材质
const material = {colorTexture: {data: createLinearGradient(),wrap: 'clamp'},
};// 创建 box
const mesh = new Mesh({// 顶点属性vertexAttributes: {position: cameraPositionGeographic,uv: [0, 0,uv, 0,uv, 0,uv, 0,uv, 0,]},// 三角面材质纹理components: [{faces: [0, 2, 1],material},{faces: [0, 2, 3],material},{faces: [0, 3, 4],material},{faces: [0, 4, 1],material},{faces: [1, 2, 4],material: {color: "transparent"}},{faces: [2, 3, 4],material: {color: "transparent"}}],spatialReference,
})

完整代码


<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no"><title>ArcGIS JS API mesh 自定义几何渐变色示例</title><style>html, body, #viewDiv {padding: 0;margin: 0;height: 100%;width: 100%;}</style><!-- 引入ArcGIS JS API样式和脚本 --><link rel="stylesheet" href="https://js.arcgis.com/4.28/esri/themes/light/main.css"><script src="https://js.arcgis.com/4.28/"></script><script>require(["esri/Map","esri/views/SceneView","esri/WebScene","esri/geometry/Mesh","esri/geometry/Point","esri/geometry/SpatialReference","esri/Graphic",], function (Map, SceneView, WebScene, Mesh, Point, SpatialReference, Graphic,) {const view = new SceneView({container: "viewDiv",map: new Map({basemap: "hybrid",}),});const spatialReference = SpatialReference.WebMercator;// 视椎体顶点const cameraPositionGeographic = [12121597.211481025, 4060392.3041098495, 673.0166350845248, 12121688.817691227, 4060067.135944337, 825.3678379664198, 12121265.251479909, 4060329.6045611626, 825.3678379654884, 12121245.121950569, 4060297.137362419, 571.5452030794695, 12121668.70426917, 4060034.659804911, 571.5452030794695]// 透明度const globalAlpha = 0.7;// 创建渐变色function createLinearGradient() {const canvas = document.createElement("canvas");const width = 32 * 32;const height = 32 * 32;canvas.width = width;canvas.height = height;const ctx = canvas.getContext("2d");ctx.globalAlpha = globalAlpha;// Create the linear gradient with which to fill the canvasconst gradient = ctx.createLinearGradient(0, 0, width, 0);// 这里创建三个渐变色,可随意调整gradient.addColorStop(0, "#0000ff");gradient.addColorStop(0.5, "#ff0000");gradient.addColorStop(1, "#ffffff");// Fill the canvas with the gradient patternctx.fillStyle = gradient;ctx.fillRect(0, 0, width, height);return canvas;}const uv = 1;// 材质const material = {colorTexture: {data: createLinearGradient(),wrap: 'clamp'},};// 创建 boxconst mesh = new Mesh({// 顶点属性vertexAttributes: {position: cameraPositionGeographic,uv: [0, 0,uv, 0,uv, 0,uv, 0,uv, 0,]},// 三角面材质纹理components: [{faces: [0, 2, 1],material},{faces: [0, 2, 3],material},{faces: [0, 3, 4],material},{faces: [0, 4, 1],material},{faces: [1, 2, 4],material: {color: "transparent"}},{faces: [2, 3, 4],material: {color: "transparent"}}],spatialReference,})const conusGraphic = new Graphic({// 缩放至矩阵范围geometry: mesh,symbol: {type: "mesh-3d",symbolLayers: [{type: "fill",},],},});// 将圆柱体添加到视图view.graphics.add(conusGraphic);// 当视图加载完成后执行view.when(() => {// 将视图缩放到圆柱体范围view.goTo({target: mesh,tilt: 90,heading: 150}, {duration: 1500});});});</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>

在这里插入图片描述


在线示例

ArcGIS Maps SDK for JavaScript 在线示例:创建渐变色材质的自定义几何体

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不增加 GPU,首 Token 延迟下降 50%|LLM 服务负载均衡的新实践

作者&#xff1a;钰诚 简介 传统的负载均衡算法主要设计用于通用的 Web 服务或微服务架构中&#xff0c;其目标是通过最小化响应时间、最大化吞吐量或保持服务器负载平衡来提高系统的整体效率&#xff0c;常见的负载均衡算法有轮询、随机、最小请求数、一致性哈希等。然而&am…

《Linux内存管理:实验驱动的深度探索》【附录】【实验环境搭建 7】【使用buildroot方式构建文件系统】

1. 使用Buildroot 构建的优势 使用 Buildroot 构建 rootfs 的优点在于 快速、简洁、可裁剪、可重复&#xff0c;特别适合 中小型嵌入式 Linux 项目&#xff08;如车机、路由器、工业控制设备、IoT 网关&#xff09;。它帮助开发者避免繁琐的手动编译和集成工作&#xff0c;专注…

一洽客服系统:网页咨询入口设置

一洽客服系统提供了灵活的网页咨询入口设置&#xff0c;旨在为用户提供多样化的咨询类别选择&#xff0c;并根据用户的需求接入指定的路由线路。以下是该功能的详细说明&#xff1a;一、网页咨询入口设置针对用户的不同业务提供不同的咨询类别选择&#xff0c;用户选择业务后接…

Apache Flink错误处理实战手册:2年生产环境调试经验总结

作者&#xff1a;_Naci Simsek 前言 在流处理领域&#xff0c;Apache Flink 已经成为企业级实时数据处理的首选框架。然而&#xff0c;在生产环境中&#xff0c;开发者和运维人员经常会遇到各种看似神秘的问题。基于过去两年中大量客户在真实场景中的使用案例&#xff0c;可以观…

嵌入式开发学习 C++:day01

C概述 C诞生 1972年前后&#xff0c;计算机先驱丹尼斯里奇开始设计C语言并用它来重写Unix系统&#xff0c;里奇的这个决定催生了计算机领域最石破天惊的两门重炮:Unix和C&#xff0c;这两者都是IT产业中鼻祖级的存在&#xff0c;Unix是现代苹果系统和Linux系统的最初来源&#…

LeaferJS创建支持缩放、平移的画布,并绘制简单图形

文章目录介绍原生JS使用LeaferJS的简单示例原生JS使用LeaferJS并支持缩放平移画布Vue中使用LeaferJS并支持缩放平移介绍 LeaferJS官网&#xff1a;https://www.leaferjs.com/ 官方快速上手的教程地址&#xff1a;https://www.leaferjs.com/ui/guide/install/ui/start.html 原…

JumpServer 堡垒机部署与 SSH 公钥接入服务器教程

前言&#xff1a;在企业运维场景中&#xff0c;服务器的安全访问与操作管控至关重要。JumpServer 作为开源堡垒机的典型代表&#xff0c;凭借集中管控、权限精细分配、操作全链路审计等核心能力&#xff0c;成为保障运维安全合规的关键工具。 无论是中小企业简化运维权限管理&a…

TensorFlow 面试题及详细答案 120道(21-30)-- 模型构建与神经网络

《前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。 前后端面试题-专栏总目录 文章目录 一、本文面试题目录 21. TensorFlow中构建神经…

Qt图片上传系统的设计与实现:从客户端到服务器的完整方案

文章目录系统架构概览核心组件解析1. ImageUploadWorker&#xff1a;上传任务的执行者关键方法解析2. ImageUploadManager&#xff1a;线程的"指挥官"3. ImageUploader&#xff1a;网络通信的"信使"4. 服务器端&#xff1a;图片的"收纳箱"关键技…

MySQL InnoDB vs MyISAM

MySQL 两种引擎&#xff08;InnoDB vs MyISAM&#xff09;核心区别事务与锁机制‌‌特性‌‌InnoDB‌‌MyISAM‌‌事务支持‌支持 ACID 事务&#xff08;原子性、一致性、隔离性、持久性&#xff09;&#xff0c;适用于需强数据一致性的场景&#xff08;如金融交易&#xff09;…

软件定义汽车(SDV)调试——如何做到 适配软件定义汽车(SDV)?(上)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

windows下 docker desktop 清理ext4.vhdx文件 并缩小ext4.vhdx文件

1、路径C:\Users\Administrator\AppData\Local\Docker\wsl\dataext4.vhdx 清理之前30多G&#xff0c;现在只有不到2个G2、清理命令# 1、清‌清理悬空镜像和缓存‌ docker image prune -f # 删除未被引用的镜像层 docker builder prune -f # 清理构建缓存# 2、压缩虚拟磁盘&a…

超越ChatBI!深度解析衡石HENGSHI SENSE 6.0如何实现全流程AI赋能

在数据智能领域风起云涌的2025年&#xff0c;“ChatBI”已成为一个炙手可热却又令人疲惫的概念。市场上充斥着各式各样的问答式BI工具&#xff0c;它们虽然带来了交互的新颖体验&#xff0c;却往往局限于“问答”这一单一环节&#xff0c;无法解决数据从整合到洞察的全链路痛点…

Apple Silicon Mac 上解决 Docker 平台不匹配和 QEMU 段错误问题

问题概述 许多用户在 Apple Silicon (M1/M2) Mac 上尝试运行 W3AF Docker 镜像时遇到了以下错误: WARNING: The requested images platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested qemu: uncau…

如何借助文档控件 TX Text Control 轻松优化 PDF 文件大小?

在数字文档的日常使用中&#xff0c;PDF 文件的体积大小直接影响存储空间、传输速度和打开体验。尤其是在包含大量图片、图表或字体资源的文档中&#xff0c;文件往往会变得非常庞大。 文档处理控件TX Text Control 为开发者提供了多种可配置的工具与策略&#xff0c;帮助在不同…

[身份验证脚手架] 前端认证与个人资料界面

第2章&#xff1a;前端认证与个人资料界面 欢迎回来&#xff0c;未来的Web开发者&#xff01;在前一章中&#xff0c;我们学习了breeze:install命令如何为您的Laravel应用设置用户认证基础。您选择了一个"前端技术栈"(如Blade、React、Vue或Livewire)并运行了一些命…

RabbitMQ、RocketMQ 和 ActiveMQ 三种主流消息队列的详细部署安装指南

RabbitMQ、RocketMQ 和 ActiveMQ 三种主流消息队列的详细部署安装指南 RabbitMQ、RocketMQ 和 ActiveMQ 三种主流消息队列的详细部署安装指南。 一、RabbitMQ 部署安装 RabbitMQ 用 Erlang 语言编写,推荐使用官方提供的 Docker 镜像或包管理器安装。 方法一:使用 Docker (…

vue新增用户密码框自动将当前用户的密码自动填充的问题

1.问题 新增店铺的时候&#xff0c;设置管理员账号&#xff0c;输入框已将当前登录用户的密码填充上了解决方式 在el-input输入框类型为password的上增加参数autocomplete“new-password”<el-form-item :label"$t(storeList.password)" prop"shopUserPasswo…

设计模式:工厂模式(Factory Pattern)

文章目录一、工厂模式简介二、简单工厂模式的概念三、工厂方法模式的概念四、抽象工厂模式的概念一、工厂模式简介 工厂模式是一种创建型设计模式&#xff0c;主要解决对象创建 的问题。它的核心思想是&#xff1a;把对象的创建和使用分离&#xff0c;让使用者不直接依赖具体类…

【Qt调试】断点时,Expressions不能查看变量

环境Qt版本&#xff1a;6.9.1问题Qt creator进入断点&#xff0c;Expressions不能查看变量&#xff08;类型&#xff1a;int&#xff09;的值&#xff0c;而局部变量可以查看。解决方法调试器/CDB&#xff0c;勾选【Use Python dumper】