关于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等.曾经有大量的软 ...
随机推荐
- [安卓] 20、基于蓝牙BLE的广播包高频快速搜索
前言: 之前介绍过很多蓝牙beacon.搜索.连接.通讯的文章.不过最近我发现:之前写的蓝牙广播包搜索的工程,搜索频率太慢,而且不能一直保持搜索状态.因此,这里探讨下高频蓝牙广播包扫描 -- 蓝牙BL ...
- [Swift]LeetCode229. 求众数 II | Majority Element II
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. Note: The a ...
- [Swift]LeetCode293. 翻转游戏 $ Flip Game
You are playing the following Flip Game with your friend: Given a string that contains only these tw ...
- EPPlusHelper
public class EPPlusExcelHelper : IDisposable { public ExcelPackage ExcelPackage { get; private set; ...
- 正交矩阵、EVD、SVD
原文地址:https://www.jianshu.com/p/1004dd342fe2 一.正交矩阵 二.EVD 特征值分解(Eigen Value Decomposition, EVD). 对于对称 ...
- 关于 redis.properties配置文件及rule
当你配置的 FinanceRlue 的path为/count/users时,redis.properties中就必须也配置一个/users=redis://localhost:6379/2?keyle ...
- cmd命令窗口的快速选中复制黏贴
右击"窗口标题栏",选择属性,进入属性面板: 在"选项"面板勾选编辑选项下的"快速编辑模式"; 点击确认. 这时鼠标左键就有了选中功能,可以 ...
- 从jvm角度看懂类初始化、方法重写、重载。
类初始化 在讲类的初始化之前,我们先来大概了解一下类的声明周期.如下图 类的声明周期可以分为7个阶段,但今天我们只讲初始化阶段.我们我觉得出来使用和卸载阶段外,初始化阶段是最贴近我们平时学的,也是笔试 ...
- C语言实现链队列的初始化&进队&出队
/*链表实现队列的一系列操作*/ #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 typed ...
- Eclipse工具常用快捷键
Eclipse工具常用快捷键 一丶文件菜单常用快捷键 新建 Alt + shift + N 关闭当前编辑器 Ctrl +W 全部关闭 Ctrl + shift + w 保存 Ctrl + s 刷新 ...