地理位置是决定太阳光照空间变化的一个重要因素,不同经纬度、模型要素投射的阴影等方面因素会影响某区域接收到的日照时间长短。日照分析考虑到太阳角度的日变化和季节性变化以及周围地形投射的阴影所带来的影响,得出指定范围内的采光信息,即日照时间所占总分析时间的百分比。
基于GPU分析日照,相较于基于数据的“日照分析”,精度较低,但可以大范围分析。
本文使用的iOBjects .net版本为:supermap-iobjectsdotnet-10.2.1-20429-92256
首先,此分析基于GPU,因此需要在分析前打开场景
Workspace Workspace = new Workspace();
SceneControl sceneControl = new SceneControl();
WorkspaceConnectionInfo wksinfo = new WorkspaceConnectionInfo(@"D:\Desktop\日照分析\test.smwu");
wksinfo.Type = WorkspaceType.SMWU;
Workspace.Open(wksinfo);
sceneControl.Scene.Workspace = Workspace;
sceneControl.Scene.Open("NewDataset");
打开场景后,开始进行分析
日照分析使用到的方法为:ModelBuilder3D.SunlightAnalysis
本文将使用ModelBuilder3D.SunlightAnalysis 方法 (Geometry3D, GeoModel3D, SunlightAnalysisSetting, Boolean) 进行分析
在这个方法中,共需要传入四个参数,Geometry3D geometry是需要进行分析的三维几何对象;GeoModel3D geoModelDes是分析结果保存成的三维实体模型;SunlightAnalysisSetting param是日照分析时所需要的分析参数,bool bLatLon是确认阴影率查询的对象是否是经纬度坐标。参数含义可参考iObject .net帮助文档,下载地址为:http://support.supermap.com.cn/DataWarehouse/WebDocHelp/SuperMap_iObjects_.NET_Help.zip
根据参数,首先确认需要分析的三维几何对象,以场景中选中的对象为例
Selection3D[] selections = sceneControl.Scene.FindSelection(true);
Selection3D selection = selections[0];
Recordset rs = selection.ToRecordset();
GeoModel3D model3D = rs.GetGeometry() as GeoModel3D;
构造一个GeoModel3D对象保存分析结果
GeoModel3D geoModel3D = new GeoModel3D();
构造分析参数设置SunlightAnalysisSetting 对象,这个设置在测试时可参考iDesktop
setting.BaseUtcOffset = TimeSpan.FromHours(8);
setting.DistanceThreshold = 1;
setting.StartTime = Convert.ToDateTime("2022-07-05 06:00:00");
setting.EndTime = Convert.ToDateTime("2022-07-05 18:00:00");
setting.SubdivisionThreshold = 20;
List<DatasetVector> datasets = new List<DatasetVector>();
DatasetVector vector = Workspace.Datasources[0].Datasets["NewDataset"] as DatasetVector;
datasets.Add(vector);
setting.QueryDatasets = datasets;
setting.TimeInterval = TimeSpan.FromMinutes(30);
进行分析,并将分析结果模型保存到数据集
m_pointsResultList = ModelBuilder3D.SunlightAnalysis(model3D, geoModel3D, setting, true);
DatasetVector datasetM = Workspace.Datasources[0].Datasets["New_Model"] as DatasetVector;
Recordset recordset = datasetM.GetRecordset(false, CursorType.Dynamic);
recordset.Edit();
bool a = recordset.AddNew(geoModel3D);
recordset.Refresh();
recordset.Update();
笔者:wzr