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 插件开发就是要求我们复写上述的这个方法即可,在 ...
随机推荐
- JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)
一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...
- Force.com 多租户架构
本文参考自官方文档. 多租户架构 作为云计算平台的先驱,Salesforce最大的特点是"软件即服务"(Software as a Service,Saas).实现这种技术的基础便 ...
- 《Inside C#》笔记(十一) 运算符重载
运算符重载与之前的索引器类似,目的是为了让语言本身使用起来更方便直接,也是一种语法糖. 一 运算符重载(Operator Overloading) 运算符重载的存在,使得现有的各种运算符可以被重新定义 ...
- Core Animation-2:寄宿图
#寄宿图 >图片胜过千言万语,界面抵得上千图片 ——Ben Shneiderman 我们在第一章『图层树』中介绍了CALayer类并创建了一个简单的有蓝色背景的图层.背景颜色还好啦,但是如果它 ...
- Hook技术--Activity的启动过程的拦截
1.寻找Hook点的原则 Android中主要是依靠分析系统源码类来做到的,首先我们得找到被Hook的对象,我称之为Hook点:什么样的对象比较好Hook呢?自然是容易找到的对象.什么样的对象容易找到 ...
- UML类图关系图解
一.类结构 在类的UML图中,使用长方形描述一个类的主要构成,长方形垂直地分为三层,以此放置类的名称.属性和方法. 其中, 一般类的类名用正常字体粗体表示,如上图:抽象类名用斜体字粗体,如User:接 ...
- charles系列破解激活办法(最高charles4.2都可以激活)
// Charles Proxy License // 适用于Charles任意版本的注册码,谁还会想要使用破解版呢. // Charles 4.2目前是最新版,可用. Registered Na ...
- 洗礼灵魂,修炼python(39)--面向对象编程(9)—魔法方法表
好的,不多说,大招来了,几乎完整的魔法方法: 基本的魔法方法 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Defi ...
- AspNet Core2 浏览器缓存使用
Core2中使用Microsoft.AspNetCore.Mvc下的ResponseCacheAttribute特性来控制Http Get请求的缓存 原理是设置http请求 响应头的Cache-con ...
- 让bootstrap-table支持高度百分比
更改BootstrapTable.prototype.resetView 方法,以支持高度百分比定义,适应不同高度屏幕 BootstrapTable.prototype.resetView = fun ...