SkylineGlobe 7.0.1 & 7.0.2版本Web开发 如何实现土方量计算
土方量计算,或者叫填挖方计算,体积计算,Skyline在很早的版本中就提供了这个的功能。
目前的软件版本,不仅仅可以对地形修改对象进行土方量计算,还可以在FLY工程中导入DEM数字高程模型数据,计算不同DEM数据之间的土方量变化情况。
这里摘取了针对地形修改对象的土方量计算代码,请大家鉴赏。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>剖切指定位置的三维模型</title>
<script type="text/javascript">
// ------------------------------------------------------
// 若加载其他工程文件,可以修改下面一行中fly文件地址
var flyurl = "E:\\2018\\DEMO\\Default0726.fly";
// ------------------------------------------------------
function LoadFly() {
var sg = CreateSGObj();
sg.Open(flyurl);
}
window.setTimeout("LoadFly()", 1000); function StartCal() {
var SGWorld = CreateSGObj();
var oid = SGWorld.ProjectTree.FindItem("New Modify Terrain ##5175551");
CalculateList(oid, null);
} function CalculateList(value, geometry) {
var SGWorld = CreateSGObj();
var volumeGeometry;
var ModifyObj = SGWorld.ProjectTree.GetObject(value);
if (geometry == null)
volumeGeometry = ModifyObj.Geometry;
else
volumeGeometry = geometry; var origVisability = SGWorld.ProjectTree.GetVisibility(value); SGWorld.ProjectTree.SetVisibility(value, false);
calculateVolume(volumeGeometry, 2, 3, 0, ModifyObj.TreeItem.Name); SGWorld.ProjectTree.SetVisibility(value, true);
calculateVolume(volumeGeometry, 2, 3, 1, ModifyObj.TreeItem.Name); SGWorld.ProjectTree.SetVisibility(value, origVisability);
} var gAreaUnitFactor = 1;
var gVolumeUnitFactor = 1;
var gAreaUnit = "";
var gVolumeUnit = "";
var gQuaryResolution = 1024;
var gVolumeResultHTML = "";
//-------------
// calculateVolume
function calculateVolume(geometry, type, altitudeType, phase, ObjName) {
var SGWorld = CreateSGObj();
//debugger
//var htmlStr;
//htmlStr = SGLang.i18n("PrepareClaculation");
//SGWorld.Window.ShowMessageBarText(htmlStr, 1, -1); //var qualityStep = ResolutionsArray[$("#DensityID").val()];
var qualityStep = 10; var polygonGeometry = geometry.Clone(); // to enable edit geometry (ref) when geometry type is RelativeToPivot. Navon.
var envelope = polygonGeometry.Envelope; // Multi polygon evnelope (min/max)
var MinX = Math.min(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
var MaxX = Math.max(envelope.Rings(0).Points(0).x, envelope.Rings(0).Points(2).x);
var MinY = Math.min(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y);
var MaxY = Math.max(envelope.Rings(0).Points(0).y, envelope.Rings(0).Points(2).y); var stepX = Math.abs(MaxX - MinX) / gQuaryResolution;
var stepY = Math.abs(MaxY - MinY) / gQuaryResolution; // calculate cell 2D size
var cellPos0 = SGWorld.Creator.CreatePosition(MinX, MaxY, 0, 3, 0, 0, 0, 1);
var cellPos1 = SGWorld.Creator.CreatePosition(MinX, MaxY - stepY, 0, 3, 0, 0, 0, 1);
var cellPos2 = SGWorld.Creator.CreatePosition(MinX + stepX, MaxY, 0, 3, 0, 0, 0, 1);
var cellWidth = cellPos0.DistanceTo(cellPos1) * qualityStep;
var cellArea = cellPos0.DistanceTo(cellPos1) * cellPos0.DistanceTo(cellPos2) * qualityStep * qualityStep * gAreaUnitFactor; if (phase == 0) {
// For now we call this query several times because of an engine bug!!!
gElevationBufferBefore = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, gQuaryResolution, gQuaryResolution).toArray(); // MaxX - MinX, MaxY - MinY);
gElevationBufferBefore = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, gQuaryResolution, gQuaryResolution).toArray(); // MaxX - MinX, MaxY - MinY);
gElevationBufferBefore = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, gQuaryResolution, gQuaryResolution).toArray(); // MaxX - MinX, MaxY - MinY);
}
else {
// For now we call this query several times because of an engine bug!!!
gElevationBufferAfter = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, gQuaryResolution, gQuaryResolution).toArray(); // MaxX - MinX, MaxY - MinY);
gElevationBufferAfter = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, gQuaryResolution, gQuaryResolution).toArray(); // MaxX - MinX, MaxY - MinY);
gElevationBufferAfter = SGWorld.Analysis.QueryElevationBuffer(MinX, MaxY, stepX, stepY, gQuaryResolution, gQuaryResolution).toArray(); // MaxX - MinX, MaxY - MinY); //// var group;
//var drawObjects = $("#showObjectsID").is(':checked') ? true : false;
//if (drawObjects) {
// CreateLayer(cellWidth * 100, ObjName);
// var result = featureLayerStyles["ImageLabel"](cellWidth / 40, abspath() + "/img/point.png"); // ,"[Color]");
//}
//group = SGWorld.ProjectTree.CreateGroup( SGLang.i18n("ToolName"), ""); var VolumeAdded = 0;
var VolumeRemoved = 0;
for (i = qualityStep / 2; i < gQuaryResolution; i = i + qualityStep) {
for (j = qualityStep / 2; j < gQuaryResolution; j = j + qualityStep) {
var x = MinX + i * stepX;
var y = MaxY - j * stepY;
var objColor = "#000000";
var volumeType = 0;
var pointGeometry = SGWorld.Creator.GeometryCreator.CreatePointGeometry([x, y, 0]);
if (polygonGeometry.SpatialRelation.Intersects(pointGeometry)) {
var elevationDiff = gElevationBufferAfter[j * gQuaryResolution + i] - gElevationBufferBefore[j * gQuaryResolution + i];
var volumeDiff = cellArea * elevationDiff * gVolumeUnitFactor;
if (elevationDiff > 0) { // Added
volumeType = 1;
VolumeAdded += Math.abs(volumeDiff);
objColor = 65280; // "#00ff00"; // green
}
else if (elevationDiff < 0) { // Removed
volumeType = 2;
VolumeRemoved += Math.abs(volumeDiff);
objColor = 255; // "#ff0000"; // red
}
else {
volumeType = 0;
objColor = 0; // "#000000"; // black
}
//if (drawObjects) { // && i % ObjInterval == 0 && j % ObjInterval == 0) {
// var pos = SGWorld.Creator.CreatePosition(x, y, gElevationBufferAfter[j * gQuaryResolution + i], 3, 0, 0, 0, 1);
// gLayer.FeatureGroups.Point.CreateFeature([pos.X, pos.Y, pos.Altitude], volumeType + ";" + cellArea.toFixed(3) + ";" + volumeDiff.toFixed(3) + ";" + objColor);
// //SGWorld.Creator.CreateSphere(pos, 2, 0, objColor, objColor, 2, group, "sphere");
//}
} // if intersect
} // for j
if (i % 10 == 0) {
var progress = (i / gQuaryResolution) * 100;
htmlStr = SGLang.i18n("calculatingVolume") + ObjName + ": " + progress.toFixed(0) + "%";
SGWorld.Window.ShowMessageBarText(htmlStr, 1, -1);
}
} // for i
SGWorld.Window.HideMessageBarText();
gVolumeResultHTML += "<br/><u>" + ObjName + ":</u><br/>" + "objectVolumeAdded" + "<b>" + VolumeAdded.toFixed(3) + "</b> " + gVolumeUnit + " <br/> " + "objectVolumeRemoved" + "<b>" + VolumeRemoved.toFixed(3) + "</b> " + gVolumeUnit + "<br/>";
//gTotalVolumeAdded += VolumeAdded;
//gTotalVolumeRemoved += VolumeRemoved;
alert(gVolumeResultHTML);
//if (drawObjects)
// gLayer.Save();
} // phase return true;
} // SGWorld70
function CreateSGObj() {
try {
var obj = document.getElementById("SGWorld");
if (obj == null) {
obj = document.createElement('object');
obj.setAttribute("name", "SGWorld");
obj.setAttribute("id", "SGWorld");
obj.style.height = "1px";
obj.style.width = "1px";
obj.setAttribute("classid", "CLSID:3A4F919C-65A8-11D5-85C1-0001023952C1");
document.body.appendChild(obj);
}
return obj;
}
catch (e) {
alert(e);
}
} </script>
</head>
<body style="margin: 0px; border: 0px;">
<div id="top">
<div>
<input id="Button1" type="button" value="分析" style="position:absolute;top:6px;right:100px;" onclick="StartCal()" /> </div>
</div>
<div style="position: absolute; top: 50px; bottom: 0px; width: 100%; background-color: black; margin: 0px; border: 0px; margin-top: 3px;">
<object id="TerraExplorerInformationWindow" classid="CLSID:3a4f9193-65a8-11d5-85c1-0001023952c1" style="margin-left: 3px; width: 19%; height: 99%;"></object>
<object id="TerraExplorer3DWindow" classid="CLSID:3a4f9192-65a8-11d5-85c1-0001023952c1" style="width: 80%; height: 99%;"></object>
</div>
</body> </html>
SkylineGlobe 7.0.1 & 7.0.2版本Web开发 如何实现土方量计算的更多相关文章
- SkylineGlobe 7.0.1 & 7.0.2版本Web开发 如何实现对三维模型和地形的剖切展示
		现在很多三维项目中,不仅仅要用到三维地形,正射影像和矢量数据,还会融合到各种三维模型,包括传统的3DMax手工建模,BIM,倾斜摄影自动建模,激光点云模型,三维地质体模型等等. 三维平台首先要做的是把 ... 
- SkylineGlobe 7.0.1 & 7.0.2版本Web开发 如何正确使用三维地图控件和工程树控件
		Skyline TerraExplorer Pro目前正式发布的7.0.1&7.0.2版本,还只是64位的版本, 在Web开发的时候,如何在页面中正确嵌入三维地图控件,让一些小伙伴凌乱了. 下 ... 
- 0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题
		先看图 这个是JavaScript语言自身存在的一个问题.说道这里不得不提一下网上流传的JavaScript搞笑图 我们在使用云开发来开发微信小程序的时候,会经常遇到JavaScript小数计算精度失 ... 
- .Net框架2.0和4.0版本对比
		.Net版本 2.0 SP2 4.0 操作系统 Windows 2000 SP4以上 Windows XP SP3以上 安装包大小 NetFx20SP2_x86.exe 23.8 MBNetFx20S ... 
- Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解
		作为重量级的跨平台开发的游戏引擎,Cocos2d-x在现今的手游开发领域占有重要地位.那么问题来了,作为Cocos2dx的学习者,它的可移植特性我们就需要掌握,要不然总觉得少一门技能.然而这个时候各种 ... 
- 让人眼花缭乱的 RSS 版本0.90、0.91、0.92、0.93、0.94、1.0 和 2.0
		1.0的规范 http://web.resource.org/rss/1.0/spec 2.0的规范 http://cyber.law.harvard.edu/rss/rss.html 一个介绍什么是 ... 
- selenium2.0的初步封装(java版本)
		我们都知道, 在本地创建java项目后,引入selenium-java-2.35.0.jar selenium-support-2.35.0.jar junit-4.8.1.jar等等jar包之后 ... 
- Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程
		原文:Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程 Red Gate系列之二 SQL Source Co ... 
- LanSoEditor_advance1.8.0 视频编辑的高级版本
		------------------------------------------2017年1月11日11:18:33------------------------------------- 我们 ... 
随机推荐
- bash shell第一课
			自学shell,又被老师说教,上英语课不好好学习英语四级怎么过,哈哈,那也没有数据对我的吸引力大啊,为了爱与梦想!!! 回忆一下文件格式: 文件名的扩展名为 .sh 文件内容开头必为 #!bin/ ... 
- C#线程安全使用(三)
			在讲CancellationTokenSource之前我决定先讲一下lock和Interlocked,如果能很好的理解这两个,再去理解CancellationTokenSource就会方便很多,由于我 ... 
- linux集群自动化搭建(生成密钥对+分发公钥+远程批量执行脚本)
			之前介绍过ansible的使用,通过ssh授权批量控制服务器集群 但是生成密钥和分发公钥的时候都是需要确认密码的,这一步也是可以自动化的,利用ssh + expect + scp就可以实现,其实只用这 ... 
- 流式大数据计算实践(7)----Hive安装
			一.前言 1.这一文学习使用Hive 二.Hive介绍与安装 Hive介绍:Hive是基于Hadoop的一个数据仓库工具,可以通过HQL语句(类似SQL)来操作HDFS上面的数据,其原理就是将用户写的 ... 
- 痞子衡嵌入式:第一本Git命令教程(5)- 提交(commit/format-patch/am)
			今天是Git系列课程第五课,上一课我们做了Git本地提交前的准备工作,今天痞子衡要讲的是Git本地提交操作. 当我们在仓库工作区下完成了文件增删改操作之后,并且使用git add将文件改动记录在暂存区 ... 
- static 静态与非静态的区别
			静态属性是共享一块内存空间.实例的是各自独享一块内存空间. 比如同一个name属性.如果是实例成员.那么你每创建了一个对象.赋给name值.假如创建了2个对象.第一个赋值张三.第2个赋值李四.它们就分 ... 
- es简单打造站内搜索
			最近挺忙的,在外出差,又同时干两个项目.白天一个晚上一个,特别是白天做的项目,马上就要上线了,在客户这里 三天两头开会,问题很多真的很想好好静下来怼代码,半夜做梦都能fix bugs~ 和客户交流真的 ... 
- Java基础:HashMap假死锁问题的测试、分析和总结
			前言 前两天在公司的内部博客看到一个同事分享的线上服务挂掉CPU100%的文章,让我联想到HashMap在不恰当使用情况下的死循环问题,这里做个整理和总结,也顺便复习下HashMap. 直接上测试代码 ... 
- 关于guns开源框架单元测试问题
			首先在test文件夹里面删除红框里面的两个文件 然后再在需要测试的类里面右键类名生成测试文件 生成的测试文件加上这两句话 @RunWith(SpringJUnit4ClassRunner.class) ... 
- html初步学习
			①:<meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,minimum-scale ... 
