zoukankan      html  css  js  c++  java
  • 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
    %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
    %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;
    	}
    
    }
    
  • 相关阅读:
    使用VSCode创建简单的Razor Webapp--1.入门
    ASP.NET Razor 常用示例
    ASP.NET Razor 语法
    ASP.NET Razor简介
    EF CodeFirst 一对一、一对多、多对多关系
    mysql外键
    EF CodeFirst 之 Fluent API
    替换JDK 对eclipse的影响?
    mysql数据库,安装 !创建!...详解!
    Apache的commons工具类
  • 原文地址:https://www.cnblogs.com/yitianhe/p/5045975.html
Copyright © 2011-2022 走看看