SkylineGlobe Android 开发 面积计算示例代码
SkylineGlobe Android 开发 面积计算示例代码:
如果之前熟悉SkylineGlobe桌面端的二次开发,看这些代码应该不难理解。
package com.skyline.terraexplorer.tools; import android.os.Handler;
import android.os.Looper; import com.skyline.teapi.*;
import com.skyline.teapi.ISGWorld.OnAnalysisProgressListener;
import com.skyline.teapi.ISGWorld.OnLButtonUpListener;
import com.skyline.terraexplorer.R;
import com.skyline.terraexplorer.TEApp;
import com.skyline.terraexplorer.models.MenuEntry;
import com.skyline.terraexplorer.models.TEUnits;
import com.skyline.terraexplorer.models.UI;
import com.skyline.terraexplorer.views.ToolContainer.CloseReason; public class AreaTool extends ProgressTool implements OnLButtonUpListener, OnAnalysisProgressListener { private double groundArea;
private String toolContainerText; @Override
public MenuEntry getMenuEntry() {
return MenuEntry.createFor(this, R.string.mm_analyze_area, R.drawable.area,MenuEntry.MenuEntryAnalyze(), 20);
} private void startDrawPolygon()
{
// start draw polygon
ISGWorld.getInstance().getCommand().Execute(1012, 5); // get object
String objectId = (String)ISGWorld.getInstance().GetParam(7200);
ITerrainPolygon areaPolygon = ISGWorld.getInstance().getCreator().GetObject(objectId).CastTo(ITerrainPolygon.class);
if (areaPolygon != null)
{
areaPolygon.getPosition().setAltitudeType(AltitudeTypeCode.ATC_TERRAIN_RELATIVE);
areaPolygon.SetParam(5440, null); // Give the polygon X-Ray look
areaPolygon.SetParam(5441, null); // // Make sure we do not see the red "edit vertex helper polyline"
areaPolygon.getLineStyle().setWidth(-2.0); // Make the polygon a bit wider
}
} @Override
public boolean onBeforeOpenToolContainer() {
super.onBeforeOpenToolContainer();
showNormalButtons();
updateArea(0,0);
groundArea = 0;
UI.runOnRenderThread(new Runnable() {
@Override
public void run() {
// start draw polygon
startDrawPolygon();
// subscribe to lButtonUp as an event that causes the polygon to change
ISGWorld.getInstance().addOnLButtonUpListener(AreaTool.this);
}
});
return true;
} @Override
public boolean onBeforeCloseToolContainer(CloseReason closeReason) {
super.onBeforeCloseToolContainer(closeReason);
UI.runOnRenderThread(new Runnable() {
@Override
public void run() {
String objectId = (String) ISGWorld.getInstance().GetParam(7200);
// simulate right click to end drawing
ISGWorld.getInstance().SetParam(8044, 0);
ISGWorld.getInstance().getCreator().DeleteObject(objectId);
ISGWorld.getInstance().removeOnLButtonUpListener(AreaTool.this);
}
});
return true;
} private void updateArea(final double area, final double perimeter)
{
UI.runOnUiThreadAsync(new Runnable() {
@Override
public void run() {
if(area == 0 || perimeter == 0)
{
toolContainerText = "";
}
else
{
String aerialText = String.format(TEApp.getAppContext().getString(R.string.measure_area_area), TEUnits.instance.formatArea(area));
String verticalText = String.format(TEApp.getAppContext().getString(R.string.measure_area_perimeter), TEUnits.instance.formatDistance(perimeter));
toolContainerText = String.format("%s\r\n%s",aerialText, verticalText);
}
toolContainer.setText(toolContainerText);
}
});
} @Override
public void onButtonClick(int tag) {
super.onButtonClick(tag);
switch (tag) {
case 1: // delete all points
{
// bug fix 18295
groundArea = 0; updateArea(0, 0);
UI.runOnRenderThread(new Runnable() {
@Override
public void run() {
String objectId = (String) ISGWorld.getInstance().GetParam(7200);
// simulate right click to end drawing
ISGWorld.getInstance().SetParam(8044, 0);
// delete object
ISGWorld.getInstance().getCreator().DeleteObject(objectId);
// and start adding again
startDrawPolygon();
}
});
// get object
break;
}
case 3: // calculate ground area
doWorkAsync();
break;
default:
break;
} } @Override
protected void doWork() {
if(groundArea <= 0)
{
ISGWorld.getInstance().addOnAnalysisProgressListener(this);
groundArea = calculateGroundArea();
ISGWorld.getInstance().removeOnAnalysisProgressListener(this);
}
} @Override
public boolean OnAnalysisProgress(int CurrPos, int Range) {
setProgress(CurrPos, Range);
return workCanceled;
} @Override
protected void workCompleted() {
if(workCanceled == false)
{
String groundText = String.format(TEApp.getAppContext().getString(R.string.measure_area_ground), TEUnits.instance.formatArea(groundArea));
String text = String.format("%s\r\n%s",groundText, toolContainerText);
toolContainer.setText(text);
}
} private double calculateGroundArea()
{
String objectId = (String)ISGWorld.getInstance().GetParam(7200);
ITerrainPolygon areaPolygon = ISGWorld.getInstance().getCreator().GetObject(objectId).CastTo(ITerrainPolygon.class);
if (areaPolygon != null)
{
double area = ISGWorld.getInstance().getAnalysis().MeasureTerrainSurface(areaPolygon.getGeometry(), 0);
return area;
}
return 0;
} @Override
protected void showNormalButtons() {
toolContainer.removeButtons();
toolContainer.addButton(1, R.drawable.delete);
//toolContainer.addButton(2, R.drawable.delete_last_point);
toolContainer.addButton(3, R.drawable.calc_area);
} @Override
public boolean OnLButtonUp(int Flags, int X, int Y)
{
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
UI.runOnRenderThread(new Runnable() {
@Override
public void run() {
String objectId = (String) ISGWorld.getInstance().GetParam(7200);
ITerrainPolygon areaPolygon = ISGWorld.getInstance().getCreator().GetObject(objectId).CastTo(ITerrainPolygon.class);
IPolygon poly = areaPolygon.getGeometry().CastTo(IPolygon.class);
if (poly != null)
{
double area = (Double)areaPolygon.GetParam(5430);
double perimeter = poly.getExteriorRing().getLength();
updateArea(area, perimeter);
groundArea = 0;
}
}
});
}
}, 10);
return false;
} }
SkylineGlobe Android 开发 面积计算示例代码的更多相关文章
- Android开发中使用代码删除数据库
更多信息参考:Android开发中使用代码删除数据库 在Android开发中,如果用到数据库,就会有一个很麻烦的问题,就是有时候需要删除数据库很麻烦,要打开Android Device Monitor ...
- Android 开发怎样做代码加密或混淆?
欢迎访问网易云社区,了解更多网易技术产品运营经验. 在大公司怎么做android代码混淆的?发现他们的软件用apktool反编译居然没看到classes.dex文件和当前安卓APP加固到底该如何做到防 ...
- Linux命令行下编译Android NDK的示例代码
这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能接近原生应用.所以花了点时间研究 Android ND ...
- android开发系列之代码整洁之道
说起代码整洁之道,想必大家想到更多的是那本经典重构书籍.没错,记得当时自己读那本书的时候,一边结合项目实战,一边结合书中的讲解,确实学到了很多东西,对我自己的编码风格影响极深.随着时间的流逝,书中很多 ...
- 【项目实例】android开发游戏音效代码实例
//音效的音量 int streamVolume; //定义SoundPool 对象 private SoundPool soundPool; //定义HASH表 private HashMap< ...
- Android开发工程师文集-相关控件的讲解,五大布局
前言 大家好,给大家带来Android开发工程师文集-相关控件的讲解,五大布局的概述,希望你们喜欢 TextView控件 TextView控件有哪些属性: android:id->控件的id a ...
- Android开发网上的一些重要知识点[经验分享]
1. android单实例运行方法 我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是s ...
- 【转载】Eclipse:Android开发中如何查看System.out.println的输出内容
Android开发中在代码中通过System.out.println的输出内容不知道去哪了,在console视图中看不到.而通过Log.i之类的要在Logcat视图中看到,夹杂了太多的其它App及底层 ...
- IDEA插件(Android Studio插件)开发示例代码及bug解决
IDEA插件(Android Studio插件)开发示例代码及bug解决 代码在actionPerformed方法中,有个AnActionEvent e 插件开发就是要求我们复写上述的这个方法即可,在 ...
随机推荐
- 2018-02-27 "Literate Programming"一书摘记之一
书到后才发现是Knuth的论文集, 第一篇就在网上: Computer programming as an art (1974). 其中"Taste and Style"(品味和风 ...
- git命令详解(一)
今天我们来详解一下git的各种命令,此为git的第一篇,后续还会有好几篇,希望大家看了能有所进步 第一篇的命令 1.git commit 2.git branch 3.git merge 4.git ...
- 03--css形状--css揭秘
形状 一 自适应的椭圆 1.难题 1> 圆 你可能注意到过, 给任何正方形元素设置一个足够大的border-radius, 就可以把它变成一个圆形.所用到的CSS 代码如下所示: #bd { w ...
- api接口签名认证的一种方式
请求方 try { using (var client = new HttpClient()) { StringContent content = new StringContent(strParam ...
- Salesforce的Developer Console简介
Developer Console是Salesforce提供的一个基于浏览器的集成开发环境.在Developer Console中,开发者可以新建.修改各种Apex.Visualforce.Light ...
- 移动端不利用HTML5和echarts开发一样可以实现大数据展示及炫酷统计系统(产品技术综合)
一.由于项目需要进行手机看板展示设计及开发展示效果图如下:
- Vue组件的基础用法(火柴)
前面的话 组件(component)是Vue最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码,根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己的需要,使用 ...
- flask day01
目标:搭建好一个flask架构,并且可以运行起来,能够访问 ## 一丶配置环境 比较简单,只需要配一个flask pip3 install flask #也可以使用pip install flask ...
- SSD 下的 MySQL(5.5) IO 优化
一 目录 一 目录 二 背景 三 SSD 特性 四 基于 SSD 的数据库优化 五 A 项目 MySQL 主从关系图 六 程序切换之前调优 6.1 修改系统 IO 调度算法 6.2 修改 innodb ...
- virtualenv 的使用
首先,我们用pip安装virtualenv: 一.使用与启动: $ pip3 install virtualenv 然后,假定我们要开发一个新的项目,需要一套独立的Python运行环境,可以这么做: ...