ArcGIS for Android开发笔记——实现测量长度面积的最简单的方式

老板接了一个GIS的安卓手机APP系统,主要是我负责在做,地图的展示部分使用了ArcGIS SDK for Android。因为以前没有使用过Android,而且网上关于这个的使用教程也非常之少,所以准备把开发中遇到的问题做一个笔记,希望能帮助到需要的同学吧。首先,ArcGIS SDK for Android的安装我在这里不详细说了,我用的是100.3的版本(现在已经到100.4)了,具体怎么安装可以在ArcGIS 的官网的guide部分自己看。需要说明的是,如果要了解ArcGIS SDK for Android的开发,官网是你获取信息的最最权威的渠道,里面有很多例子和类参考,都可以看看。另外,遇到问题用谷歌搜索也可以,百度的话。。。搜索结果实在不敢恭维。

言归正传,这一部分主要讲一下怎么实现在地图上测量面积的功能以及会遇到的一些问题。

首先,为了简单实现在地图上绘制线和多边形的功能,我们使用ArcGIS现有的工具——草图编辑器(SketchEditor),官网关于这个类的介绍在这里可以看到(网上有很多自己通过GraphicLayer实现的,自己实现的话逻辑太复杂了,而且还不一定有ArcGIS官方的好用,所以使用官方的草图编辑工具是最简单的方法)。

使用时,首先new一个SketchEditor,然后将其加入到MapView控件中。

mSketchEditor=new SketchEditor();
mMapView.setSketchEditor(mSketchEditor);

然后,在要开始草图编辑的时候,开启草图编辑。这里需要注意,start的时候,需要传一个参数,告诉系统你要绘制的草图是什么类型,比如如果是polyline,则是:

mSketchEditor.start(SketchCreationMode.POLYLINE);

如果是polygon,则是:

mSketchEditor.start(SketchCreationMode.POLYGON);

然后就可以在MapView控件中绘制了。绘制的时候,你会发现,ArcGIS把这个控件做的很好,长按某个节点,可以移动、删除。我感觉唯一的缺点就是,长按移动的时候,很容易会移动地图,而不是草图,这个还需要改进。

接下来,就需要测量polyline的长度和面积了。查看官方文档,会发现SketchEditor在绘制的几何形状改变的时候,可以增加一个监听器,那每当几何形状改变的时候,我们就可以在这个监听器里,计算面积长度,然后刷新显示界面了。增加监听器的代码如下:

mSketchEditor.addGeometryChangedListener(new SketchGeometryChangedListener() {
            @Override
            public void geometryChanged(SketchGeometryChangedEvent sketchGeometryChangedEvent) {
                switch (mSketchEditor.getSketchCreationMode()){
                    case POLYLINE:
                        //在此进行polyline的计算
                        break;
                    case POLYGON:
                        //在此进行polygon的计算
                        break;
                    default:
                        break;
                }
            }

在计算长度面积的时候,会用到GeometryEngine这个类的lengtharea方法,对这个类在官方文档中有详细的解释,我这里就不说了。我要强调的一点,是计算长度面积的时候,一定要注意坐标系,一定要注意坐标系,一定要注意坐标系!重要的事说三遍。坐标系有两种:地理坐标系和投影坐标系。简单来说,地理坐标系是一个球面坐标系,坐标值一般是经纬度,单位一般是度,不同的地理坐标系,是模拟地球的椭球体的各种参数不同。而投影坐标系则是将椭球投影到了平面上,坐标值值是平面直角坐标值,单位一般是米(具体要看这个坐标系的定义)。在用GeometryEngine计算长度面积的时候,一定是在投影坐标系下计算的!如果不是投影坐标系,则要将地理坐标系转换成投影坐标系。而在ArcGIS SDK for Android中,MapView的坐标系一般是由第一个加入的地图确定的。比如我加入的底图是WGS84的地理坐标系(WKT值为4326,即通常我们所说的GPS坐标),那我绘制草图得到的几何图形的坐标系就是WGS84地理坐标系,坐标的单位是度,所以要计算我草图绘制的几何图形的长度面积,首先要把这些几何图形准换成投影坐标系的,比如我就将他们转换成了WGS84投影坐标(WKT值为3857)。转换时,要用GeometryEngine类的project方法,具体参数看文档。下面的代码是我计算长度和面积的(注意,因为WGS84投影坐标规定了单位是米,所以对对应的计算的长度的单位是米,面积的单位是平方米)。

mSketchEditor.addGeometryChangedListener(new SketchGeometryChangedListener() {
            @Override
            public void geometryChanged(SketchGeometryChangedEvent sketchGeometryChangedEvent) {
                switch (mSketchEditor.getSketchCreationMode()){
                    case POLYLINE:
                        Geometry geometry=mSketchEditor.getGeometry();
                        if (geometry!=null){
                            Polyline polyline=(Polyline) GeometryEngine.project(geometry,SpatialReference.create(3857));
                            Log.d("长度打印", "geometryChanged: "+GeometryEngine.length(polyline)+"米");
                        }
                        break;
                    case POLYGON:
                        Geometry polygonGeometry=mSketchEditor.getGeometry();
                        if (polygonGeometry!=null){
                            Polygon polygon=(Polygon) GeometryEngine.project(polygonGeometry,SpatialReference.create(3857));
                            LinearUnit linearUnit=(LinearUnit)SpatialReference.create(3857).getUnit();
                            AreaUnit unit=new AreaUnit(linearUnit);
                            Log.d("面积打印", "geometryChanged: "+GeometryEngine.area(polygon)+"平方米");
                        }
                        break;
                    default:
                        break;
                }
            }

最后,在草图绘制完成的时候,可以调用SketchEditor的stop方法来结束绘制。如果要重新开始的话,重新调用start方法即可。

好了,长度面积计算就简单介绍到这,如果有什么问题,可以给我留言。下一篇博客想讲一下ArcGIS SDK for Android加载WMS服务以及用MapGuide来发布WMS服务的知识,这一块我费了差不多半个月才完全搞成功。希望感兴趣的同学可以关注我的博客。

扫描二维码关注公众号,回复: 3864564 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_31709249/article/details/83585946