关于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等.曾经有大量的软 ...
随机推荐
- CS231n 第一次作业KNN中本地CIFAR10数据集的载入
一.问题描述 网上绝大多数作业参考都是在jupyter下运行的,数据集载入过程一般如下: from cs231n.data_utils import load_CIFAR10 #导入数据集,并打印出数 ...
- [Swift]LeetCode99. 恢复二叉搜索树 | Recover Binary Search Tree
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- 一张图看懂STM32芯片型号的命名规则
意法半导体已经推出STM32基本型系列.增强型系列.USB基本型系列.增强型系列:新系列产品沿用增强型系列的72MHz处理频率.内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM.新 ...
- js中对于逗号的运算符!
先展示一个例子! var f = (function f() { return '1'; } , function g(){ return 1; } )(); console.log(typeof f ...
- RxJS简介
函数式编程 1.声明式(Declarativ) 和声明式相对应的编程⽅式叫做命令式编程(ImperativeProgramming),命令式编程也是最常见的⼀种编程⽅式. //命令式编程: funct ...
- linux清空文件内容的几种方式与区别
虽然linux清空文件内容的方式有很多种,但是他们之间有着细微的差别.通过实践我将他们分为两类: 将文件清空,文件大小为0k $ : > filename $ > filename $ ...
- Python内置函数(65)——type
英文文档: class type(object) class type(name, bases, dict) With one argument, return the type of an obje ...
- Git的使用--如何将本地项目上传到Github(三种简单、方便的方法)
一.第一种方法: 1.首先你需要一个github账号,所以还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路(傻瓜式安装) ...
- 【Docker】(5)---springCloud注册中心打包Docker镜像
[Docker](5)---springCloud注册中心打包Docker镜像 上一篇文章讲了将镜像推送到远处私有仓库,然后再从私有仓库拉取该镜像的过程.而这里的镜像是直接从Docker拉取的. 所以 ...
- EF实现批量插入
Z.EntityFramework.BulkInsert EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务.而 ...