唯杰地图 logo唯杰地图
VJMAP
EN

符号实体

vjmap3d/references/entity/symbolEntity.md 7.6 KB247 行
原文

SymbolEntity 是由 实体Entity 和 SymbolModule 模块组合而成的新的实体。

SymbolEntity = Entity + SymbolModule

常用方法

SymbolEntity 是由 实体Entity 派生而来。具体 Entity 的所有属性和方法。同时也具有SymbolModule 的相关方法。

方法 描述
symbolObject 获取符号对象。webgl 下是 THREE.Points(pixelRaycasting: true 时为其子类);webgpu 下是 SymbolSprites(继承 THREE.Sprite,点几何在 .pointsGeometry 上)——.d.ts 一律标为 Points,跨引擎代码勿直接访问 .geometry 的点属性
updateStyle 更新样式
setData 修改数据
getData 获取数据
getItemDataByPointIndex 通过pointIndex获取获取数据

使用示例

创建SymbolEntity

let svc = new vjmap3d.Service(env.serviceUrl, env.accessToken);
let app = new vjmap3d.App(svc, {
    container: "map", // 容器id
    scene: {
        gridHelper: { visible: true } // 是否显示坐标网格
    },
    camera: {  // 相机设置
        viewHelper: { enable: true, position: "leftBottom" } // 是否显示视角指示器
    }
})
let data = [];
data.push({
    position: [-2, 3, 4],
    color: "#0ff",
    borderColor: "#ff0",
    size: 20
})
data.push({
    position: [2, 4, 3],
    color: "#0f0",
    borderColor: "#ff0",
    size: 25
})
let symbol = new vjmap3d.SymbolEntity({ //SymbolEntity
    data: data,
    pixelRaycasting: true, // 像素大小拾取
    style: {
        shape: "circle",
        transparent: true,
        //fadeDistance: 500,
        borderWidth: 2,
        sizeAttenuation: false
    }
})
symbol.addTo(app);
symbol.symbolObject.userData.RaycasterThreshold = 15; // 可设置像素捕捉的距离,默认为6

增加事件

symbol.pointerEvents = true;
symbol.on("mouseover", e => {
    if (e.intersection.index >= 0) {
        let pointsData = symbol.getData();
        app.setCursor("pointer");
        pointsData[e.intersection.index].highlightColor = "#f00";
        pointsData[e.intersection.index].highlightSize =
            (pointsData[e.intersection.index].size ?? 3) + 5;
        symbol.setData(pointsData)
        app.popup2d.setText(`id: ${pointsData[e.intersection.index].id}`)
        app.popup2d.setPosition(pointsData[e.intersection.index].position)
        app.popup2d.show();
    }
});
symbol.on("mouseout", e => {
    if (e.intersection.index >= 0) {
        app.setCursor("");
        // 取消高亮
        let pointsData = symbol.getData();
        delete pointsData[e.intersection.index].highlightColor;
        delete pointsData[e.intersection.index].highlightSize;
        symbol.setData(pointsData)
        app.popup2d.hide();
    }
});

修改、新增、删除

调用 setData 来对数据进行增删改

// 如新增一条
data.push({
    position: vjmap3d.randPoint3D(),
    color: vjmap3d.randColor(),
    borderColor: vjmap3d.randColor(),
    size: vjmap3d.randInt(10, 20)
})
symbol.setData(data)

修改样式

// 获取模块对象
let mod = symbol.getModule(vjmap3d.SymbolModule);
mod.style.shape = "triangle"; // 设置为三角形形状
symbol.updateStyle(mod.style)

3D示例

let svc = new vjmap3d.Service(env.serviceUrl, env.accessToken);
let app = new vjmap3d.App(svc, {
    container: "map", // 容器id
    scene: {
        gridHelper: { visible: true } // 是否显示坐标网格
    },
    camera: {  // 相机设置
        viewHelper: { enable: true, position: "leftBottom" } // 是否显示视角指示器
    }
})
let data = [];
data.push({
    position: [-2, 3, 4],
    color: "#0ff",
    borderColor: "#ff0",
    size: 20
})
data.push({
    position: [2, 4, 3],
    color: "#0f0",
    borderColor: "#ff0",
    size: 25
})
let symbol = new vjmap3d.SymbolEntity({ //SymbolEntity
    data: data,
    pixelRaycasting: true, // 像素大小拾取
    style: {
        shape: "circle",
        transparent: true,
        //fadeDistance: 500,
        borderWidth: 2,
        sizeAttenuation: false
    }
})
symbol.addTo(app);
symbol.symbolObject.userData.RaycasterThreshold = 15; // 可设置像素捕捉的距离,默认为6
// 允许事件
symbol.pointerEvents = true;
symbol.on("mouseover", e => {
    if (e.intersection.index >= 0) {
        let pointsData = symbol.getData();
        app.setCursor("pointer");
        pointsData[e.intersection.index].highlightColor = "#f00";
        pointsData[e.intersection.index].highlightSize =
            (pointsData[e.intersection.index].size ?? 3) + 5;
        symbol.setData(pointsData)
        app.popup2d.setText(`id: ${pointsData[e.intersection.index].id}`)
        app.popup2d.setPosition(pointsData[e.intersection.index].position)
        // app.popup2d.setPosition(e?.intersection?.point, true)
        app.popup2d.show();
    }
});
symbol.on("mouseout", e => {
    if (e.intersection.index >= 0) {
        app.setCursor("");
        // 取消高亮
        let pointsData = symbol.getData();
        delete pointsData[e.intersection.index].highlightColor;
        delete pointsData[e.intersection.index].highlightSize;
        symbol.setData(pointsData)
        app.popup2d.hide();
    }
});
//
let mod = symbol.getModule(vjmap3d.SymbolModule);
const ui = await app.getConfigPane({ title: "设置", style: { width: "250px", overflow: "hidden"}});
let cfg = [
    {
        type: 'button',
        label: '增加一个点符号',
        value: ()=> {
            data.push({
                position: vjmap3d.randPoint3D(),
                color: vjmap3d.randColor(),
                borderColor: vjmap3d.randColor(),
                size: vjmap3d.randInt(10, 20)
            })
            symbol.setData(data)
        }
    },
    {
        type: 'button',
        label: '修改第一个符号颜色',
        value: ()=> {
            if (data.length > 0) {
                data[0].color = vjmap3d.randColor()
            }
            symbol.setData(data)
        }
    },
    {
        type: 'button',
        label: '删除第一个符号',
        value: ()=> {
            if (data.length == 0) {
                return
            }
            data.splice(0, 1)
            symbol.setData(data)
        }
    },
    {
        type: 'dropdown',
        label: '形状',
        property: [mod.style, 'shape'],
        children: [
            {
                label: "正方形",
                value: "square",
            },
            {
                label: "圆",
                value: "circle",
            },
            {
                label: "三角形",
                value: "triangle",
            }
        ],
        onChange: () => {
            symbol.updateStyle(mod.style)
        }
    }
]
cfg.forEach(c => ui.appendChild(c));