You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Maps透视模式下聚类饼图标记的实现方法咨询

在Azure Maps透视模式下实现聚类饼图的方案

你提到的这个问题很常见——默认的HTML Marker聚类饼图示例是针对平面地图设计的,直接放到透视(3D倾斜)模式下会出现悬浮、位置偏移的问题,但确实有办法调整实现。下面是具体的解决方案和调整步骤:

核心问题分析

原示例使用的HTML Marker是DOM元素,默认叠加在地图Canvas上方,不会跟随3D场景的透视变换和地形高度调整位置,所以在透视模式下看起来会“飘”在地图上,和3D环境脱节。我们需要调整定位方式,让饼图聚类贴合3D地面,同时适配透视角度。

具体实现步骤

1. 启用地图透视模式

首先确保初始化地图时开启3D透视,选择支持3D的地图样式(比如road、satellite),并设置pitch(倾斜角度)和bearing(旋转角度)参数:

const map = new atlas.Map('map', {
    center: [-122.33, 47.6], // 替换为你的目标坐标
    zoom: 12,
    pitch: 60, // 调整为你需要的透视倾斜角度
    bearing: -45, // 可选:设置地图旋转角度
    style: 'road',
    authOptions: {
        authType: 'subscriptionKey',
        subscriptionKey: '<你的Azure Maps密钥>'
    }
});

2. 调整聚类饼图的定位逻辑

原示例通过监听聚类事件创建HTML Marker,我们需要修改这部分代码,让Marker贴合3D地面:

  • 使用map.getGroundPosition()获取聚类点在3D地面上的实际坐标(如果开启了地形,会自动考虑地形高度)
  • 调整pixelOffset参数,根据透视角度设置垂直偏移,让饼图自然贴在地面上

修改后的核心代码片段:

// 初始化数据源和聚类配置(和原示例类似)
const datasource = new atlas.source.DataSource(null, {
    cluster: true,
    clusterRadius: 40,
    clusterProperties: {
        // 这里根据你的数据属性统计各类别数量,比如按"type"字段区分
        restaurant: ['+', ['case', ['==', ['get', 'type'], 'restaurant'], 1, 0]],
        shop: ['+', ['case', ['==', ['get', 'type'], 'shop'], 1, 0]],
        park: ['+', ['case', ['==', ['get', 'type'], 'park'], 1, 0]]
    }
});
map.sources.add(datasource);

// 添加你的点数据到数据源
datasource.add(yourPointDataset);

// 监听渲染事件,创建聚类饼图Marker
map.events.add('render', () => {
    // 先移除旧的聚类Marker
    map.markers.clear();
    
    const clusters = datasource.getClusterPoints(10); // 获取当前可视范围内的聚类点
    clusters.forEach(cluster => {
        const properties = cluster.properties;
        const groundPosition = map.getGroundPosition(cluster.coordinates);
        
        if (groundPosition) {
            // 创建饼图HTML(复用原示例的createPieChartHtml函数)
            const pieHtml = createPieChartHtml(properties);
            
            // 创建适配3D透视的HTML Marker
            const marker = new atlas.HtmlMarker({
                position: groundPosition,
                html: pieHtml,
                pixelOffset: [0, -15] // 根据pitch角度调整,让饼图贴在地面
            });
            map.markers.add(marker);
        }
    });
});

3. 优化透视下的聚类效果

  • 动态调整聚类半径:透视模式下,屏幕像素对应的地理范围会随视角变化,你可以根据地图的zoom和pitch值动态调整clusterRadius,确保聚类效果始终合理。
  • 适配地形高度:如果你的地图开启了地形(enableTerrain: true),getGroundPosition会自动返回考虑地形高度的坐标,饼图会自然贴合地形起伏。

替代方案:使用CustomLayer渲染(更贴合3D场景)

如果追求更完美的3D融合效果,可以使用Azure Maps的CustomLayer,通过WebGL直接渲染饼图,这样饼图会作为地图3D图层的一部分,完全跟随透视变换和地形调整。这种方式需要一些WebGL基础,但渲染性能和视觉效果会更好。

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 21:22:54