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 开发 面积计算示例代码的更多相关文章

  1. Android开发中使用代码删除数据库

    更多信息参考:Android开发中使用代码删除数据库 在Android开发中,如果用到数据库,就会有一个很麻烦的问题,就是有时候需要删除数据库很麻烦,要打开Android Device Monitor ...

  2. Android 开发怎样做代码加密或混淆?

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 在大公司怎么做android代码混淆的?发现他们的软件用apktool反编译居然没看到classes.dex文件和当前安卓APP加固到底该如何做到防 ...

  3. Linux命令行下编译Android NDK的示例代码

    这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能接近原生应用.所以花了点时间研究 Android ND ...

  4. android开发系列之代码整洁之道

    说起代码整洁之道,想必大家想到更多的是那本经典重构书籍.没错,记得当时自己读那本书的时候,一边结合项目实战,一边结合书中的讲解,确实学到了很多东西,对我自己的编码风格影响极深.随着时间的流逝,书中很多 ...

  5. 【项目实例】android开发游戏音效代码实例

    //音效的音量 int streamVolume; //定义SoundPool 对象 private SoundPool soundPool; //定义HASH表 private HashMap< ...

  6. Android开发工程师文集-相关控件的讲解,五大布局

    前言 大家好,给大家带来Android开发工程师文集-相关控件的讲解,五大布局的概述,希望你们喜欢 TextView控件 TextView控件有哪些属性: android:id->控件的id a ...

  7. Android开发网上的一些重要知识点[经验分享]

    1. android单实例运行方法 我们都知道Android平台没有任务管理器,而内部App维护者一个Activity history stack来实现窗口显示和销毁,对于常规从快捷方式运行来看都是s ...

  8. 【转载】Eclipse:Android开发中如何查看System.out.println的输出内容

    Android开发中在代码中通过System.out.println的输出内容不知道去哪了,在console视图中看不到.而通过Log.i之类的要在Logcat视图中看到,夹杂了太多的其它App及底层 ...

  9. IDEA插件(Android Studio插件)开发示例代码及bug解决

    IDEA插件(Android Studio插件)开发示例代码及bug解决 代码在actionPerformed方法中,有个AnActionEvent e 插件开发就是要求我们复写上述的这个方法即可,在 ...

随机推荐

  1. git与vscode连接的一种简单方式

    首先你得安装git,如果你还没安装git,推荐你一个视频git的下载与安装,这套视频包含VS code和git的基本使用,当你看完它,就可以不看我的这篇博客了. 废话不多说,直接进入正题: 首先进入g ...

  2. Spring Boot MyBatis配置多种数据库

    mybatis-config.xml是支持配置多种数据库的,本文将介绍在Spring Boot中使用配置类来配置. 1. 配置application.yml # mybatis配置 mybatis: ...

  3. App里面如何正确显示用户头像

    1.说明,一般用户头像在上传的时候都会处理为正方形,如果没有处理该怎么正确显示用户头像呢?解决方案:用css强制 在线地址移动端:戳这里 <div class="main-meimg& ...

  4. 快捷键整理(来源:http://www.cnblogs.com/xing901022/p/4741630.htm)

    Eclipse 跳转到指定行:ctrl+l 1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shif ...

  5. 安卓开发_浅谈AsyncTask

    现在就来学习一下AsyncTask. 一.先介绍一下AsyncTask: 在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给 ...

  6. Flume Channel Selector

    Flume 基于Channel Selector可以实现扇入.扇出. 同一个数据源分发到不同的目的,如下图. 在source上可以定义channel selector: 1 2 3 4 5 6 7 8 ...

  7. pyhthon常用模块hashlib

    python hashlib模块 一,hashlib模块主要用于加密,其中提供sha1,sha224,sha256,sha384,sha512,md5算法.常用的使用md5即可完成需求. 一,使用md ...

  8. 08-OpenLDAP主机控制策略

    OpenLDAP主机控制策略 阅读视图 参考 环境准备 openldap服务端配置 openldap客户端配置 客户端测试登录 故障处理 1. 参考 本文基本转载博客openldap主机访问控制(基于 ...

  9. SVN与Git比较的优缺点差异

    目录: SVN与Git比较(一)集中式vs分布式 SVN与Git比较(二)版本库与工作区 SVN与Git比较(三)全局版本号和全球版本号 SVN与Git比较(四)部分检出 SVN与Git比较(五)更新 ...

  10. MySQL面试题之如何优化一条有问题的SQL语句?

    如何优化一条有问题的sql语句? 针对sql语句的优化.我们可以从如下几个角度去分析 回归到表的设计层面,数据类型选择是否合理 大表碎片的整理是否完善 表的统计信息,是不是准确的 审查表的执行计划,判 ...