main.js
import * as THREE from "three";
import * as vjmap3d from "vjmap3d";
import "vjmap3d/dist/vjmap3d.min.css";
// ===== 换成你的服务配置(公有云 https://vjmap.com/server/api/v1,私有化 http://<ip>:27660/api/v1)=====
const serviceUrl = import.meta.env.VITE_VJMAP_SERVICE_URL ?? "https://vjmap.com/server/api/v1";
const accessToken = import.meta.env.VITE_VJMAP_TOKEN ?? ""; // 必填(为空时 new App 直接抛错);不要把真实 token 提交进仓库
const exampleMapId = import.meta.env.VITE_VJMAP_MAPID ?? ""; // 必填:已存在的 CAD 图 mapid(无内置演示图)
async function main() {
// 1. 服务
const svc = new vjmap3d.Service(serviceUrl, accessToken);
// 2. 应用(container 传容器 id 或 HTMLElement)
const app = new vjmap3d.App(svc, {
container: "map",
stat: { show: true, left: "0" },
scene: { gridHelper: { visible: true } },
camera: { viewHelper: { enable: true, position: "leftBottom" } },
control: { leftButtonPan: true } // 左键平移 + 右键旋转,与 2D 地图习惯一致
});
// webgpu 引擎下 renderer 异步初始化,必须先等;webgl 下立即 resolve
// (v2.0.0 起提供;旧版 1.0.23 无此方法,webgl 同步就绪可省略本行)
await app.whenReady();
// 3. 打开 CAD 图作地面
const res = await app.svc.openMap({
mapid: exampleMapId,
mapopenway: vjmap3d.MapOpenWay.GeomRender,
style: vjmap3d.openMapDarkStyle()
});
if (res.error) {
console.error(res.error);
return;
}
const provider = new vjmap3d.MapProvider(
[{ url: app.svc.rasterTileUrl() }],
{ transparent: true }
);
const mapBounds = vjmap3d.GeoBounds.fromString(res.bounds);
const mapviewEnt = new vjmap3d.MapViewEntity({
provider,
baseScale: 100,
mapBounds: mapBounds.toArray()
});
mapviewEnt.addTo(app);
// 4. 验证坐标:CAD 图中心点放一个 Marker2D
const world = mapviewEnt.mapToWorld(mapBounds.center().toArray());
const marker2d = new vjmap3d.Marker2D({ color: "#f00" });
marker2d.setPosition(world);
marker2d.addTo(app);
}
main().catch(console.error);