**

通视分析

**

一:技术原理:

通视分析是指以某一点为观察点,研究到目标点通视情况的模拟分析。可以分为粗查询和细查询两种
1、粗查询是根据视线与模型包围盒之间的空间关系进行分析;
2、细查询是根据视线与模型三角格网面之间的空间关系进行分析;
如果视线与任何模型存在相交,则该两点间不可通视。

通视分析主要分为三步:确定缓冲区范围,设置查询条件,进行空间查询。

二:实现通视分析:

1. .Net代码

private bool ViewAnalysis()
{   AxRenderControl rendercontrol=getRenderControl();//获取控件//创建线(模拟实际视线)IGeometryFactory gfactory=new GeometryFactory();IPolyline line=gfactory.CreateGeometry(gviGeometryType.gviGeometryPolyline,gviVertexAttribute.gviVertexAttributeZ) as IPolyline;//创建点,构造线段端点IPoint point=gfactory.CreateGeometry(gviGeometryType.gviGeometryPolyline,gviVertexAttribute.gviVertexAttributeZ) as IPoint;point.SetCoords(15388.76,35690.94,36.97,0,0);line.AppendPoint(point);point.SetCoords(15434.14,35716.11,5.2,0,0);line.AppendPoint(point);//获取建筑图层要素类IFeatureClass fc=buildingfc;//设置空间查询条件ISpatialFilter filter = new SpatialFilterClass();filter.Geometry = line;filter.SpatialRel = gviSpatialRel.gviSpatialRelEnvelope;filter.GeometryField = "Geometry";//粗判断if(fc.GetCount(filter)==0){return true;//可以通视}//粗查询IFdeCursor cursor = fc.Search(filter, false);IRowBuffer row = null;//细查询(排除与包围盒相交,但与模型不相交的情况)while ((row = cursor.NextRow()) != null){int geometryIndex = row.FieldIndex("Geometry");if (geometryIndex != -1){IModelPoint modelPoint = row.GetValue(geometryIndex) as IModelPoint;IModel model = (fc.FeatureDataSet as IResourceManager).GetModel(modelPoint.ModelName);//获取模型IGeometryConvertor gc = new GeometryConvertor();IMultiTriMesh triMesh = gc.ModelPointToTriMesh(model, modelPoint, false);//将模型三角化if (triMesh != null){ILine l = geoFactory.CreateGeometry(gviGeometryType.gviGeometryLine, gviVertexAttribute.gviVertexAttributeZ) as ILine;l.StartPoint = line.StartPoint;l.EndPoint = line.EndPoint;IVector3 v3 = triMesh.LineSegmentIntersect(l);//分析三角面与线段交点if (v3 != null){return false;//不可以通视}}}}  return true;//可以通视
}

2. JS代码

function ViewAnalysis()
{var __g=document.getElementById("__g");//获取控件//创建线(模拟实际视线)var gfactory=__g.geometryFactory;var line=gfactory.createGeometry(gviGeometryType.gviGeometryPolyline,gviVertexAttribute.gviVertexAttributeZ);//创建点,构造线段端点var point=gfactory.createGeometry(gviGeometryType.gviGeometryPolyline,gviVertexAttribute.gviVertexAttributeZ);point.setCoords(15388.76,35690.94,36.97,0,0);line.appendPoint(point);point.setCoords(15434.14,35716.11,5.2,0,0);line.appendPoint(point);//获取建筑图层要素类var fc=buildingfc;//设置空间查询条件var filter = __g.new_SpatialFilter;//新建空间查询条件filter.geometry = line;filter.spatialRel = gviSpatialRel.gviSpatialRelEnvelope;filter.geometryField = "Geometry";//粗判断if(fc.getCount(filter)==0){return true;//可以通视}//粗查询var cursor = fc.search(filter, false);var row = null;//细查询(排除与包围盒相交,但与模型不相交的情况)while ((row = cursor.nextRow()) != null){var geometryIndex = row.fieldIndex("Geometry");if (geometryIndex != -1){var modelPoint = row.getValue(geometryIndex);var model = fc.featureDataSet.getModel(modelPoint.modelName);//获取模型var gc = __g.geometryConvertor;var triMesh = gc.modelPointToTriMesh(model, modelPoint, false);//将模型三角化if (triMesh != null){var l = geoFactory.createGeometry(gviGeometryType.gviGeometryLine, gviVertexAttribute.gviVertexAttributeZ);l.startPoint = polyline.startPoint;l.endPoint = polyline.endPoint;var v3 = triMesh.lineSegmentIntersect(l);//分析三角面与线段交点if (v3 != null){return false;//不可以通视}}}}  return true;//可以通视
}

重点解析

1、模型的包围盒范围会略大于模型本身,并不能替代模型进行通视分析。为了分析结果的准确性,我们引入了三角网格面ITriMesh。它可以更好的贴合模型,较为准确的反映了模型的实际空间范围。

2、模型的三角网格化速度较慢,不推荐直接对整个要素类格网化。用包围盒先进行粗查询有利于排除不影响分析的模型,进一步提高分析效率。

三:注意事项

1、本节示例代码中使用了SDKDEMO.FDB数据,可以在SDK安装目录下的Samples\Media文件夹中找到。
2、空间查询的Geometry对象需要与查询的要素类保持相同的空间参考,才能保证查询结果的准确。
3、更多示例请参考SDK高级篇SightlineAnalysis。

【二次开发】CityMaker常见分析——通视分析相关推荐

  1. UG二次开发读取尺寸值公差分析

    一直在用grip做NX二次开发,自写自用.最近grip写的自动公差系统,不能进行自动标注公差,也不能进行尺寸链公差分析,如WC,RSS分析,究其原因是grip的OBTAIN命令在NX7.5之前可以获取 ...

  2. Cesium空间分析-通视分析

    进入正题,前段时间做了一个通视分析的功能. 功能很简单:给定"观察点"与"目标点",判断两点之间是否有"阻碍点",并能够计算出阻碍点.效果如 ...

  3. C#进行Visio二次开发之电气线路停电分析逻辑

    停电分析,顾名思义,是对图纸进行停电的逻辑分析.在电气化线路中,一条线路是从一个电源出来,连接着很多很多的设备的,进行停电分析,有两个重要的作用:一是看图纸上的Shape元件是否连接正常,二是看哪些设 ...

  4. 金蝶二次开发的常见类型

    常用开发方式一:基础资料插件 客户.供应商.物料等基础资料录入界面可以控制编码的生成规则以及任意字段的生成方式. 常用开发方式二:业务单据插件 业务单据插件用于进行一些复杂的业务计算. 常用开发方式三 ...

  5. ArcGIS二次开发基础教程(10):三维分析

    ArcGIS二次开发基础教程(10):三维分析 坡度分析 请务必学会使用帮助文档!!! //DEM数据的坡度分析 将分析结果添加到地图上 //首先获取DEM数据,方法有很多例如从个人地理数据库获取,也 ...

  6. 360视域分析 cesium_Cesium-空间分析之通视分析(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  7. supermap iobjects学习——三维通视分析,可视域分析 (1)

    三维可视分析包括通视分析和可视域分析.前者用来判断两点之间是否通视,后者用于对观察点的可视范围进行分析. 涉及到的控件: sceneControl相关事件:Tracking,Tracked Scene ...

  8. arcgis二次开发python-ArcGIS 二次开发专题 序

    依据ArcGIS 组件式开发及应用的目录结构,将系统性的学习ArcGIS 二次开发的道路分为三个部分.这个系列包含以下三个部分: Part1 基础 1. 前言 1.1 组件式GIS 1.2 ArcOb ...

  9. PHP漏洞利用工具开发,PHPcms二次开发,PHPcms,DEDEcms简单代码审计

    PHP工具开发 文章目录 PHP工具开发 PHP小马 一句话木马 PHP大马分析 实现大马后门 编写大马 PHP的cms二次开发 PHP常见CMS的漏洞分析 PHPstorm调试模式 PHPCMSv9 ...

最新文章

  1. 如何用Python编写一个聊天室
  2. A new ABAP HTTP test client RSICFCLTST01
  3. 程序异常异常代码: 0xc0000005_Java基础:看完这篇你还怕碰到异常吗?
  4. 用户登陆_华为路由器AAA用户密码登陆你了解吗?
  5. Docker 内程序时间设置,很重要
  6. php分页上一页下一页判断,分页(上一页,下一页)
  7. VBA调用DOS程序两种方法
  8. ios12 siri 语音识别
  9. 扩展正则表达式egrep11
  10. 电脑画画软件_绘画软件分享,还不过来看!
  11. 【java设计模式】之 抽象工厂(Abstract Factory)模式
  12. 基于 Flink 打造的伴鱼实时计算平台 Palink 的设计与实现
  13. CAD二次开发(VB)代码整理
  14. Canvas绘制地图
  15. html 颜色五光十色,页面色彩搭配基础知识.PDF
  16. C#在VS2019中各种字体颜色的意思
  17. 基于C#程序触摸屏软件盘开发总结
  18. crypto-js前端解密工具
  19. pgsql:添加注释与查询注释
  20. java 图片 缩略图_java 图片缩略图的两种方法

热门文章

  1. 文章学习(二)综述类:数据驱动的类比设计:最先进的技术和未来的方向
  2. 通俗理解kaggle比赛大杀器xgboost
  3. python 列表索引从1开始_Python从索引开始循环遍历列表
  4. 一图说明APQP的过程和五大质量管理工具的关系
  5. Linux实时调度策略(SCHED_RR)和CFS(SCHED_OTHER)之间的区别
  6. 3D建模新手无法掌握角色建模技巧?机器猫模型制作流程,学会很轻松!
  7. mysql根据时间查询_MySql根据时间查询数据
  8. ROS语音交互(三)科大讯飞语音在ROS平台下使用
  9. 计算机机房电力切换演练方案,中心机房开展2020年上半年电力切换应急演练
  10. Opencv(C++)笔记--视频读取、视频属性查看、视频循环播放