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. js 绘制数学函数

    <!-- <!doctype html> --> <html lang="en"> <head> <meta charset= ...

  2. Oracle总结一

    1 数据库相关概念 1.1 数据 数据是描述事物的符号,它有多种表现形式:文本,图形,音频,视频.计算机处理数据的基本单位是字节. 1.2 数据库(Database, 简称DB) 同粮库,车库类似,数 ...

  3. Kubernetes 的几个重要概念

    Cluster Cluster 是计算.存储和网络资源的集合,Kubernetes 利用这些资源运行各种基于容器的应用. Master Master 是 Cluster 的大脑,它的主要职责是调度,即 ...

  4. Android 获取网络类型

    获取网络类型 public class IntenetUtil { //没有网络连接 public static final int NETWORN_NONE = 0; //wifi连接 public ...

  5. LoadRunner11录制脚本出现的问题

    问题一:无法启动IE浏览器 原因:设置录制程序的录制填写错误,因为IE有两个一个是32位的一个是64位的 我们需要设置浏览器为IE 32位即可正常运行 问题二:无法录制百度等官网页面 原因:录制选项中 ...

  6. The stacking context

    文档中的层叠上下文由满足以下任意一个条件的元素形成: 1. z-index 值不为 "auto"的 绝对/相对定位. 2. position位fixed. 3. opacity 属 ...

  7. pyhthon常用模块hashlib

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

  8. dumpe2fs 命令的使用,转储 ext2/ext3/ext4 文件系统信息

    使用man 命令可以查看 dumpe2fs 命令具体的使用的方法: NAME dumpe2fs - dump ext2/ext3/ext4 filesystem information SYNOPSI ...

  9. Linux防火墙基础与编写防火墙规则

    Iptables采用了表和链的分层结构,每个规则表相当于内核空间的一个容器,根据规则集的不同用途划分为默认的四个表,raw表,mangle表,nat表,filter表,每个表容器内包括不同的规则链,根 ...

  10. zookeeper-01 概述

    1. Zookeeper概念简介和应用场景 1.1.  概念简介 Zookeeper是一个分布式协调服务:就是为用户的分布式应用程序提供协调服务 A.zookeeper是为别的分布式程序服务的 B.Z ...