Arcgis for Android在地图上画多边形并进行边长、周长和面积的测量

        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类,主要有一下几种:

Arcgis for Android在地图上画多边形并进行边长、周长和面积的测量_第1张图片

         然后是进行判断,设置面的初始点,以及将之后各个点连接成折线和面:

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);
    }



你可能感兴趣的:(Arcgis for Android在地图上画多边形并进行边长、周长和面积的测量)