ArcGIS for Android是Esri公司推出的基于Android平台的移动开发包。与ArcGIS for IOS及ArcGIS for Windows Phone一样,ArcGIS for Android访问ArcGIS Server发布的REST服务,包括动态服务、切片服务、要素服务等地图服务,Query、Identify、GP等空间分析服务。
ArcGIS for Android提供了很好的开发资料,包括API Reference、Sample等,为了方便开发,还提供了ArcGIS Plugin for Eclipse,用于创建专门基于ArcGIS for Android的项目。至于如何配置开发环境、如何使用ArcGIS for Android SDK实现MobileGIS的基本功能,可以参考牛人牛魔王有关ArcGIS for Android的系列技术文章(牛魔王博客:http://blog.csdn.net/warrenwyf)。
了解了一点ArcGIS for Android之后,发现在开发中对于手势事件的响应是一个需要一点时间琢磨的问题,所以写了一个入门程序DrawTool。DrawTool是一个可以画点、线、矩形、多边形、圆形的工具类,进行了简单封装,能满足一般的画图需求。通过这个程序能够较好的掌握ArcGIS for Android中该如何处理各种手势事件。程序中的DrawToolActivity.java展示了如何调用DrawTool。
DrawToolActivity.java代码如下,源代码下载地址:http://download.csdn.net/source/3552287
ArcGIS Android SDK 2.0版本下的DrawTool2.0:http://blog.csdn.net/arcgis_mobile/article/details/8084763
package com.esrichina.android;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.MapView;
import com.esri.core.symbol.MarkerSymbol;
import com.esri.core.symbol.SimpleMarkerSymbol;
import com.esrichina.android.ext.drawtool.DrawEvent;
import com.esrichina.android.ext.drawtool.DrawEventListener;
import com.esrichina.android.ext.drawtool.DrawTool;
import com.esrichina.demo.geocoding.R;
/**
*
* @author ropp gispace@yeah.net
*
* 由于要响应DrawTool的画图事件,此处需要实现DrawEventListener接口
*/
public class DrawToolActivity extends Activity implements DrawEventListener{
private MapView mapView;
private GraphicsLayer drawLayer;
private DrawTool drawTool;
private MarkerSymbol markerSymbol;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.mapView = (MapView)this.findViewById(R.id.map);
this.drawLayer = new GraphicsLayer(this.mapView.getContext());
this.mapView.addLayer(this.drawLayer);
// 初始化DrawTool实例
this.drawTool = new DrawTool(this.mapView);
// 将本Activity设置为DrawTool实例的Listener
this.drawTool.addEventListener(this);
// 此处可以根据需要设置DrawTool实例画图时使用的各种symbol
this.markerSymbol = new SimpleMarkerSymbol(Color.RED, 20, SimpleMarkerSymbol.STYLE.CIRCLE);
//this.drawTool.setMarkerSymbol(markerSymbol);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.point:
drawTool.activate(DrawTool.POINT);
break;
case R.id.envelope:
drawTool.activate(DrawTool.ENVELOPE);
break;
case R.id.polygon:
drawTool.activate(DrawTool.POLYGON);
break;
case R.id.polyline:
drawTool.activate(DrawTool.POLYLINE);
break;
case R.id.freehandpolygon:
drawTool.activate(DrawTool.FREEHAND_POLYGON);
break;
case R.id.freehandpolyline:
drawTool.activate(DrawTool.FREEHAND_POLYLINE);
break;
case R.id.circle:
drawTool.activate(DrawTool.CIRCLE);
break;
case R.id.clear:
this.drawLayer.clear();
this.drawLayer.postInvalidate();
this.drawTool.deactivate();
break;
}
return true;
}
// 实现DrawEventListener中定义的方法
public void handleDrawEvent(DrawEvent event) {
// 将画好的图形(已经实例化了Graphic),添加到drawLayer中并刷新显示
this.drawLayer.addGraphic(event.getDrawGraphic());
this.drawLayer.postInvalidate();
}
}
效果图如下: