先来说说为什么要搞这个?项目中经常遇到的一个操作就是选定对象,以前都是通过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接口的属性列表,可以发现两个重要的属性

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



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

关于Skyline沿对象画boundingbox的探讨的更多相关文章

  1. WebGl 利用缓冲区对象画多个点

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  2. [个人原创]关于java中对象排序的一些探讨(一)

    有的时候我们需要将自己定义的对象,有序输出.因为一般我们程序的中间结果需要存储在容器里,那么怎样对容器中的对象按照一定次序输出就是程序员经常需要考虑的问题.本片文章探讨了怎样有序化输出容器中的对象的问 ...

  3. [个人原创]关于java中对象排序的一些探讨(三)

    这篇文章由十八子将原创,转载请注明,并标明博客地址:http://www.cnblogs.com/shibazijiang/ 对对象排序也可以使用Guava中的Ordering类. 构造Orderin ...

  4. [个人原创]关于java中对象排序的一些探讨(二)

    2.  使用Collections.sort()方法 Collections类中提供了诸多静态方法,诸如addAll(),max()等等.当自己相对Collection接口下的类处理的时候,可以看看这 ...

  5. javascript原型对象

    先来做个复习,ES5中有有几种数据类型呢? 5种基本数据类型 Undefined Null Boolean Number String 1种复杂数据类型 Object 除了基本数据类型,万物皆对象,记 ...

  6. WPF 10天修炼 第八天 - 形状、画刷和变换

    图形 在WPF中使用绘图最简单的就是使用Shape类.Shape类继承自FrameworkElement,是一个专门用来绘图的类.Shape类中年派生的类有直线.矩形.多边形和圆形等. System. ...

  7. 由PHP实现单向链表引发的对象赋值,对象传参,链表操作引发的一系列问题

    2019年2月25日14:21:13 测试版本php 5.4 ,5.6,7.0,7.2 代码请看: https://www.cnblogs.com/zx-admin/p/10373866.html 1 ...

  8. Delphi 绘图对象

    来自:http://blog.csdn.net/lailai186/article/details/8755430 ========================================== ...

  9. Java小对象的解决之道——对象池(Object Pool)的设计与应用

    一.概述 面向对象编程是软件开发中的一项利器,现已经成为大多数编程人员的编程思路.很多高级计算机语言也对这种编程模式提供了很好的支持,例如C++.Object Pascal.Java等.曾经有大量的软 ...

随机推荐

  1. #Java学习之路——基础阶段(第九篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

  2. [Swift]LeetCode71. 简化路径 | Simplify Path

    Given an absolute path for a file (Unix-style), simplify it. For example,path = "/home/", ...

  3. c# 关于页面生命周期

    每次遇到这个问题,总是含含糊糊的说不清楚,今天就在这里统一整理一下,以便以后的查看. 一般来说,页要经历下表概述的各个阶段.除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于 ...

  4. spark使用udf给dataFrame新增列

    在 spark 中给 dataframe 增加一列的方法一般使用 withColumn // 新建一个dataFrame val sparkconf = new SparkConf() .setMas ...

  5. 查询运营商的ip段

    查询运营商的ip段 所有的IP地址都是通过国际组织NIC(Network Information Center)统一分配的,目前世界上有三个这样的网络信息中心: InterNic: 负责美国及其他地区 ...

  6. java基础(十三)-----详解内部类——Java高级开发必须懂的

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 为什么要使用内部类 为什么要使用内部类?在<Think in java>中有这样一句话:使用内部类最吸引人的原因是:每个内部类都能 ...

  7. dotnet core 开发无缝兼容Http和Websocket协议的接口服务

    在应用接口开发中往往要针对不同协义开发相应的代理服务,但对于Websocket和http这两种协议来说就有些不同,从实现上来看Websocket可以说是Http的升级子协议, 两者在协议处理上基本一致 ...

  8. Asp.Net MVC路由生成URL过程

    这次谈一谈Asp.Net MVC中所学到的路由生成URL的相关技术,顺便提一提遇到的一些坑,真的是掉坑掉多了,也就习以为常了,大不了从坑里再爬出来.初学者,包括我,都以为,mvc的核心是模型视图控制器 ...

  9. 『Asp.Net 组件』Asp.Net 服务器组件 的开发优势和劣势

    在写<Asp.Net 服务器组件系列文档>之前,笔者不才,揣测微软战略用意: 微软利益诉求莫过于 微软产品和技术的市场份额: 因此,微软战略之一莫过于将 所有开发人员 团聚在 微软周围,以 ...

  10. spring security使用自定义登录界面后,不能返回到之前的请求界面的问题

    昨天因为集成spring security oauth2,所以对之前spring security的配置进行了一些修改,然后就导致登录后不能正确跳转回被拦截的页面,而是返回到localhost根目录. ...