关于Skyline沿对象画boundingbox的探讨

先来说说为什么要搞这个?项目中经常遇到的一个操作就是选定对象,以前都是通过Tint设置对象颜色来标识选定对象,但是随着图层中模型增多,模型色彩丰富,会出现选定色与对象颜色对比不明显的情况。因为看到Terra Explorer中使用对象boundingbox的方式标识对象比较清晰,所以研究该方案。

图片中平台被选中,对比明显

关于Skyline沿对象画boundingbox的探讨

图片中罐体被选中,无明显变化

关于Skyline沿对象画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接口的属性列表,可以发现两个重要的属性

PositionTerrain.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);

关于Skyline沿对象画boundingbox的探讨

关于Skyline沿对象画boundingbox的探讨

我发现这个方法画出来的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。

上一篇:开源Math.NET基础数学类库使用(14)C#生成安全的随机数


下一篇:JAVA多线程之中断机制(如何处理中断?)