map-open-way
本文回答:
vjmap.MapOpenWay的三种模式(Memory / GeomRender 栅格 / GeomRender 矢量)差异、优劣、选型。
一、三种打开方式
| 名称 | 枚举 | 说明 | 前端 style 对应 |
|---|---|---|---|
| 内存模式(栅格) | vjmap.MapOpenWay.Memory |
请求新瓦片时后端重新打开图,在内存中渲染 | svc.rasterStyle() |
| 几何渲染(栅格) | vjmap.MapOpenWay.GeomRender |
第一次把图入空间数据库,之后从库里查询生成栅格瓦片 | svc.rasterStyle() |
| 几何渲染(矢量) | vjmap.MapOpenWay.GeomRender |
同上,但以矢量瓦片(MVT)输出;前端可改样式 | svc.vectorStyle() |
二、选型
| 场景 | 推荐 |
|---|---|
| 图形仅临时查看(每次都是新图) | 内存 |
| 经常需要打开同一张图 | 几何渲染(栅格) |
| 需要前端自定义图层样式 / 条件过滤 | 几何渲染(矢量) |
| 需要做空间查询(矩形内所有 TEXT / 相交 / 距离) | 几何渲染(内存模式无空间库:不能用 conditionQueryFeature,只有表达式查询与点/矩形选择,几何只给外包矩形) |
| 图很大(>50MB) | 栅格比矢量友好(矢量 tile 可能较大) |
三、优缺点对比
| 指标 | 内存 | 几何(栅) | 几何(矢) |
|---|---|---|---|
| 第一次打开速度 | 快 | 慢(首次入库) | 慢(首次入库) |
| 以后打开速度 | 中(有可能重开图) | 秒开 | 秒开 |
| 占用存储 | 零 | 一份空间库 | 一份空间库 |
| 空间查询 | 不支持 | 支持 | 支持 |
| 前端改样式 | 不支持 | 不支持 | 支持 |
| 保留 CAD 块结构 | 是 | 否(块实体被打散) | 否 |
打散块:几何渲染方式下,图块会打散为独立实体;通过 objectid 可以恢复关联关系(同一个块内的实体共享前缀 objectid)。
四、模式间相互切换
SDK 层没有直接 API 切换"同一个 mapid 的打开方式"。切换流程:
- 内存 → 几何渲染:在 vjmap 云端管理平台 打开该图,选择栅格/矢量,再打开。
- 几何渲染 → 内存:管理平台选择"内存"打开;如需彻底删除空间库数据,点"清空缓存数据"。
五、代码对照
内存(栅格)
const res = await svc.openMap({ mapid, mapopenway: vjmap.MapOpenWay.Memory });
const map = new vjmap.Map({
container: "map",
style: svc.rasterStyle(), // 内存方式只能栅格
...
});
几何渲染(栅格)
const res = await svc.openMap({ mapid, mapopenway: vjmap.MapOpenWay.GeomRender });
const map = new vjmap.Map({
container: "map",
style: svc.rasterStyle(),
...
});
几何渲染(矢量)
const res = await svc.openMap({ mapid, mapopenway: vjmap.MapOpenWay.GeomRender });
const map = new vjmap.Map({
container: "map",
style: svc.vectorStyle(), // 矢量瓦片
...
});
// 前端可调用 map.enableVectorLayerHoverHighlight 做 hit-test
六、常见坑
- 内存打开的图想用空间查询 → 不支持。改成几何渲染。
- 前端拼样式时误把
rasterStyle和vectorStyle搞反 → 白屏或瓦片报404。 - 首开几何渲染图等待时间长 → 这是在做空间库入库;加 loading UI,或者提前预热。
- 切换模式不走管理台改配置 → 仅改前端枚举没用,后端不会转库。