Arcgis for Android的地图操作里,放大缩小地图、图层切换、定位、测距测面等都是它的一些基本操作,封装后一般调用就是了,很简单。不过最近有了个需求,在地图上画一个多边形时候同时进行多边形的边长、周长和面积的计算,于是重新又写了下这个方法。代码不难,但是觉得挺有意思,于是写博文记录一下。
首先,需要在地图上画多边形。我们看到的每个地图都是一个图层,要在地图上画个多边形,就是在图层上加载一个图形,而这个图形就是用Graphic类来实现的。从Graphic最简单的构造函数:
public Graphic(Geometry geometry, Symbol symbol)我们可以看出,它主要由一个Geometry和一个Symbol构成。Geometry代表着所有0.1.2维几何图形,常用的包含了Point(点),Line(线段),Polyline(折线),Polygon(面)等。Symbol代表着这些几何图形的样式,比如点线面的大小和颜色等。
了解了基本信息以后,首先要执行的是点击地图画多边形,点击事件是:
mMapView.setOnSingleTapListener(new OnSingleTapListener() { @Override public void onSingleTap(float v, float v1) { PointToDrawPolygon(v, v1); } });传的两个参数分别是屏幕的坐标。
然后就是画多边形了。首先每次先要把图层清空一下,如果不清空,将会保留之前画的图形。想象一下,就是比如我们第三个点时候画了一个三角形,然后按第四个点时候画了一个四边形,如果不清空的话,就是四边形覆盖在三角形上的样子。
if (messureGraphicsLayer!=null){ messureGraphicsLayer.removeAll(); }接下来是将屏幕点转为地图上的点,并设置样式画上去:
Point mPoint = diitMapView.toMapPoint(v, v1);//选择点 mPoints.add(mPoint);//选择点加入点的集合 Graphic messurePoint = new Graphic(mPoint, symbolFactory.createMeasureMarkerSymbol());//点的要素初始化 messureGraphicsLayer.addGraphic(messurePoint);//点的要素添加到图层这里说下Symbol类,主要有一下几种:
然后是进行判断,设置面的初始点,以及将之后各个点连接成折线和面:
if (mPoints.size() == 1) { messurePolygon.startPath(mPoints.get(0));//设置面的初始点 } if (mPoints.size() > 1) { messureGraphicsLayer.removeAll(); messurePolyline.setEmpty(); messurePolygon.lineTo(mPoint);//连接到当前点击的点 messurePolygon.lineTo(mPoints.get(0));//连接到初始点 for (int i = 0; i < mPoints.size() - 1; i++) { messureLine.setStart(mPoints.get(i)); messureLine.setEnd(mPoints.get(i + 1)); messurePolyline.addSegment(messureLine, true); messureGraphicsLayer.addGraphic(new Graphic(mPoints.get(i), symbolFactory.createMeasureMarkerSymbol())); } messureGraphicsLayer.addGraphic(new Graphic(mPoints.get(mPoints.size() - 1), symbolFactory.createMeasureMarkerSymbol())); messureLine.setStart(mPoint); messureLine.setEnd(mPoints.get(0)); messurePolyline.addSegment(messureLine, true); Graphic messureLineGraphic = new Graphic(messurePolyline, symbolFactory.createMeasureLineSymbol()); Graphic messureAreaGraphic = new Graphic(messurePolygon, symbolFactory.createMeasureFillSymbol());//初始化面的要素 messureGraphicsLayer.addGraphic(messureAreaGraphic);//将面的要素添加到图层 messureGraphicsLayer.addGraphic(messureLineGraphic); messurePolygon.startPath(mPoint);//将当前点设为初始点 }接下来就是要计算边长、周长和面积了。基本原则是这样的,用Line计算边长,用Polyline计算周长,用Polygon计算面积,计算时候也注意下最后一个边:
if (mPoints.size() > 1) { messureLine.setStart(mPoints.get(mPoints.size() - 2));//将上一个点作为起始点 messureLine.setEnd(mPoints.get(mPoints.size() - 1));//将该点作为终止点 messurePolyline.addSegment(messureLine, true);//将线段加入到线段组 Graphic messureLineGraphic = new Graphic(messurePolyline, symbolFactory.createMeasureLineSymbol());//将线段组变为线段要素 TextSymbol ts = new TextSymbol(16,String.format("%.2f", messureLine.calculateLength2D())+"m",Color.BLACK); Polyline line=new Polyline(); line.addSegment(messureLine,true); Graphic textGraphic=new Graphic(line,ts); listgraphic.add(textGraphic); for(Graphic graphic:listgraphic) { messureGraphicsLayer.addGraphic(graphic); } messureGraphicsLayer.addGraphic(messureLineGraphic);//将线段组要素添加到图层 messureDistance += messureLine.calculateLength2D();//累计计算线段长度 tvMessureResult.setText("长度:"+String.format("%.2f", messureDistance) + "m");//文本设置长度 showMessureResult(tvMessureResult, mPoint);//显示出来 } if (mPoints.size() > 2) { Line lastLine=new Line(); lastLine.setStart(mPoints.get(mPoints.size() - 1)); lastLine.setEnd(mPoints.get(0)); Polyline lastPolyline=new Polyline(); lastPolyline.addSegment(lastLine,true); TextSymbol ts = new TextSymbol(16,String.format("%.2f", lastPolyline.calculateLength2D())+"m",Color.BLACK); Graphic textGraphic=new Graphic(lastPolyline,ts); messureGraphicsLayer.addGraphic(textGraphic); double messureArea = messurePolygon.calculateArea2D();//计算面积 tvMessureResult.setText("周长:"+String.format("%.2f", messureDistance+lastLine.calculateLength2D()) + "m"+"\n"+"面积:"+String.format("%.2f", Math.abs(messureArea)) + "㎡");//设置面积文本 showMessureResult(tvMessureResult, mPoint); }