ArcGISforAndroid开发笔记——实现测量长度⾯积的最简单的
⽅式
⽼板接了⼀个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简易安卓app开发
public void geometryChanged(SketchGeometryChangedEvent sketchGeometryChangedEvent) {
switch (SketchCreationMode()){
case POLYLINE:
//在此进⾏polyline的计算
break;
case POLYGON:
//在此进⾏polygon的计算
break;
default:
break;
}
}
在计算长度⾯积的时候,会⽤到GeometryEngine这个类的length和area⽅法,对这个类在官⽅⽂档中有详细的解释,我这⾥就不说了。我要强调的⼀点,是计算长度⾯积的时候,⼀定要注意坐标系,⼀定要注意坐标系,⼀定要注意坐标系!重要的事说三遍。坐标系有两种:地理坐标系和投影坐标系。简单来说,地理坐标系是⼀个球⾯坐标系,坐标值⼀般是经纬度,单位⼀般是度,不同的地理坐标系,是模拟地球的椭球体的各种参数不同。⽽投影坐标系则是将椭球投影到了平⾯上,坐标值值是平⾯直⾓坐标值,单位⼀般是⽶(具体要看这个坐标系的定义)。在⽤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 (SketchCreationMode()){
case POLYLINE:
Geometry Geometry();
if (geometry!=null){
Polyline polyline=(Polyline) GeometryEngine.project(ate(3857));
Log.d("长度打印", "geometryChanged: "+GeometryEngine.length(polyline)+"⽶");
}
break;
case POLYGON:
Geometry Geometry();
if (polygonGeometry!=null){
Polygon polygon=(Polygon) GeometryEngine.project(ate(3857));
LinearUnit linearUnit=(ate(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服务的知识,这⼀块我费了差不多半个⽉才完全搞成功。希望感兴趣的同学可以关注我的博客。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论