讲师中心 微信公众号
AI工具推荐 视频效率加速

ArcGIS JavaScript API中Web样式与图形图层的动态旋转实现

胖宇大大_2424

胖宇大大_2424

发布时间:2025-12-02 12:21:32

|

590人浏览过

|

来源于php中文网

原创

ArcGIS JavaScript API中Web样式与图形图层的动态旋转实现

本教程详细介绍了如何在arcgis javascript api中利用`simplerenderer`的`rotation`视觉变量,根据数据属性(如gps航向)动态旋转web样式符号。通过配置`valueexpression`引用数据字段,开发者可以轻松实现车辆、传感器等地图元素的实时方向展示,提升地图应用的交互性和信息表达能力。

在地理信息系统(GIS)应用中,经常需要将地图上的符号(如车辆、飞机、传感器)根据其运动方向或朝向进行旋转,以更直观地表达其状态。ArcGIS JavaScript API 提供了一种强大且灵活的机制来实现这一目标,即通过渲染器(Renderer)的视觉变量(Visual Variables)功能,特别是rotation类型。本教程将深入探讨如何利用WebStyleSymbol和SimpleRenderer结合rotation视觉变量,实现图形图层的动态旋转。

1. 理解Web样式符号与渲染器

在ArcGIS JavaScript API中,WebStyleSymbol允许我们使用Esri提供的丰富符号库,这些符号通常具有高质量的渲染效果。当我们需要将这些符号绘制到地图上时,通常会用到渲染器(Renderer)。渲染器负责定义图层中要素的显示方式,包括颜色、大小、透明度以及本教程关注的——旋转。

SimpleRenderer是一种常见的渲染器类型,它为图层中的所有要素应用相同的符号。然而,通过结合visualVariables,SimpleRenderer可以根据要素的属性动态调整符号的某些视觉特性。

2. 使用rotation视觉变量实现符号旋转

rotation视觉变量是visualVariables数组中的一个特殊类型,专门用于控制符号的旋转角度。它通常与valueExpression属性一起使用,valueExpression允许您指定一个表达式,该表达式将根据要素的属性计算出旋转角度。

Doc To HTML
Doc To HTML

使用 MinerU 文档处理引擎将 Word 文档(.doc、.docx)转换为保留结构和格式的干净 HTML。

下载

立即学习Java免费学习笔记(深入)”;

核心概念:

  • type: "rotation": 指定这是一个旋转视觉变量。
  • valueExpression: 一个Arcade表达式字符串,用于从要素属性中获取旋转值。例如,如果您的要素有一个名为heading的属性表示航向,则可以使用"$feature.heading"。
  • rotationType (可选): 定义旋转的参考点,默认为arithmetic(顺时针从东向0度开始),也可以是geographic(顺时针从北向0度开始)。

3. 实现步骤与代码示例

以下代码示例将演示如何创建一个包含Web样式符号的FeatureLayer,并使用SimpleRenderer的rotation视觉变量根据模拟的航向数据进行旋转。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
    <title>动态旋转Web样式符号教程</title>

    <style>
        html,
        body,
        #viewDiv {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
        }
        #controls {
            position: absolute;
            top: 10px;
            left: 10px;
            background-color: white;
            padding: 10px;
            border-radius: 5px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.2);
            z-index: 10;
        }
    </style>

    <link rel="stylesheet" href="https://js.arcgis.com/4.28/esri/themes/light/main.css" />
    <script src="https://js.arcgis.com/4.28/"></script>
</head>

<body>
    <div id="controls">
        当前旋转角度: <span id="rotationValue">0</span>°
        <button id="rotatePlus45Button">旋转 +45°</button>
    </div>
    <div id="viewDiv"></div>

    <script>
        require([
            "esri/Map",
            "esri/views/MapView",
            "esri/layers/FeatureLayer",
            "esri/Graphic",
            "esri/renderers/SimpleRenderer",
            "esri/symbols/WebStyleSymbol"
        ], (Map, MapView, FeatureLayer, Graphic, SimpleRenderer, WebStyleSymbol) => {

            // 1. 定义地图和视图
            const map = new Map({
                basemap: "satellite" // 使用卫星底图
            });

            const view = new MapView({
                container: "viewDiv",
                map: map,
                zoom: 15,
                center: [-101.94981250000075, 41.20977753557709], // 初始中心点
            });

            // 2. 创建一个Web样式符号
            const carSymbol = new WebStyleSymbol({
                styleName: "EsriRealisticTransportationStyle", // 使用交通工具样式库
                name: "BMW_3-Series", // 选择一个宝马3系汽车符号
                // 也可以使用其他符号,例如:
                // styleName: "Esri2DPointSymbolsStyle",
                // name: "ferry"
            });

            // 3. 创建一个FeatureLayer的源数据(一个模拟的汽车点)
            // 注意:这里我们为Graphic添加了一个'heading'属性
            let currentHeading = 0; // 初始航向

            const carGraphic = new Graphic({
                geometry: {
                    type: "point",
                    x: -101.94981250000075,
                    y: 41.20977753557709
                },
                attributes: {
                    ObjectID: 1, // FeatureLayer需要ObjectID
                    heading: currentHeading // 模拟的航向数据
                }
            });

            // 4. 定义渲染器,并应用rotation视觉变量
            // rotationType: "geographic" 表示0度朝北,顺时针旋转
            const createCarRenderer = (heading) => {
                return new SimpleRenderer({
                    symbol: carSymbol,
                    visualVariables: [
                        {
                            type: "rotation",
                            // valueExpression直接引用graphic的heading属性
                            // 也可以是 `$feature.heading` 如果数据源是FeatureLayer
                            valueExpression: `${heading}`, // 这里我们直接使用传入的heading值
                            rotationType: "geographic" // 0度朝北,顺时针旋转
                        }
                    ]
                });
            };

            // 5. 创建FeatureLayer
            // 注意:FeatureLayer通常用于处理来自服务的数据,但也可以通过'source'属性接收Graphic数组
            const carsLayer = new FeatureLayer({
                source: [carGraphic], // 将汽车Graphic作为图层源
                objectIdField: "ObjectID", // 必须指定ObjectID字段
                renderer: createCarRenderer(currentHeading) // 初始渲染器
            });

            // 将图层添加到地图
            map.add(carsLayer);

            // 6. 动态更新旋转角度的交互功能
            document.getElementById("rotatePlus45Button").addEventListener("click", () => {
                currentHeading = (currentHeading + 45) % 360; // 每次增加45度,并保持在0-359范围内
                document.getElementById("rotationValue").innerHTML = currentHeading;

                // 更新FeatureLayer的渲染器以应用新的旋转角度
                carsLayer.renderer = createCarRenderer(currentHeading);
            });

            // 初始显示旋转角度
            document.getElementById("rotationValue").innerHTML = currentHeading;
        });
    </script>
</body>
</html>

4. 代码解析

  1. WebStyleSymbol的创建: new WebStyleSymbol({ styleName: "EsriRealisticTransportationStyle", name: "BMW_3-Series" }) 创建了一个具体的Web样式符号,这里选择了一辆BMW汽车。
  2. Graphic与attributes: 我们创建了一个Graphic来代表地图上的汽车,并为其attributes添加了一个heading字段。这个字段将用于驱动旋转。在实际应用中,heading值会来自GPS或其他传感器数据。
  3. SimpleRenderer的配置:
    • symbol: carSymbol:指定了要使用的符号。
    • visualVariables:这是一个数组,包含了所有的视觉变量。
    • type: "rotation":明确指出我们要进行符号旋转。
    • valueExpression:${heading}`:这是关键部分。它定义了如何从要素数据中获取旋转值。在我们的示例中,我们直接传入一个heading变量。在实际从FeatureLayer读取数据时,这通常是"$feature.heading",其中heading`是FeatureLayer数据源中的一个字段名。
    • rotationType: "geographic":设置旋转的参考系。geographic表示0度朝北,顺时针增加;arithmetic表示0度朝东,逆时针增加。根据您的数据来源和需求选择合适的类型。
  4. FeatureLayer的创建: FeatureLayer被用来承载和渲染我们的Graphic。虽然通常用于从服务加载数据,但通过source属性,它也可以直接接受Graphic数组。
  5. 动态更新: 当用户点击按钮时,currentHeading值会更新,然后通过重新设置carsLayer.renderer = createCarRenderer(currentHeading);来强制图层重新渲染,从而应用新的旋转角度。

5. 注意事项与最佳实践

  • 数据源: 确保您的数据源(无论是REST服务、GeoJSON还是本地数据)包含一个表示方向或航向的字段,并且其值是有效的角度(通常是0-360度)。
  • 旋转类型: 根据您的数据标准和期望的显示效果,正确选择rotationType(geographic或arithmetic)。geographic更符合GPS航向的直观理解(0度北,90度东)。
  • 性能: 对于包含大量要素的图层,频繁地更新整个renderer可能会影响性能。在实时数据流场景下,如果仅单个或少数要素的属性发生变化,可以考虑直接更新Graphic的attributes,然后调用layer.refresh()(如果图层支持)或更新特定的Graphic。然而,对于FeatureLayer,重新设置renderer是更新所有要素视觉变量的有效方式。
  • 符号锚点: 确保您的Web样式符号的锚点(origin)设置正确。通常,符号的中心点是旋转的轴心。如果符号设计不当,旋转效果可能不符合预期。
  • Arcade表达式: valueExpression支持Arcade表达式,这意味着您可以进行更复杂的计算来得出旋转角度,例如:valueExpression: "($feature.start_angle + $feature.end_angle) / 2"。

总结

通过本教程,您应该已经掌握了如何在ArcGIS JavaScript API中利用WebStyleSymbol和SimpleRenderer的rotation视觉变量,根据数据属性实现地图符号的动态旋转。这一功能对于构建实时追踪、态势感知等应用至关重要,它能够显著提升地图的可读性和信息传达效率。记住,关键在于正确配置rotation视觉变量的valueExpression,并根据需要动态更新渲染器以响应数据变化。

热门AI工具

更多
Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1518

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2184

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5704

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

4709

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

6454

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

8554

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

4339

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

4407

2025.08.07

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

0

2026.09.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 5.6万人学习

CSS教程
CSS教程

共754课时 | 93.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn