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

原创 2016年11月07日 16:42:58

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



版权声明:本文为博主原创文章,未经博主允许不得转载。

ArcGis for Android 10.2.8个人整理

个人对以前ArcGis的一些总结和分享:
  • qq_17338093
  • qq_17338093
  • 2016年08月03日 17:30
  • 3698

android中计算多边形的面积

List list :保存的 是点的坐标 public float caculate(Listlist){ float temp=0; for (int i=0;iif (i1){ ...
  • Zhudonggangg
  • Zhudonggangg
  • 2017年04月20日 16:12
  • 358

ArcGIS for Android 体验(二) 绘制标绘

前言 在前文已经http://blog.csdn.net/david_ocean/article/details/13296125中已经说到了对于地图图层的添加,其中特意说明了矢量图层的特质,在线矢...
  • luckypeng
  • luckypeng
  • 2015年04月17日 09:56
  • 3463

ArcGIS Api For Android学习之(三)画点、线、面

本节目标:实现学习DrawGraphicElements例子利用GraphicsLayer在地图上画点、线和面。 关键要点: 1. 屏幕点击事件监听。 2. 符号的设置 具体代码如下: ...
  • SYDBC
  • SYDBC
  • 2013年12月05日 10:54
  • 5544

ArcGIS Android API 应用开发之图形绘制与长度面积量算

本文通过一个简单的小Demo,向大家介绍如何使用ArcGIS Android API绘制点、线、面图形,并且测量线的长度和多边形的面积。 首先来看一下程序运行的效果图: ...
  • esricd
  • esricd
  • 2012年05月22日 16:58
  • 12599

arcgis for android 地图上画框划线

主类中: 完成各种view初始化后,添加该代码  MyTouchListener  myListener = new MyTouchListener(context, mapView,graphi...
  • mwthe
  • mwthe
  • 2015年11月11日 12:42
  • 1706

ArcGIS for Android示例解析之标绘-----DrawGraphicElements

DrawGraphicElements     在ArcGIS中除了显示不同地图,还有一块非常重要,就是这个实例要介绍的绘图,如:绘制点、线、面等图形。 废话少说直入主题,首先我们还是先来了解...
  • wozaifeiyang0
  • wozaifeiyang0
  • 2012年03月06日 09:18
  • 8107

Siverlight for arcgis环境下polygon和polyline两种方式绘制多边形

  • 2013年03月22日 10:05
  • 4.98MB
  • 下载

喜大普奔!!ArcGIS for Android 100.2 支持本地Shapefile文件的编辑啦!!!

对于Shapfile这一文件格式,ArcGIS Runtime SDK for Android 在100.2.0系列中推出了两大重磅利好消息: (1) 实现对本地 Shapfile 文件的加载、显示...
  • zssai2015
  • zssai2015
  • 2018年01月11日 20:53
  • 192

ArcGIS for Android Runtime100 基本操作(一)——点线面测距离长度和面积

本篇实现点要素与点要素之间距离量测,线要素长度量测和面要素以及envelope要素面积量测。...
  • gislaozhang
  • gislaozhang
  • 2017年10月03日 00:08
  • 627
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Arcgis for Android在地图上画多边形并进行边长、周长和面积的测量
举报原因:
原因补充:

(最多只允许输入30个字)