`

几何对象的绘制

阅读更多


public class DrawGraphicElements extends Activity implements OnClickListener {

	MapView mapView = null;
	ArcGISTiledMapServiceLayer mTileMapLayer = null;
	GraphicsLayer graphicsLayer = null;
	MyTouchListener mTouchListener = null;
	Button geometryButton = null;
	Button clearButton = null;
	String mapURL = "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/PublicSafety/PublicSafetyBasemap/MapServer";
	final String[] geometryTypes = new String[] { "绘制点", "绘制线", "绘制区域" };
	int selectedGeometryIndex = -1;

	@SuppressWarnings("serial")
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		mapView = (MapView) findViewById(R.id.map);
		mTouchListener = new MyTouchListener(DrawGraphicElements.this, mapView);
		mapView.setOnTouchListener(mTouchListener);

		geometryButton = (Button) findViewById(R.id.geometrybutton);
		geometryButton.setEnabled(false);
		geometryButton.setOnClickListener(this);

		clearButton = (Button) findViewById(R.id.clearbutton);
		clearButton.setOnClickListener(this);

		mTileMapLayer = new ArcGISTiledMapServiceLayer(mapURL);
		graphicsLayer = new GraphicsLayer();
		mapView.addLayer(mTileMapLayer);
		mapView.addLayer(graphicsLayer);// 添加客户端要素图层

		// 地图加载的时候被调用:检查地图是否可用
		mTileMapLayer.setOnStatusChangedListener(new OnStatusChangedListener() {
			public void onStatusChanged(Object arg0, STATUS status) {
				if (status.equals(OnStatusChangedListener.STATUS.INITIALIZED)) {
					// 可用绘制按钮可用
					geometryButton.setEnabled(true);
				}
			}
		});

	}

	// 地图触摸事件
	class MyTouchListener extends MapOnTouchListener {

		MultiPath mMutiPath;//多路径
		String type = "";
		Point startPoint = null;

		public MyTouchListener(Context context, MapView view) {
			super(context, view);
		}

		public void setType(String geometryType) {
			this.type = geometryType;
		}

		public String getType() {
			return this.type;
		}

		// 绘制一个点
		public boolean onSingleTap(MotionEvent e) {
			if (type.length() > 1 && type.equalsIgnoreCase("POINT")) {
				graphicsLayer.removeAll();//清空要素图层

				Point point = mapView.toMapPoint(new Point(e.getX(), e.getY()));
				// 注意:因手机分辨率的差异,像素点的大小是有差别的
				SimpleMarkerSymbol markerSymbol = new SimpleMarkerSymbol(
						Color.BLUE, 30, STYLE.CIRCLE);
				Graphic graphic = new Graphic(point, markerSymbol);
				graphicsLayer.addGraphic(graphic);

				clearButton.setEnabled(true);
				return true;
			}
			return false;

		}

		//绘制一个点并移动
		public boolean onDragPointerMove(MotionEvent from, MotionEvent to) {
			if (type.length() > 1
					&& (type.equalsIgnoreCase("POLYLINE") || type
							.equalsIgnoreCase("POLYGON"))) {

				//终点
				Point toPoint = mapView.toMapPoint(to.getX(), to.getY());

				if (startPoint == null) {
					graphicsLayer.removeAll();
					//绘制线还是绘制区域
					mMutiPath = type.equalsIgnoreCase("POLYLINE") ? new Polyline(): new Polygon();
					//记录开始点
					startPoint = mapView.toMapPoint(from.getX(), from.getY());
					mMutiPath.startPath((float) startPoint.getX(),(float) startPoint.getY());

					SimpleLineSymbol lineSymbol=new SimpleLineSymbol(Color.BLUE,5);
					Graphic graphic = new Graphic(startPoint,lineSymbol);
					graphicsLayer.addGraphic(graphic);
				}

				mMutiPath.lineTo((float) toPoint.getX(), (float) toPoint.getY());

				return true;
			}
			return super.onDragPointerMove(from, to);

		}

		//绘制一个点后抬起
		@Override
		public boolean onDragPointerUp(MotionEvent from, MotionEvent to) {
			if (type.length() > 1
					&& (type.equalsIgnoreCase("POLYLINE") || type
							.equalsIgnoreCase("POLYGON"))) {
				if (type.equalsIgnoreCase("POLYGON")) {
					mMutiPath.lineTo((float) startPoint.getX(),(float) startPoint.getY());
					graphicsLayer.removeAll();
					//添加面
					Graphic graphic=new Graphic(mMutiPath,new SimpleFillSymbol(Color.WHITE)); 
					graphicsLayer.addGraphic(graphic);
					startPoint = null;
					clearButton.setEnabled(true);
				}
				else{
					//添加线
					Graphic graphic=new Graphic(mMutiPath,new SimpleLineSymbol(Color.BLUE, 5));
					graphicsLayer.addGraphic(graphic);
					startPoint = null;
					clearButton.setEnabled(true);
				}
				return true;
			}
			return super.onDragPointerUp(from, to);
		}
	}

	// 对话框
	protected Dialog onCreateDialog(int id) {
		return new AlertDialog.Builder(DrawGraphicElements.this).setTitle("绘制")
				.setItems(geometryTypes, new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						graphicsLayer.removeAll();
						String geomType = geometryTypes[which];
						selectedGeometryIndex = which;
						if (geomType.equalsIgnoreCase(geometryTypes[2])) {
							mTouchListener.setType("POLYGON");
						} else if (geomType.equalsIgnoreCase(geometryTypes[1])) {
							mTouchListener.setType("POLYLINE");
						} else if (geomType.equalsIgnoreCase(geometryTypes[0])) {
							mTouchListener.setType("POINT");
						}
					}
				}).create();
	}

	@Override
	protected void onPause() {
		super.onPause();
		mapView.pause();
	}

	@Override
	protected void onResume() {
		super.onResume();
		mapView.unpause();
	}

	@Override
	public void onClick(View v) {
		if (v == geometryButton) {
			showDialog(0);
		} else if (v == clearButton) {
			graphicsLayer.removeAll();
			clearButton.setEnabled(false);
		}

	}

}
 
  • 大小: 190.6 KB
分享到:
评论

相关推荐

    AE几何对象绘制系统

    几何对象绘制系统 功能如下:加载底图模块、地图书签模块、地图基本操作模块(属性表、放缩、移除图层)、绘制基本点线面模块、绘制Curve对象模块。 注:能够在加载底图后对其进行书签操作和其他一些基本操作,这...

    对象编辑对象绘制

    在超图6R中,对象绘制可能支持交互式模式,即用户可以直接在地图上点击或拖拽来创建几何对象,也可以通过导入数据文件批量绘制。 "对象裁剪"(clip)是一种空间分析功能,用于将一个地理对象(源对象)与另一个对象...

    百度地图js版api几何图形绘制保存到数据库并展示

    这个项目涉及到的主要知识点包括地图API的使用、几何对象的创建与操作、数据交互以及前端展示技术。 首先,百度地图JavaScript API是百度提供的一套用于在网页上展示地图、标注、轨迹等地理信息的开发工具。开发者...

    绘制规则多边形

    综上所述,"绘制规则多边形"的示例展示了如何利用SuperMap iClient 6R for JavaScript的API实现地图上的交互式几何对象绘制,这对于创建地理信息应用来说是至关重要的功能。开发者可以根据这个示例学习如何在自己的...

    自定义矢量几何对象的选择操作

    在GIS(地理信息系统)开发中,自定义矢量几何对象的选择操作是十分关键的一个功能,特别是在移动设备上,如Android平台。"自定义矢量几何对象的选择操作"这个主题涉及了如何在SuperMap iMobile Android环境中实现...

    osg教程 几何体绘制

    ### 几何体绘制方法 1. **底层手段**:使用OpenGL基元进行几何体的绘制。这种方法需要手动管理顶点数据和绘制命令,具有较高的灵活性但相对复杂。 2. **中级手段**:利用OSG提供的基本几何体(如立方体、球体等)...

    04-对象绘制.pdf

    对象绘制概述 • 对象:即几何对象,在 GIS 中对离散空间实体的抽象表示。...• WebGL中的绘制处理器对象提供了绘制各类几何对象的功 能,包括:点对象绘制、线对象绘制、面对象绘制和图标 对象绘制。

    一个基于VC++的几何图形绘制程序_一个基于VC++的几何图形绘制程序_

    在本文中,我们将深入探讨如何使用Microsoft Visual C++(简称VC++)开发一个几何图形绘制程序。VC++是Microsoft提供的一款强大的C++集成开发环境,它支持Windows API、MFC(Microsoft Foundation Classes)以及.NET...

    SuperMap Deskpro .NET 自定义对象绘制

    1. 创建几何对象:首先,我们需要创建一个表示箭头的几何对象。这可能是一个线性对象,如LineString,或者更复杂的多边形对象,比如由两个LineStrings组成的V形结构。我们可以使用`SuperMap.Geometry.PlanarGeometry...

    用VC++开发gis底层功能,具有图形绘制和数据库操作等功能

    1. **图形绘制**:在GIS中,图形绘制主要包括地图渲染、几何对象绘制和符号化。利用VC++的GDI+(Graphics Device Interface Plus)或DirectX等图形库,可以创建高效的图形绘制引擎。例如,你需要实现基本的几何形状...

    OPENGL中GLU和GLUT工具箱

    #### 几何对象绘制 在GLU中,可以通过以下函数绘制一些基本的几何图形: - **gluSphere**: 用于绘制球体。 - `void gluSphere(GLUquadricObj *qobj, GLdouble radius, GLint slices, GLint stacks);` - 参数`qobj...

    点和线多边形缓冲区 c#算法

    4. 绘制缓冲区:将创建好的缓冲区几何对象绘制到地图上。这可以通过WPF(Windows Presentation Foundation)的DrawingContext或GDI+(Graphics Device Interface)的Graphics类来实现。 在"SilverlightApplication1...

    百度地图绘制多边形几何图形并保存坐标转成覆盖物

    本话题聚焦于如何使用百度地图API来绘制多边形几何图形,并将这些图形的坐标保存,以便后续转化为地图上的覆盖物。下面将详细阐述这一过程。 首先,我们要了解百度地图API的核心功能。百度地图API提供了丰富的地图...

    各种几何图元的绘制

    在VC6的上下文中,视图类需要重载OnDraw函数,利用设备上下文(DC)对象来绘制几何图元。 为了完成这个上机作业,你需要掌握C++编程基础,特别是VC6环境下的编程。同时,理解计算机图形学的基本原理,如坐标系统、...

    ARCGIS JS API 4.9 节点编辑

    例如,当用户完成一个新的几何对象绘制或修改后,可以调用SketchViewModel的complete方法,将编辑的结果保存到地图图层中。 在提供的压缩包文件"Esri.LoadImg"中,可能包含了一些用于加载和显示图像的示例代码或...

    VC读取.shp文件源码

    4. 显示要素:在VC中,可以使用OpenGL、Direct2D或其他图形库将读取的几何对象绘制到屏幕上。对于点,可以直接画点;线则需要绘制连接的线段;面对应于填充的多边形。考虑颜色、填充模式、线宽等因素,以达到理想的...

    OpenGL初学者范例代码第二课

    OpenGL提供了多种基本的几何对象绘制方法,包括点、线和多边形。这些都可以通过`glBegin()`和`glEnd()`函数配合使用来实现。其中`glBegin()`定义了绘制的类型,而`glVertex*()`系列函数用于指定顶点位置。 - **点**...

    VC读取shapefile文件源码,处理点线面

    7. **处理和显示数据**:在MFC应用中,你可以使用GDI+或OpenGL等图形库将这些几何对象绘制到窗口上。这可能涉及坐标转换(如从投影坐标到屏幕坐标)、渲染几何形状以及添加交互功能。 8. **错误处理和优化**:在...

    geoJson源码.zip

    - 渲染器:将几何对象绘制到地图上。 - 查询功能:根据坐标、属性或其他条件查找特征。 - 编辑工具:允许用户修改几何对象的形状或属性。 - 保存和加载:将GeoJSON数据序列化为文件或从文件中加载。 通过深入理解并...

    glut库文件

    GLUT库在早期的OpenGL编程中占据了重要的地位,因为它提供了窗口系统独立的基础架构,包括窗口创建、事件处理和基本的几何对象绘制等功能。 **1. GLUT的主要功能** - **窗口管理**:GLUT库可以帮助开发者轻松地...

Global site tag (gtag.js) - Google Analytics