关于Skyline沿对象画boundingbox的探讨
先来说说为什么要搞这个?项目中经常遇到的一个操作就是选定对象,以前都是通过Tint设置对象颜色来标识选定对象,但是随着图层中模型增多,模型色彩丰富,会出现选定色与对象颜色对比不明显的情况。因为看到Terra Explorer中使用对象boundingbox的方式标识对象比较清晰,所以研究该方案。
图片中平台被选中,对比明显
图片中罐体被选中,无明显变化
在与skyline技术交流群的各位群友探讨之后,自己琢磨总结了一下,这里分三种情况说说自己的看法。我们的目的就是创建boundingbox,最直接的我们可以找到ISGWorld.Creator的CreateBox接口:
CreateBox
(
Position,
ObjectWidth,
ObjectDepth,
ObjectHeight,
LineColor,
FillColor,
GroupID,
Description )
使用这个接口我们需要获取对象Position中心点和长、宽、高等数据。
另外群友还推荐了一个方法:
Create3DPolygon
(
pIGeometry,
ObjectHeight,
LineColor, FillColor,
AltitudeType,
GroupID,
Description)
使用这个接口我们需要获取对象IGeometry和高度,下面看看几个对象提供的可访问属性。
1. ITerrainModel接口对象
我们通过查询ITerrainModel接口的属性列表,可以发现两个重要的属性
Position
、Terrain.BBox
,那么创建BoundingBox就简单了:
feature = sgworld.Creator.GetObject(position.ObjectId);
//x方向距离,长
var x = sgworld.CoordServices.GetDistance(feature.Terrain.BBox.MaxX,feature.Terrain.BBox.MaxY,feature.Terrain.BBox.MinX,feature.Terrain.BBox.MaxY);
//y方向距离,宽
var y = sgworld.CoordServices.GetDistance(feature.Terrain.BBox.MaxX,feature.Terrain.BBox.MaxY,feature.Terrain.BBox.MaxX,feature.Terrain.BBox.MinY);
//z方向距离,高
var z = feature.Terrain.BBox.MaxHeight - feature.Terrain.BBox.MinHeight;
//画box
var box = sgworld.Creator.CreateBox(feature.Position,x,y,z,0xFF00FF00,0x00000000);
我发现这个方法画出来的bounding box有个问题,跟xy定位框重合,跟z轴定位框错位。但这个问题可能是我们的model引起的,model的坐标没有归零,导致模型xy定位框和z轴定位框分离。
2. 3dml图层中的IFeature接口对象
IFeature接口我是看了又看,没有Position,只能按照群友说的那个方法来,通过Geometry属性来画。
feature = sgworld.Creator.GetObject(position.ObjectId);
//获取Geometry
var geometry = feature.Geometry;
//获取对象高度
var height = feature.FeatureAttributes.GetFeatureAttribute("Altitude").Value;
//创建3dpolygon
sgworld.Creator.Create3DPolygon(geometry,height)
直接报错Error,没有任何说明,目前没有找到原因。
3. shp图层中的IFeature接口对象
shp图层的IFeature和3dml是同一个接口为什么要区分呢,因为他们的属性表现不一样。
- 3mdl的Feature对象
feature.Geometry.GeometryTypeStr
返回Polygon - shp的Feature对象
feature.Geometry.GeometryTypeStr
返回Point
目前没有找到原因。
2018-4-25更新
经沟通,目前Terra Explorer的API没有开发这方面的接口,因此3dml和shp图层中的模型无法绘制boundingbox。