2.2.14 日照分析
日照分析
日照分析是在三维场景中进行日照模拟,呈现阴影效果的分析功能。在分析时,需要划定分析范围以及指定分析时间段,然后可以模拟整个时间段内日照产生的阴影效果,也可以计算分析范围内某个点位的日照时长。
注意:可创建空的分析图层,也可创建预设的分析图层,如需创建预设分析图层,则IsLoad
,IsActive
,Points
三个参数需要同时配置
下图是日照分析效果:
参数说明
日照分析可配置的参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
LayerOptionsName | 图层配置对象名称 | string | 分析图层需配置为:AnalysisLayerOptions |
DataSourceTypeName | 数据源类型 | string | as_sunlight代表日照分析 |
PointColor | 点颜色 | R,G,B,A | 颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0" |
PointSize | 点大小 | float | 点大小取值范围在1-10之间 |
SunLightLineColor | 线颜色 | R,G,B,A | 颜色取值范围在0-1.0之间,如 "0.9,0.8,0.8,1.0" |
Year | 年 | int | 年。用于确定太阳方位 |
Month | 月 | int | 月。用于确定太阳方位 |
Day | 日 | int | 日。用于确定太阳方位 |
StartHour | 起始时 | int | 日照开始播放时间。小时 |
StartMinute | 起始分 | int | 日照开始播放时间。分钟 |
EndHour | 结束时 | int | 日照结束播放时间。小时 |
EndMinute | 结束分 | int | 日照结束播放时间。分钟 |
PlayerState | 日照播放状态 | string | 日照播放状态,PLAYER_PLAY-播放;PLAYER_PAUSE-暂停;PLAYER_STOP-停止。默认为PLAYER_PLAY |
AddedMinute | 播放速度 | float | 日照播放速度。单位(分钟/帧),默认1分钟/帧 |
IsPointSunshine | 是否进行单点日照分析 | bool | 是否进行单点日照分析。默认为false |
Point | 单点坐标 | x,y,z | 单点日照分析坐标。需传入经度,纬度,高程坐标。 |
IsLoad | 是否初始化加载点 | bool | 是否初始化加载点。默认为false |
IsActive | 是否激活分析 | bool | 默认为true,表示是否可操作场景进行绘制 |
Points | 坐标点集 | x,y,z列表 | 需传入经度,纬度,高程坐标集,中间用;分隔,并以;结尾 |
IsWorld | 是否世界坐标点 | bool | 传入的坐标是否是世界坐标。true-世界坐标,false-经纬度坐标。默认为true |
获取结果说明
日照分析可以通过图层对象的GetLayerResult() 方法获取结果。获取的结果值对象参数如下表所示:
配置项 | 配置说明 | 值类型 | 备注 |
---|---|---|---|
DataSourceTypeName | 数据源类型 | string | as_sunlight代表日照分析 |
ClickPoints | 点击点坐标 | x,y,z列表 | 鼠标点击场景形成的关键点的经度,纬度,高程坐标列表,中间用;分隔,并以;结尾 |
PickState | 是否求交到模型 | bool | 日照范围内是否能求交到模型 |
CurrentTime | 当前时间 | double | 日照分析正在播放时间。单位:分钟 |
StartSunTime | 开始日照时间 | double | 单点接收日照开始时间。单位:分钟 |
EndSunTime | 结束日照时间 | double | 单点接收日照结束时间。单位:分钟 |
LengthOfSunshine | 单点日照时长 | double | 单点接收日照总时长。单位:分钟 |
代码调用示例
Javascript调用
var isGetPerspective = false;
var layermap = new Array();
var addState =false;
var responseStr;
var addFeature;
//图层回调实现函数
function callBackFun(layerid, type){
var info = new Array();
info = layerid.split("|");//idinfo通过|进行分隔
var mapviewid = info[0].substr(10, info[0].length - 10);//MapviewId:
var layerid = info[1].substr(8, info[1].length - 8);//LayerId:
var layer = layermap[layerid];
var opt = layer.GetLayerResult();
var bCurrentTime = document.getElementById("CurrentTime");
var bStartSunTime = document.getElementById("StartSunTime");
var bEndSunTime = document.getElementById("EndSunTime");
var bLengthOfSunshine = document.getElementById("LengthOfSunshine");
if(opt.GetConfigValueByKey("DataSourceTypeName") == "as_sunlight")
{
var CurrentTime = opt.GetConfigValueByKey("CurrentTime");//当前时间
var StartSunTime = opt.GetConfigValueByKey("StartSunTime");//单点开始日照时间
var EndSunTime = opt.GetConfigValueByKey("EndSunTime");//单点结束日照时间
var LengthOfSunshine = opt.GetConfigValueByKey("LengthOfSunshine");//单点日照时长
bCurrentTime.value = MinuteToHour(CurrentTime);
bStartSunTime.value = MinuteToHour(StartSunTime);
bEndSunTime.value = MinuteToHour(EndSunTime);
if(LengthOfSunshine !="")
{
bLengthOfSunshine.value = LengthOfSunshine+"分钟";
}
}
}
//鼠标左键抬起回调实现函数
function FireOnLButtonUp(posX, posY)
{
if(addState)
{
var transformate = map.CreateTransformation();
var pos = transformate.ScreenPosToWorldPos(posX, posY);//将屏幕坐标点转换成经纬度坐标
addFeature.AddPoint(pos.GetX(), pos.GetY(), pos.GetZ());//向编辑图层添加坐标点信息
responseStr = pos.GetX() + "," + pos.GetY() + "," + pos.GetZ() + ";";
AddFeature();//添加要素
CreateLengthOfSunshine();//创建单点日照分析
}
}
//*************************************************************************
//日照分析图层控制
//*************************************************************************
var sunLightLayer;
//创建日照分析
function CreateSunLightLayer() {
var tlo = map.CreateLayerOptions("SunLight");//创建分析图层配置,给配置起个名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("PointColor", "1,0,0,1.0");//点颜色(RGBA),默认红色
tlo.AddConfig("PointSize", "5");//点的大小,默认5
tlo.AddConfig("SunLightLineColor", "0,1,0,1.0" );//线颜色(RGBA)
tlo.AddConfig("Year", "2019");//年,用于确定太阳方位
tlo.AddConfig("Month", "1");//月,用于确定太阳方位
tlo.AddConfig("Day", "1");//日,用于确定太阳方位
tlo.AddConfig("StartHour", "10");//开始播放的时间,小时
tlo.AddConfig("StartMinute", "30");//开始播放的时间,分钟
tlo.AddConfig("EndHour", "19");//结束播放的时间,小时
tlo.AddConfig("EndMinute", "30");//结束播放的时间,分钟
tlo.AddConfig("PlayerState", "PLAYER_PAUSE" );//日照播放状态,PLAYER_PLAY-播放,PLAYER_PAUSE-暂停,PLAYER_STOP-停止,默认为PLAYER_PLAY
sunLightLayer = map.CreateLayer("AnalysisLayer", tlo);//创建分析图层
map.AddLayer(sunLightLayer);//添加图层
layermap[sunLightLayer.GetLayerID()] = sunLightLayer;
sunLightLayer.AddObserver();
}
//更新日照分析
function UpdateSunLightLayer() {
var tlo = map.CreateLayerOptions("SunLight ");//创建分析图层配置,给配置起个名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("Year", "2019");//年,用于确定太阳方位
tlo.AddConfig("Month", "8");//月,用于确定太阳方位
tlo.AddConfig("Day", "15");//日,用于确定太阳方位
tlo.AddConfig("StartHour", "10");//开始播放的时间,小时
tlo.AddConfig("StartMinute", "30");//开始播放的时间,分钟
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}
//获取日照分析结果
function GetSunLightLayer() {
var opt = sunLightLayer.GetLayerResult();//获取图层结果
//判断当前图层数据源类型
if(opt.GetConfigValueByKey("DataSourceTypeName") == "as_sunlight")
{
var PickState = opt.GetConfigValueByKey("PickState");//获取是否相交到模型
alert("PickState:" + PickState);
var ClickPoints = opt.GetConfigValueByKey("ClickPoints");//获取点击坐标
alert("ClickPoints:" + ClickPoints);
}
}
//删除日照分析
function RemoveSunLightLayer() {
map.RemoveLayer(sunLightLayer);//删除日照分析
sunLightLayer = null;
if(shpLayer != null)
{
map.RemoveLayer(shpLayer);//删除点矢量图层
shpLayer = null;
}
}
//*************************************************************************
//单点日照分析
//*************************************************************************
var pointMeasure = null;
//创建点矢量
function createPointMeasure(){
if(shpLayer != null)
{
map.RemoveLayer(shpLayer);//删除点矢量图层
shpLayer = null;
}
if(sunLightLayer != null){
//创建点矢量图层
createPointShpLayer();
//创建要素
CreateFeature();
}else{
alert("请先创建日照分析图层");
}
}
//创建单点日照分析
function CreateLengthOfSunshine()
{
if(sunLightLayer != null)
{
var tlo = map.CreateLayerOptions("SunLight");//创建分析图层配置,给配置起个名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("IsPointSunshine", "true");//是否进行单点日照分析
tlo.AddConfig("Point", responseStr);//进行单点日照分析的经纬度坐标
tlo.AddConfig("IsWorld", "false");//传入的是否是世界坐标,true为世界坐标,false为经纬度坐标
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}
else
{
alert("请先创建日照分析图层");
}
}
//创建点矢量图层
var polygoneditLayer = null;
var shpLayer = null;//矢量图层
function createPointShpLayer(){
if(shpLayer == null){
//1.创建点符号对象
var pSymbol = map.CreateSymbol("PointSymbol");//创建符号对象,PointSymbol代表点符号
pSymbol.AddConfig("Size", "5");//点大小,(0-10)
pSymbol.AddConfig("Color", "1.0,1.0,0.0,1.0");//颜色值(RGBA,各值取值范围0-1之间)
//2.创建样式对象
var pStyle = map.CreateStyle("style");//创建样式
pStyle.SetName("point");//设置别名point
pStyle.AddSymbol("PointSymbol", pSymbol.GetConfig());//将符号对象添加到样式,第一参数为符号类型
pStyle.AddFilterName("BuildGeometryFilter");//添加构建器名称.几何构建器为:BuildGeometryFilter
//3.创建样式表对象
var styleSheet = map.CreateStyleSheet();//创建样式表
styleSheet.AddStyle(pStyle.GetConfig());//将样式对象配置添加至样式表
//4.创建并添加图层对象
var tlo = map.CreateLayerOptions("shp");//创建图层配置对象,名称任意
tlo.AddConfig("LayerOptionsName", "FeatureModelLayerOptions");//图层配置对象名称, FeatureModelLayerOptions代表矢量数据配置
tlo.AddConfig("DataSourceTypeName", "fmgeom");//数据源类型,代表fmgeom插件
tlo.AddConfig("Driver", "ESRI Shapefile");//ogr数据的解析驱动
tlo.AddConfig("FeatureSourceType", "ogr");//要素数据源类型,本地数据为ogr
tlo.AddConfig("Url", "E://testPoint.shp");//数据路径
tlo.AddConfig("Fields", "ID:Int:100:0");//创建矢量的属性字段,属性名:属性类型:类型长度:小数点后几位
tlo.AddConfig("UpdateMode", "0");//属性编辑更新模式。0-非立即模式(只对未加载要素起效),1-符号化识别模式(如果影响符号化则使用立即模式,否则非立即模式),2-立即模式(重新刷新图层)
tlo.AddConfig("GeometryType", "Point");//几何类型。Point-点;Polyline-线;Polygon-面.此项配置不能少或字符串一定不能错误,否则保存文件不成功
tlo.AddConfig("TileSizeFactor", "1.0");//瓦片大小的影响因子,建议是1.0
tlo.AddConfig("TileSize", "1000");//瓦片大小,根据最大显示范围设置,一般为MaxRange的1/10左右
tlo.AddConfig("LiftUp", "0");//图层抬升高度,正值为抬高,负值为降低
tlo.AddConfig("MaxRange", "10000.0");//最大显示范围,大于最小显示范围-无穷大
tlo.AddConfig("MinRange", "0.0");//最小显示范围,0-无穷大
tlo.AddConfig("StyleSheet", styleSheet.GetConfig());//将样式配置添加至样式表
shpLayer = map.CreateLayer("FeatureModelLayer", tlo);//创建矢量图层,第一项参数为FeatureModelLayer
map.AddLayer(shpLayer);//添加图层
var id = shpLayer.GetLayerID();//获取图层id
polygoneditLayer = map.GetFeatureModelLayer(id);//获取矢量图层
}else{
alert("请勿重复创建矢量图层!");
}
}
//创建要素
function CreateFeature()
{
addFeature = map.CreateFeature();//创建要素对象
addFeature.SetGeometryType(1);//设置要素几何类型(1-点; 2-线; 3-环; 4-面; 5-多结构)
addFeature.SetComponentType(1);//创建子几何类型(当GeometryType为5时生效)
addState = true;//通过设置该状态,可以在鼠标左键事件中将顶点信息加入要素中
}
//添加要素
function AddFeature()
{
featureId = polygoneditLayer.GetMaxFeatureID() + 1;//获取矢量图层要素最大ID
addFeature.SetFeatureId(featureId);//设置FeatureID
polygoneditLayer.AddFeature(addFeature);//添加到矢量图层
addState = false;
}
//*************************************************************************
//播放控制
//*************************************************************************
//慢速播放
function SlowPlay(){//加速,PlayAsKeyPoint必须为false
if(sunLightLayer){
var tlo = map.CreateLayerOptions("SunLight");//创建图层配置对象
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称,as_sunlight代表日照分析
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("AddedMinute", "1.0");//播放速度
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}else{
alert("图层为空,无法加速!");
}
}
//中速播放
function SlowDown(){//减速,PlayAsKeyPoint必须为false
if(sunLightLayer){
var tlo = map.CreateLayerOptions("SunLight");//创建图层配置对象
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称,as_sunlight代表日照分析
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("AddedMinute", "2.0");//播放速度
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}else{
alert("图层为空,无法减速!");
}
}
//快速播放
function FastPlay(){
if(sunLightLayer){
var tlo = map.CreateLayerOptions("SunLight");//创建图层配置对象
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称,as_sunlight代表日照分析
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("AddedMinute", "3.0");//播放速度
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}else{
alert("图层为空,无法恢复速度!");
}
}
//播放
function Play() {
var tlo = map.CreateLayerOptions("SunLight");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("PlayerState", "PLAYER_PLAY");//播放类型,表示播放
sunLightLayer.UpdateLayerOptions(tlo);
}
//暂停
function Pause() {
var tlo = map.CreateLayerOptions("SunLight");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("PlayerState", "PLAYER_PAUSE");//播放类型,表示暂停
sunLightLayer.UpdateLayerOptions(tlo);
}
//停止
function Stop() {
var tlo = map.CreateLayerOptions("SunLight");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("PlayerState", "PLAYER_STOP");//播放类型,表示停止
sunLightLayer.UpdateLayerOptions(tlo);
}
//将分钟转换为小时
function MinuteToHour(bMinute)
{
if(bMinute !="0"&&bMinute!=""&&bMinute!=null)
{
var h = Math.floor(bMinute/60);
var m = bMinute - (h*60);
return h+":"+m;
}
else
{
return "";
}
}
C++调用
BaseObjectCOMLib::ILayerObjectPtr sunLightLayer;//日照分析图层对象
BaseObjectCOMLib::ILayerObjectPtr shpLayer;//点矢量图层
BaseObjectCOMLib::IFeatureModelLayerPtr polygoneditLayer;//要素模型图层对象
bool addState;//要素创建开关.
ConfigOptionsCOMLib::IFeaturePtr addFeature;//要素对象
long featureId;//要素ID
//创建日照分析
void CsunlightDlg::OnBnClickedCreatesunlightlayer()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("SunLight");//创建分析图层配置,给配置起个名称
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo->AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo->AddConfig("PointColor", "1,0,0,1.0");//点颜色(RGBA),默认红色
tlo->AddConfig("PointSize", "5");//点的大小,默认5
tlo->AddConfig("SunLightLineColor", "0,1,0,1.0" );//线颜色(RGBA)
tlo->AddConfig("Year", "2019");//年,用于确定太阳方位
tlo->AddConfig("Month", "1");//月,用于确定太阳方位
tlo->AddConfig("Day", "1");//日,用于确定太阳方位
tlo->AddConfig("StartHour", "10");//开始播放的时间,小时
tlo->AddConfig("StartMinute", "30");//开始播放的时间,分钟
tlo->AddConfig("EndHour", "19");//结束播放的时间,小时
tlo->AddConfig("EndMinute", "30");//结束播放的时间,分钟
tlo->AddConfig("PlayerState", "PLAYER_PAUSE" );//日照播放状态,PLAYER_PLAY-播放,PLAYER_PAUSE-暂停,PLAYER_STOP-停止,默认为PLAYER_PLAY
sunLightLayer = map->CreateLayer("AnalysisLayer", tlo);//创建分析图层
map->AddLayer(sunLightLayer);//添加图层
sunLightLayer->AddObserver();
}
void CsunlightDlg::OnBnClickedUpdatesunlightlayer()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("SunLight ");//创建分析图层配置,给配置起个名称
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo->AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo->AddConfig("Year", "2019");//年,用于确定太阳方位
tlo->AddConfig("Month", "8");//月,用于确定太阳方位
tlo->AddConfig("Day", "15");//日,用于确定太阳方位
tlo->AddConfig("StartHour", "10");//开始播放的时间,小时
tlo->AddConfig("StartMinute", "30");//开始播放的时间,分钟
sunLightLayer->UpdateLayerOptions(tlo);//更新分析图层
}
//获取日照分析结果
void CsunlightDlg::OnBnClickedGetsunlightlayer()
{
ConfigOptionsCOMLib::ILayerOptionsPtr opt = sunLightLayer->GetLayerResult();//获取图层结果
//判断当前图层数据源类型
std::string DataSourceTypeName = opt->GetConfigValueByKey("DataSourceTypeName");//获得数据源类型
if(DataSourceTypeName == "as_sunlight")
{
CString PickState = opt->GetConfigValueByKey("PickState");//获取是否相交到模型
MessageBox(L"PickState:" + PickState);
CString ClickPoints = opt->GetConfigValueByKey("ClickPoints");//获取点击坐标
MessageBox(L"ClickPoints:" + ClickPoints);
}
}
//删除日照分析
void CsunlightDlg::OnBnClickedRemovesunlightlayer()
{
map->RemoveLayer(sunLightLayer);//删除日照分析
sunLightLayer = NULL;
if(shpLayer != NULL)
{
map->RemoveLayer(shpLayer);//删除点矢量图层
shpLayer = NULL;
}
}
//*************************************************************************
//单点日照分析
//*************************************************************************
//创建点矢量
void CsunlightDlg::OnBnClickedcreatepointmeasure()
{
if(shpLayer != NULL)
{
map->RemoveLayer(shpLayer);//删除点矢量图层
shpLayer = NULL;
}
if(sunLightLayer != NULL){
//创建点矢量图层
createPointShpLayer();
//创建要素
CreateFeature();
}else{
MessageBox(L"请先创建日照分析图层");
}
}
//创建单点日照分析
void CsunlightDlg::CreateLengthOfSunshine()
{
if(sunLightLayer != NULL)
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("SunLight");//创建分析图层配置,给配置起个名称
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo->AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo->AddConfig("IsPointSunshine", "true");//是否进行单点日照分析
tlo->AddConfig("Point", responseStr.c_str());//进行单点日照分析的经纬度坐标
tlo->AddConfig("IsWorld", "false");//传入的是否是世界坐标,true为世界坐标,false为经纬度坐标
sunLightLayer->UpdateLayerOptions(tlo);//更新分析图层
}
else
{
MessageBox(L"请先创建日照分析图层");
}
}
//创建点矢量图层
void CsunlightDlg::createPointShpLayer(){
if(shpLayer == NULL){
//1.创建点符号对象
ConfigOptionsCOMLib::ISymbolObjectPtr pSymbol = map->CreateSymbol("PointSymbol");//创建符号对象,PointSymbol代表点符号
pSymbol->AddConfig("Size", "5");//点大小,(0-10)
pSymbol->AddConfig("Color", "1.0,1.0,0.0,1.0");//颜色值(RGBA,各值取值范围0-1之间)
//2.创建样式对象
ConfigOptionsCOMLib::IStylePtr pStyle = map->CreateStyle("style");//创建样式
pStyle->SetName("point");//设置别名point
pStyle->AddSymbol("PointSymbol", pSymbol->GetConfig());//将符号对象添加到样式,第一参数为符号类型
pStyle->AddFilterName("BuildGeometryFilter");//添加构建器名称.几何构建器为:BuildGeometryFilter
//3.创建样式表对象
ConfigOptionsCOMLib::IStyleSheetPtr styleSheet = map->CreateStyleSheet();//创建样式表
styleSheet->AddStyle(pStyle->GetConfig());//将样式对象配置添加至样式表
//4.创建并添加图层对象
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("shp");//创建图层配置对象,名称任意
tlo->AddConfig("LayerOptionsName", "FeatureModelLayerOptions");//图层配置对象名称, FeatureModelLayerOptions代表矢量数据配置
tlo->AddConfig("DataSourceTypeName", "fmgeom");//数据源类型,代表fmgeom插件
tlo->AddConfig("Driver", "ESRI Shapefile");//ogr数据的解析驱动
tlo->AddConfig("FeatureSourceType", "ogr");//要素数据源类型,本地数据为ogr
tlo->AddConfig("Url", "E://testPoint.shp");//数据路径
tlo->AddConfig("Fields", "ID:Int:100:0");//创建矢量的属性字段,属性名:属性类型:类型长度:小数点后几位
tlo->AddConfig("UpdateMode", "0");//属性编辑更新模式。0-非立即模式(只对未加载要素起效),1-符号化识别模式(如果影响符号化则使用立即模式,否则非立即模式),2-立即模式(重新刷新图层)
tlo->AddConfig("GeometryType", "Point");//几何类型。Point-点;Polyline-线;Polygon-面.此项配置不能少或字符串一定不能错误,否则保存文件不成功
tlo->AddConfig("TileSizeFactor", "1.0");//瓦片大小的影响因子,建议是1.0
tlo->AddConfig("TileSize", "1000");//瓦片大小,根据最大显示范围设置,一般为MaxRange的1/10左右
tlo->AddConfig("LiftUp", "0");//图层抬升高度,正值为抬高,负值为降低
tlo->AddConfig("MaxRange", "10000.0");//最大显示范围,大于最小显示范围-无穷大
tlo->AddConfig("MinRange", "0.0");//最小显示范围,0-无穷大
tlo->AddConfig("StyleSheet", styleSheet->GetConfig());//将样式配置添加至样式表
shpLayer = map->CreateLayer("FeatureModelLayer", tlo);//创建矢量图层,第一项参数为FeatureModelLayer
map->AddLayer(shpLayer);//添加图层
long id = shpLayer->GetLayerID();//获取图层id
polygoneditLayer = map->GetFeatureModelLayer(id);//获取矢量图层
}else{
MessageBox(L"请勿重复创建矢量图层!");
}
}
//创建要素
void CsunlightDlg::CreateFeature()
{
addFeature = map->CreateFeature();//创建要素对象
addFeature->SetGeometryType(1);//设置要素几何类型(1-点; 2-线; 3-环; 4-面; 5-多结构)
addFeature->SetComponentType(1);//创建子几何类型(当GeometryType为5时生效)
addState = true;//通过设置该状态,可以在鼠标左键事件中将顶点信息加入要素中
}
//添加要素
void CsunlightDlg::AddFeature()
{
featureId = polygoneditLayer->GetMaxFeatureID() + 1;//获取矢量图层要素最大ID
addFeature->SetFeatureId(featureId);//设置FeatureID
polygoneditLayer->AddFeature(addFeature);//添加到矢量图层
addState = false;
}
//*************************************************************************
//播放控制
//*************************************************************************
//慢速播放
void CsunlightDlg::OnBnClickedSlowplay()
{
if(sunLightLayer){
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("SunLight");//创建图层配置对象
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称,as_sunlight代表日照分析
tlo->AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo->AddConfig("AddedMinute", "1.0");//播放速度
sunLightLayer->UpdateLayerOptions(tlo);//更新分析图层
}else{
MessageBox(L"图层为空,无法加速!");
}
}
//中速播放
void CsunlightDlg::OnBnClickedSlowdown()
{
if(sunLightLayer){
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("SunLight");//创建图层配置对象
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称,as_sunlight代表日照分析
tlo->AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo->AddConfig("AddedMinute", "2.0");//播放速度
sunLightLayer->UpdateLayerOptions(tlo);//更新分析图层
}else{
MessageBox(L"图层为空,无法加速!");
}
}
//快速播放
void CsunlightDlg::OnBnClickedFastplay()
{
if(sunLightLayer){
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("SunLight");//创建图层配置对象
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称,as_sunlight代表日照分析
tlo->AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo->AddConfig("AddedMinute", "3.0");//播放速度
sunLightLayer->UpdateLayerOptions(tlo);//更新分析图层
}else{
MessageBox(L"图层为空,无法加速!");
}
}
//播放
void CsunlightDlg::OnBnClickedPlay()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("SunLight");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo->AddConfig("PlayerState", "PLAYER_PLAY");//播放类型,表示播放
sunLightLayer->UpdateLayerOptions(tlo);
}
//暂停
void CsunlightDlg::OnBnClickedPause()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("SunLight");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo->AddConfig("PlayerState", "PLAYER_PAUSE");//播放类型,表示暂停
sunLightLayer->UpdateLayerOptions(tlo);
}
//停止
void CsunlightDlg::OnBnClickedStop()
{
ConfigOptionsCOMLib::ILayerOptionsPtr tlo = map->CreateLayerOptions("SunLight");
tlo->AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo->AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo->AddConfig("PlayerState", "PLAYER_STOP");//播放类型,表示停止
sunLightLayer->UpdateLayerOptions(tlo);
}
std::string CsunlightDlg::DoubleToString(DOUBLE num)
{
std::stringstream streamStd;
streamStd << num;
return streamStd.str();
}
//将分钟转换为小时
CString CsunlightDlg::MinuteToHour(CString bMinute)
{
CString hString,mString;
if(bMinute !="0"&&bMinute!="")
{
int h = floor(_ttof(bMinute)/60);
int m = _ttof(bMinute) - (h*60);
hString.Format(_T("%d"),h);
mString.Format(_T("%.2d"),m);
return hString+":"+mString;
}
else
{
return NULL;
}
}
BEGIN_EVENTSINK_MAP(CsunlightDlg, CDialogEx)
ON_EVENT(CsunlightDlg, IDC_VPSDKCTRL1, 2, CsunlightDlg::FireOnLButtonUpVpsdkctrl1, VTS_I2 VTS_I2)
ON_EVENT(CsunlightDlg, IDC_VPSDKCTRL1, 14, CsunlightDlg::FireOnLayerNotifyVpsdkctrl1, VTS_BSTR VTS_I4)
END_EVENTSINK_MAP()
void CsunlightDlg::FireOnLButtonUpVpsdkctrl1(short xPos, short yPos)
{
if(addState)
{
CoordinateSystemCOMLib::ITransformatePtr transformate = map->CreateTransformation();
BaseObjectCOMLib::IPositionPtr pos = transformate->ScreenPosToWorldPos(xPos, yPos);//将屏幕坐标点转换成经纬度坐标
addFeature->AddPoint(pos->GetX(), pos->GetY(), pos->GetZ());//向编辑图层添加坐标点信息
responseStr = DoubleToString(pos->GetX()) + "," + DoubleToString(pos->GetY()) + "," + DoubleToString(pos->GetZ()) + ";";
AddFeature();//添加要素
CreateLengthOfSunshine();//创建单点日照分析
}
}
void CsunlightDlg::FireOnLayerNotifyVpsdkctrl1(LPCTSTR idInfo, long layerType)
{
ConfigOptionsCOMLib::ILayerOptionsPtr opt = sunLightLayer->GetLayerResult();
//判断当前图层数据源类型
std::string DataSourceTypeName = opt->GetConfigValueByKey("DataSourceTypeName");//获得数据源类型
if(DataSourceTypeName == "as_sunlight")
{
CString CurrentTime = opt->GetConfigValueByKey("CurrentTime");//当前时间
CString StartSunTime = opt->GetConfigValueByKey("StartSunTime");//单点开始日照时间
CString EndSunTime = opt->GetConfigValueByKey("EndSunTime");//单点结束日照时间
CString LengthOfSunshine = opt->GetConfigValueByKey("LengthOfSunshine");//单点日照时长
bCurrentTime.SetWindowText(MinuteToHour(CurrentTime));
bStartSunTime.SetWindowText(MinuteToHour(StartSunTime));
bEndSunTime.SetWindowText(MinuteToHour(EndSunTime));
bLengthOfSunshine.SetWindowText(LengthOfSunshine+"分钟");
}
}
C#调用
//*************************************************************************
//日照分析图层控制
//*************************************************************************
ILayerObject sunLightLayer;
//创建日照分析
private void CreateSunLightLayer_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("SunLight");//创建分析图层配置,给配置起个名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("PointColor", "1,0,0,1.0");//点颜色(RGBA),默认红色
tlo.AddConfig("PointSize", "5");//点的大小,默认5
tlo.AddConfig("SunLightLineColor", "0,1,0,1.0");//线颜色(RGBA)
tlo.AddConfig("Year", "2019");//年,用于确定太阳方位
tlo.AddConfig("Month", "1");//月,用于确定太阳方位
tlo.AddConfig("Day", "1");//日,用于确定太阳方位
tlo.AddConfig("StartHour", "10");//开始播放的时间,小时
tlo.AddConfig("StartMinute", "30");//开始播放的时间,分钟
tlo.AddConfig("EndHour", "19");//结束播放的时间,小时
tlo.AddConfig("EndMinute", "30");//结束播放的时间,分钟
tlo.AddConfig("PlayerState", "PLAYER_PAUSE");//日照播放状态,PLAYER_PLAY-播放,PLAYER_PAUSE-暂停,PLAYER_STOP-停止,默认为PLAYER_PLAY
sunLightLayer = map.CreateLayer("AnalysisLayer", tlo);//创建分析图层
map.AddLayer(sunLightLayer);//添加图层
sunLightLayer.AddObserver();
}
//更新日照分析
private void UpdateSunLightLayer_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("SunLight ");//创建分析图层配置,给配置起个名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("Year", "2019");//年,用于确定太阳方位
tlo.AddConfig("Month", "8");//月,用于确定太阳方位
tlo.AddConfig("Day", "15");//日,用于确定太阳方位
tlo.AddConfig("StartHour", "10");//开始播放的时间,小时
tlo.AddConfig("StartMinute", "30");//开始播放的时间,分钟
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}
//获取日照分析结果
private void GetSunLightLayer_Click(object sender, EventArgs e)
{
ILayerOptions opt = sunLightLayer.GetLayerResult();//获取图层结果
//判断当前图层数据源类型
if (opt.GetConfigValueByKey("DataSourceTypeName") == "as_sunlight")
{
string PickState = opt.GetConfigValueByKey("PickState");//获取是否相交到模型
MessageBox.Show("PickState:" + PickState);
string ClickPoints = opt.GetConfigValueByKey("ClickPoints");//获取点击坐标
MessageBox.Show("ClickPoints:" + ClickPoints);
}
}
//删除日照分析
private void RemoveSunLightLayer_Click(object sender, EventArgs e)
{
map.RemoveLayer(sunLightLayer);//删除日照分析
sunLightLayer = null;
if (shpLayer != null)
{
map.RemoveLayer(shpLayer);//删除点矢量图层
shpLayer = null;
}
}
ILayerObject shpLayer = null;//矢量图层
//创建点矢量
private void createPointMeasure_Click(object sender, EventArgs e)
{
if (shpLayer != null)
{
map.RemoveLayer(shpLayer);//删除点矢量图层
shpLayer = null;
}
if (sunLightLayer != null)
{
//创建点矢量图层
createPointShpLayer();
//创建要素
CreateFeature();
}
else
{
MessageBox.Show("请先创建日照分析图层");
}
}
//创建单点日照分析
private void CreateLengthOfSunshine()
{
if (sunLightLayer != null)
{
ILayerOptions tlo = map.CreateLayerOptions("SunLight");//创建分析图层配置,给配置起个名称
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//创建配置类型, AnalysisLayerOptions代表分析图层数据配置
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("IsPointSunshine", "true");//是否进行单点日照分析
tlo.AddConfig("Point", responseStr);//进行单点日照分析的经纬度坐标
tlo.AddConfig("IsWorld", "false");//传入的是否是世界坐标,true为世界坐标,false为经纬度坐标
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}
else
{
MessageBox.Show("请先创建日照分析图层");
}
}
//创建点矢量图层
IFeatureModelLayer polygoneditLayer = null;
private void createPointShpLayer()
{
if (shpLayer == null)
{
//1.创建点符号对象
var pSymbol = map.CreateSymbol("PointSymbol");//创建符号对象,PointSymbol代表点符号
pSymbol.AddConfig("Size", "5");//点大小,(0-10)
pSymbol.AddConfig("Color", "1.0,1.0,0.0,1.0");//颜色值(RGBA,各值取值范围0-1之间)
//2.创建样式对象
var pStyle = map.CreateStyle("style");//创建样式
pStyle.SetName("point");//设置别名point
pStyle.AddSymbol("PointSymbol", pSymbol.GetConfig());//将符号对象添加到样式,第一参数为符号类型
pStyle.AddFilterName("BuildGeometryFilter");//添加构建器名称.几何构建器为:BuildGeometryFilter
//3.创建样式表对象
var styleSheet = map.CreateStyleSheet();//创建样式表
styleSheet.AddStyle(pStyle.GetConfig());//将样式对象配置添加至样式表
//4.创建并添加图层对象
ILayerOptions tlo = map.CreateLayerOptions("shp");//创建图层配置对象,名称任意
tlo.AddConfig("LayerOptionsName", "FeatureModelLayerOptions");//图层配置对象名称, FeatureModelLayerOptions代表矢量数据配置
tlo.AddConfig("DataSourceTypeName", "fmgeom");//数据源类型,代表fmgeom插件
tlo.AddConfig("Driver", "ESRI Shapefile");//ogr数据的解析驱动
tlo.AddConfig("FeatureSourceType", "ogr");//要素数据源类型,本地数据为ogr
tlo.AddConfig("Url", "E://testPoint.shp");//数据路径
tlo.AddConfig("Fields", "ID:Int:100:0");//创建矢量的属性字段,属性名:属性类型:类型长度:小数点后几位
tlo.AddConfig("UpdateMode", "0");//属性编辑更新模式。0-非立即模式(只对未加载要素起效),1-符号化识别模式(如果影响符号化则使用立即模式,否则非立即模式),2-立即模式(重新刷新图层)
tlo.AddConfig("GeometryType", "Point");//几何类型。Point-点;Polyline-线;Polygon-面.此项配置不能少或字符串一定不能错误,否则保存文件不成功
tlo.AddConfig("TileSizeFactor", "1.0");//瓦片大小的影响因子,建议是1.0
tlo.AddConfig("TileSize", "1000");//瓦片大小,根据最大显示范围设置,一般为MaxRange的1/10左右
tlo.AddConfig("LiftUp", "0");//图层抬升高度,正值为抬高,负值为降低
tlo.AddConfig("MaxRange", "10000.0");//最大显示范围,大于最小显示范围-无穷大
tlo.AddConfig("MinRange", "0.0");//最小显示范围,0-无穷大
tlo.AddConfig("StyleSheet", styleSheet.GetConfig());//将样式配置添加至样式表
shpLayer = map.CreateLayer("FeatureModelLayer", tlo);//创建矢量图层,第一项参数为FeatureModelLayer
map.AddLayer(shpLayer);//添加图层
var id = shpLayer.GetLayerID();//获取图层id
polygoneditLayer = map.GetFeatureModelLayer(id);//获取矢量图层
}
else
{
MessageBox.Show("请勿重复创建矢量图层!");
}
}
//创建要素
int featureId;
private void CreateFeature()
{
addFeature = map.CreateFeature();//创建要素对象
addFeature.SetGeometryType(1);//设置要素几何类型(1-点; 2-线; 3-环; 4-面; 5-多结构)
addFeature.SetComponentType(1);//创建子几何类型(当GeometryType为5时生效)
addState = true;//通过设置该状态,可以在鼠标左键事件中将顶点信息加入要素中
}
//添加要素
private void AddFeature()
{
featureId = polygoneditLayer.GetMaxFeatureID() + 1;//获取矢量图层要素最大ID
addFeature.SetFeatureId(featureId);//设置FeatureID
polygoneditLayer.AddFeature(addFeature);//添加到矢量图层
addState = false;
}
//播放
private void Play_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("SunLight");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("PlayerState", "PLAYER_PLAY");//播放类型,表示播放
sunLightLayer.UpdateLayerOptions(tlo);
}
//暂停
private void Pause_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("SunLight");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("PlayerState", "PLAYER_PAUSE");//播放类型,表示暂停
sunLightLayer.UpdateLayerOptions(tlo);
}
//停止
private void Stop_Click(object sender, EventArgs e)
{
ILayerOptions tlo = map.CreateLayerOptions("SunLight");
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("PlayerState", "PLAYER_STOP");//播放类型,表示停止
sunLightLayer.UpdateLayerOptions(tlo);
}
//慢速播放
private void SlowPlay_Click(object sender, EventArgs e)
{
if (sunLightLayer!=null)
{
ILayerOptions tlo = map.CreateLayerOptions("SunLight");//创建图层配置对象
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称,as_sunlight代表日照分析
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("AddedMinute", "1.0");//播放速度
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}
else
{
MessageBox.Show("图层为空,无法加速!");
}
}
//中速播放
private void SlowDown_Click(object sender, EventArgs e)
{
if (sunLightLayer != null)
{
ILayerOptions tlo = map.CreateLayerOptions("SunLight");//创建图层配置对象
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称,as_sunlight代表日照分析
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("AddedMinute", "2.0");//播放速度
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}
else
{
MessageBox.Show("图层为空,无法减速!");
}
}
//快速播放
private void FastPlay_Click(object sender, EventArgs e)
{
if (sunLightLayer != null)
{
ILayerOptions tlo = map.CreateLayerOptions("SunLight");//创建图层配置对象
tlo.AddConfig("LayerOptionsName", "AnalysisLayerOptions");//图层配置对象名称,as_sunlight代表日照分析
tlo.AddConfig("DataSourceTypeName", "as_sunlight");//数据源类型,as_sunlight代表日照分析
tlo.AddConfig("AddedMinute", "3.0");//播放速度
sunLightLayer.UpdateLayerOptions(tlo);//更新分析图层
}
else
{
MessageBox.Show("图层为空,无法恢复速度!");
}
}
//将分钟转换为小时
private string MinuteToHour(string bMinute)
{
if (bMinute != "0" && bMinute != "" && bMinute != null)
{
var h = Math.Floor(double.Parse(bMinute) / 60);
var m = double.Parse(bMinute) - (h * 60);
return h+":"+m;
}
else
{
return "";
}
}
private void axVPSDKCtrl1_FireOnLayerNotify(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnLayerNotifyEvent e)
{
ILayerOptions opt = sunLightLayer.GetLayerResult();
if (opt.GetConfigValueByKey("DataSourceTypeName") == "as_sunlight")
{
string mCurrentTime = opt.GetConfigValueByKey("CurrentTime");//当前时间
string mStartSunTime = opt.GetConfigValueByKey("StartSunTime");//单点开始日照时间
string mEndSunTime = opt.GetConfigValueByKey("EndSunTime");//单点结束日照时间
string mLengthOfSunshine = opt.GetConfigValueByKey("LengthOfSunshine");//单点日照时长
CurrentTime.Text = MinuteToHour(mCurrentTime);
StartSunTime.Text = MinuteToHour(mStartSunTime);
EndSunTime.Text = MinuteToHour(mEndSunTime);
if (mLengthOfSunshine != "")
{
LengthOfSunshine.Text = mLengthOfSunshine + "分钟";
}
}
}
private void axVPSDKCtrl1_FireOnLButtonUp(object sender, AxSDKCtrlLib._IVPSDKCtrlEvents_FireOnLButtonUpEvent e)
{
if (addState)
{
var transformate = map.CreateTransformation();
var pos = transformate.ScreenPosToWorldPos(e.xPos, e.yPos);//将屏幕坐标点转换成经纬度坐标
addFeature.AddPoint(pos.GetX(), pos.GetY(), pos.GetZ());//向编辑图层添加坐标点信息
responseStr = pos.GetX() + "," + pos.GetY() + "," + pos.GetZ() + ";";
AddFeature();//添加要素
CreateLengthOfSunshine();//创建单点日照分析
}
}