• 关于Skyline沿对象画boundingbox的探讨


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

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

    选定对比明显.png

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

    选定对比不明显.png

    在与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);
    

    TerrainModel画框对比xy.png
    TerrainModel画框对比Z.png

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

  • 相关阅读:
    javaweb 安全传输签名机制
    GC详解及Minor GC和Full GC触发条件总结
    程序员的人性思考(上)
    LeetCode 845——数组中的最长山脉
    LeetCode 386——字典序的第 K 小数字
    LeetCode 386——字典序排数
    LeetCode 135——分发糖果
    Ubuntu 16.04 安装显卡驱动后循环登录和无法设置分辨率的一种解决方案
    在 Ubuntu 下安装 Deepin 的 QQ、微信、百度云和迅雷等软件
    腾讯 2019 春季暑期实习生提前批笔试——技术研究与数据分析
  • 原文地址:https://www.cnblogs.com/zhangdk/p/8846525.html
Copyright © 2020-2023  润新知