文章目录
前言
写之前先说一下,以往咱们都是在球面场景中绘制一个规则的体对模型图层做GPU空间查询,可参考:https://www.supermapol.com/webgl/examples/webgl/editor.html#spatialQuery3D。最近遇到有些小伙伴问在平面场景中如何绘制任意面对模型进行GPU空间查询,其实核心就是如何把绘制出来的面拉成一个体并让接口能正确识别这个体,以下是实现方法。
一、加载模型缓存服务并获取需要操作的图层
javascript
//设置平面场景
scene.mode = SuperMap3D.SceneMode.COLUMBUS_VIEW;
//加载三维缓存服务
var promise = scene.open("http://localhost:8090/iserver/services/3D-WorkSpace/rest/realspace");
//获取需要进行操作的图层
var layerSelect = [];
var layer = scene.layers.find("Building_1");
layer.selectedColor = SuperMap3D.Color.RED;
layerSelect.push(layer);
二、绘制任意面
这里使用DrawHandler
javascript
//初始化handlerPolygon
var handlerPolygon = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Polygon, 0);
handlerPolygon.drawEvt.addEventListener(function (result) {
handlerPolygon.polygon.show = false;
handlerPolygon.polyline.show = false;
});
//激活handlerPolygon
handlerPolygon.activate();
三、拉伸体
1、获取步骤二所绘制面的节点
此次在步骤二的addEventListener监听里面获取
javascript
for (var pt of result.object.positions) {
var cartographic = SuperMap3D.Cartographic.fromCartesian(pt);
var longitude = SuperMap3D.Math.toDegrees(cartographic.longitude);
var latitude = SuperMap3D.Math.toDegrees(cartographic.latitude);
var height = cartographic.height;
var pnt = new SuperMap3D.Point3D(longitude, latitude, height);
point3ds.add(pnt);
}
point3dsArray.push(point3ds);
2、拉伸体
javascript
//初始化拉伸体
var geometry = undefined;
geometry = new SuperMap3D.GeoRegion3D(point3dsArray);
geometry.extrudedHeight = 100; //拉伸高度
geometry.isLatLon = false; //设为false
geometry.bottomAltitude = 5; //底部高度
3、进行空间查询
javascript
// 空间查询
spatialQuery.geometry = geometry;
spatialQuery.positionMode = mode;
spatialQuery.layers = layerSelect;
spatialQuery.outlineColor = SuperMap3D.Color.CORNFLOWERBLUE;
spatialQuery.fillStyle = SuperMap3D.FillStyle.Fill_And_WireFrame;
spatialQuery.build();
四、运行效果
