关于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。
关于Skyline沿对象画boundingbox的探讨的更多相关文章
- WebGl 利用缓冲区对象画多个点
效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- [个人原创]关于java中对象排序的一些探讨(一)
有的时候我们需要将自己定义的对象,有序输出.因为一般我们程序的中间结果需要存储在容器里,那么怎样对容器中的对象按照一定次序输出就是程序员经常需要考虑的问题.本片文章探讨了怎样有序化输出容器中的对象的问 ...
- [个人原创]关于java中对象排序的一些探讨(三)
这篇文章由十八子将原创,转载请注明,并标明博客地址:http://www.cnblogs.com/shibazijiang/ 对对象排序也可以使用Guava中的Ordering类. 构造Orderin ...
- [个人原创]关于java中对象排序的一些探讨(二)
2. 使用Collections.sort()方法 Collections类中提供了诸多静态方法,诸如addAll(),max()等等.当自己相对Collection接口下的类处理的时候,可以看看这 ...
- javascript原型对象
先来做个复习,ES5中有有几种数据类型呢? 5种基本数据类型 Undefined Null Boolean Number String 1种复杂数据类型 Object 除了基本数据类型,万物皆对象,记 ...
- WPF 10天修炼 第八天 - 形状、画刷和变换
图形 在WPF中使用绘图最简单的就是使用Shape类.Shape类继承自FrameworkElement,是一个专门用来绘图的类.Shape类中年派生的类有直线.矩形.多边形和圆形等. System. ...
- 由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 ...
- Delphi 绘图对象
来自:http://blog.csdn.net/lailai186/article/details/8755430 ========================================== ...
- Java小对象的解决之道——对象池(Object Pool)的设计与应用
一.概述 面向对象编程是软件开发中的一项利器,现已经成为大多数编程人员的编程思路.很多高级计算机语言也对这种编程模式提供了很好的支持,例如C++.Object Pascal.Java等.曾经有大量的软 ...
随机推荐
- TechEmpower最新一轮的性能测试出炉,ASP.NET Core依旧表现不俗
TechEmpower在10月30发布最新一轮(Round 17)针对“Web Framework Benchmarks”的性能测试报告,ASP.NET Core依旧表现不俗,在一些指标上甚至是碾压其 ...
- 【从零开始搭建自己的.NET Core Api框架】(六)泛型仓储的作用
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- [Swift]LeetCode140. 单词拆分 II | Word Break II
Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, add space ...
- [Swift]LeetCode461. 汉明距离 | Hamming Distance
The Hamming distance between two integers is the number of positions at which the corresponding bits ...
- [Swift]LeetCode858. 镜面反射 | Mirror Reflection
There is a special square room with mirrors on each of the four walls. Except for the southwest cor ...
- 读取Json,并替换json中的指定字符
string jsonfile = @"E:\history.json";//JSON文件路径 using (System.IO.FileStream file = new Fil ...
- 二叉树的相关在线编程(python)
问题一: 输入一个整数数组, 判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No. 假设输入的数组的任意两个数字都互不相同. 正确的后序遍历结果: sequence = [ ...
- Python内置函数(55)——round
英文文档: round(number[, ndigits]) Return the floating point value number rounded to ndigits digits afte ...
- 【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!
一.什么Ocelot? API网关是一个服务器,是系统的唯一入口.API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程 ...
- jni c++
java与c/c++之间的数据交互 JNI 上述两篇文章对jni的讲解比较详细,各有利弊,就文章1来说,开门见山,直接阐述了java和C/C++的交互方式:文章2是一篇百度文库 ...