本文主要讲解如何通过触摸点击的方式,对MapView中显示的Graphics图形进行identify交互几何查询,并返回相关消息。
实现步骤:
1.创建Android项目
2.添加Runtime SDK依赖
3.添加权限及OpenGL ES支持
前三步本文省略,初学者可参照ArcGIS Runtime SDK for Android 入门(1):第一个地图应用程序(二维)
4.设置界面布局
布局XML代码:
<!-- MapView控件 -->
<com.esri.arcgisruntime.mapping.view.MapView
android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.esri.arcgisruntime.mapping.view.MapView>
5.编写代码:
思路:要实现对MapView中触控的图形进行识别,首先要从MapView中的触控事件下手,覆写并扩展其中的事件,实现Graphics图形的识别。
步骤:在Activity中
(1)变量准备:
//MapView控件变量
private MapView mMapView;
//用于在MapView中储存图形的GraphicsOverlay变量
private GraphicsOverlay grOverlay;
(2)onCreate方法:
// 通过layout获取MapView控件
mMapView = (MapView) findViewById(R.id.mapView);
// 创建一个以地形图为底图的地图对象
ArcGISMap mMap = new ArcGISMap(Basemap.Type.TOPOGRAPHIC, 3.184710, -4.734690, 2);
// 设置地图在MapView中被显示
mMapView.setMap(mMap);
// 设置与MapView进行交互的手势,这里是自定义的mMapViewTouchListener
MapViewTouchListener mMapViewTouchListener = new MapViewTouchListener(this, mMapView);
mMapView.setOnTouchListener(mMapViewTouchListener);
//在地图上添加一个图形
addGraphicsOverlay();
(3)添加Graphic图形方法:
private void addGraphicsOverlay() {
// 创建多边形几何形状
PolygonBuilder polygonGeometry = new PolygonBuilder(SpatialReferences.getWebMercator());
polygonGeometry.addPoint(-20e5, 20e5);
polygonGeometry.addPoint(20e5, 20.e5);
polygonGeometry.addPoint(20e5, -20e5);
polygonGeometry.addPoint(-20e5, -20e5);
// 创建solid line symbol(实心线符号)
SimpleFillSymbol polygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, null);
// 通过几何形状对象(Geometry)和符号对象(Symbol)创建一个图形(Graphic)对象
Graphic graphic = new Graphic(polygonGeometry.toGeometry(), polygonSymbol);
// 创建GraphicsOverlay
grOverlay = new GraphicsOverlay();
// 创建Graphic图形列表
ListenableList<Graphic> graphics = grOverlay.getGraphics();
// 将Graphic添加至GraphicsOverlay
graphics.add(graphic);
// 将GraphicsOverlay添加到MapView中
mMapView.getGraphicsOverlays().add(grOverlay);
(4)MapView的自定义手势监听:
//覆写MapView的默认手势
class MapViewTouchListener extends DefaultMapViewOnTouchListener {
//通过指定的Context和MapView对象对DefaultMapViewOnTouchListener进行构造
public MapViewTouchListener(Context context, MapView mapView){
super(context, mapView);
}
//覆写onSingleTapConfirmed的手势方法去处理用户对MapView的触摸点击,并且当图形被选中时,还要对其进行监测
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// 获取用户点击的屏幕点
android.graphics.Point screenPoint = new android.graphics.Point((int)e.getX(), (int)e.getY());
// 识别GraphicsOverlay中的Graphic
final ListenableFuture<IdentifyGraphicsOverlayResult> identifyGraphic = mMapView.identifyGraphicsOverlayAsync(grOverlay, screenPoint, 10.0, false, 2);
identifyGraphic.addDoneListener(new Runnable() {
@Override
public void run() {
try {
IdentifyGraphicsOverlayResult grOverlayResult = identifyGraphic.get();
// 获取识别的GraphicOverlay返回的图形列表
List<Graphic> graphic = grOverlayResult.getGraphics();
// 获取结果列表的大小
int identifyResultSize = graphic.size();
if(!graphic.isEmpty()){
// 当识别的图形成功返回时,返回一个Toast信息提示
Toast.makeText(getApplicationContext(), "Tapped on " + identifyResultSize + " Graphic", Toast.LENGTH_SHORT).show();
}
}catch(InterruptedException | ExecutionException ie){
ie.printStackTrace();
}
}
});
return super.onSingleTapConfirmed(e);
}
}
6.运行APP:当对图形进行点击,APP会返回提示。
感谢luq老师的指导