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
分享到:
相关推荐
几何对象绘制系统 功能如下:加载底图模块、地图书签模块、地图基本操作模块(属性表、放缩、移除图层)、绘制基本点线面模块、绘制Curve对象模块。 注:能够在加载底图后对其进行书签操作和其他一些基本操作,这...
在超图6R中,对象绘制可能支持交互式模式,即用户可以直接在地图上点击或拖拽来创建几何对象,也可以通过导入数据文件批量绘制。 "对象裁剪"(clip)是一种空间分析功能,用于将一个地理对象(源对象)与另一个对象...
这个项目涉及到的主要知识点包括地图API的使用、几何对象的创建与操作、数据交互以及前端展示技术。 首先,百度地图JavaScript API是百度提供的一套用于在网页上展示地图、标注、轨迹等地理信息的开发工具。开发者...
综上所述,"绘制规则多边形"的示例展示了如何利用SuperMap iClient 6R for JavaScript的API实现地图上的交互式几何对象绘制,这对于创建地理信息应用来说是至关重要的功能。开发者可以根据这个示例学习如何在自己的...
在GIS(地理信息系统)开发中,自定义矢量几何对象的选择操作是十分关键的一个功能,特别是在移动设备上,如Android平台。"自定义矢量几何对象的选择操作"这个主题涉及了如何在SuperMap iMobile Android环境中实现...
### 几何体绘制方法 1. **底层手段**:使用OpenGL基元进行几何体的绘制。这种方法需要手动管理顶点数据和绘制命令,具有较高的灵活性但相对复杂。 2. **中级手段**:利用OSG提供的基本几何体(如立方体、球体等)...
对象绘制概述 • 对象:即几何对象,在 GIS 中对离散空间实体的抽象表示。...• WebGL中的绘制处理器对象提供了绘制各类几何对象的功 能,包括:点对象绘制、线对象绘制、面对象绘制和图标 对象绘制。
在本文中,我们将深入探讨如何使用Microsoft Visual C++(简称VC++)开发一个几何图形绘制程序。VC++是Microsoft提供的一款强大的C++集成开发环境,它支持Windows API、MFC(Microsoft Foundation Classes)以及.NET...
1. 创建几何对象:首先,我们需要创建一个表示箭头的几何对象。这可能是一个线性对象,如LineString,或者更复杂的多边形对象,比如由两个LineStrings组成的V形结构。我们可以使用`SuperMap.Geometry.PlanarGeometry...
1. **图形绘制**:在GIS中,图形绘制主要包括地图渲染、几何对象绘制和符号化。利用VC++的GDI+(Graphics Device Interface Plus)或DirectX等图形库,可以创建高效的图形绘制引擎。例如,你需要实现基本的几何形状...
#### 几何对象绘制 在GLU中,可以通过以下函数绘制一些基本的几何图形: - **gluSphere**: 用于绘制球体。 - `void gluSphere(GLUquadricObj *qobj, GLdouble radius, GLint slices, GLint stacks);` - 参数`qobj...
4. 绘制缓冲区:将创建好的缓冲区几何对象绘制到地图上。这可以通过WPF(Windows Presentation Foundation)的DrawingContext或GDI+(Graphics Device Interface)的Graphics类来实现。 在"SilverlightApplication1...
本话题聚焦于如何使用百度地图API来绘制多边形几何图形,并将这些图形的坐标保存,以便后续转化为地图上的覆盖物。下面将详细阐述这一过程。 首先,我们要了解百度地图API的核心功能。百度地图API提供了丰富的地图...
在VC6的上下文中,视图类需要重载OnDraw函数,利用设备上下文(DC)对象来绘制几何图元。 为了完成这个上机作业,你需要掌握C++编程基础,特别是VC6环境下的编程。同时,理解计算机图形学的基本原理,如坐标系统、...
例如,当用户完成一个新的几何对象绘制或修改后,可以调用SketchViewModel的complete方法,将编辑的结果保存到地图图层中。 在提供的压缩包文件"Esri.LoadImg"中,可能包含了一些用于加载和显示图像的示例代码或...
4. 显示要素:在VC中,可以使用OpenGL、Direct2D或其他图形库将读取的几何对象绘制到屏幕上。对于点,可以直接画点;线则需要绘制连接的线段;面对应于填充的多边形。考虑颜色、填充模式、线宽等因素,以达到理想的...
OpenGL提供了多种基本的几何对象绘制方法,包括点、线和多边形。这些都可以通过`glBegin()`和`glEnd()`函数配合使用来实现。其中`glBegin()`定义了绘制的类型,而`glVertex*()`系列函数用于指定顶点位置。 - **点**...
7. **处理和显示数据**:在MFC应用中,你可以使用GDI+或OpenGL等图形库将这些几何对象绘制到窗口上。这可能涉及坐标转换(如从投影坐标到屏幕坐标)、渲染几何形状以及添加交互功能。 8. **错误处理和优化**:在...
- 渲染器:将几何对象绘制到地图上。 - 查询功能:根据坐标、属性或其他条件查找特征。 - 编辑工具:允许用户修改几何对象的形状或属性。 - 保存和加载:将GeoJSON数据序列化为文件或从文件中加载。 通过深入理解并...
GLUT库在早期的OpenGL编程中占据了重要的地位,因为它提供了窗口系统独立的基础架构,包括窗口创建、事件处理和基本的几何对象绘制等功能。 **1. GLUT的主要功能** - **窗口管理**:GLUT库可以帮助开发者轻松地...