前言
在前文已经http://blog.youkuaiyun.com/david_ocean/article/details/13296125中已经说到了对于地图图层的添加,其中特意说明了矢量图层的特质,在线矢量图层的加载和离线矢量图层的权限问题。
而本章的重点,是通过矢量图层进行操作,完成绘制。在ArcGIS for Android中,矢量图层的离线加载是需要认证许可。而在mapview中自行创建的矢量图层,可以将矢量信息进行表达,只是无法存储而已。
查看API中,可知道,对于加载的在线矢量地图ArcGISFeatureLayer是GraphicsLayer的子类,而我们绘制信息的图层也是GraphicLayer图层。
体验
标绘基础结构
在ArcGIS for Android中,对于绘制的基本元素之一是Geometry,例如我们最常用也是最重要的就是:point,polyline,polygon。他们包含地理坐标信息和类型信息。在ArcGIS for Android中对于他们有自己的定义,请看看示意:
最最基本的单位是point。然后通过point可以自己组成一个点要素,然后若是想要组成polyline或者polyline的话,那么需要进行更多操作。Polyline和polygon的基本组成要素是line,可以理解成线段。而line是需要point来组成。每个line有且仅有两个point,也就是两点组成一段,然后又line来组成polyline和polygon。这和我们以往的理解有些不同。在以往的理解中,polyline和polygon都是由point组成的。所以现在有了这个不同,在这里本人就要特别提一下。
大家看到这个point,polyline以及polygon了,这些只能算是要素,自己是没有外形的。我们需要为其设定外形,点的形状,颜色,大小。线的粗细,颜色,虚线与否。面的透明度,颜色以及填充物样式等。这些在ArcGIS for Android中为Symbol中进行设定。Symbol的基本结构大概如此:
一个真正的标绘Graphic的基本组成单元是由Geometry和Symbol共同完成的,所以我们在设定标绘的时候,要使用两者一同设定。下文是Graphic的构造器的说明:
工程的建立
Menu的设定
在谈及完Graphic的结构原理后,现在需要做的是对于工程的建立来实现标绘的添加。
在界面中,不修改main.xml,整个屏幕不添加控件,让其显示最完成。然后所有操作设定在menu上面。我分成点,线,面三种类型的绘制,每种类型有一些选择来区别标绘内容。
Menu设定的实现代码:
//菜单的加载
@Override
public boolean onCreateOptionsMenu(Menu menu){
//加载点选择菜单
SubMenu pointSubMenu=menu.addSubMenu("点");
pointSubMenu.setHeaderTitle("选择绘制的点");
pointSubMenu.add(0, 0, 0, "图点");
pointSubMenu.add(0, 1, 0, "红点");
pointSubMenu.add(0, 2, 0, "蓝点");
pointSubMenu.add(0, 3, 0, "绿点");
//加载线选择菜单
SubMenu lineSubMenu=menu.addSubMenu("线");
lineSubMenu.setHeaderTitle("选择绘制的线");
lineSubMenu.add(1,0,0,"白线");
lineSubMenu.add(1, 1, 0, "红线");
lineSubMenu.add(1, 2, 0, "蓝虚线");
lineSubMenu.add(1, 3, 0, "黄粗线");
//加载面选择菜单
SubMenu gonMenu=menu.addSubMenu("面");
gonMenu.setHeaderTitle("选择绘制的面");
gonMenu.add(2, 0, 0, "红面");
gonMenu.add(2, 1, 0, "绿面半透明");
gonMenu.add(2,2,0,"蓝面虚线填充");
return super.onCreateOptionsMenu(menu);
}
//菜单项被单击的事件
@Override
public boolean onOptionsItemSelected(MenuItem mi){
isChoose=true;
//判断是在哪个groupid里面的
switch (mi.getGroupId()) {
case 0:
drawType=Geometry.Type.POINT;
switch (mi.getItemId()) {
case 0:
Drawable drawable=this.getResources().getDrawable(R.drawable.icon);
symbol=new PictureMarkerSymbol(drawable);
break;
case 1:
symbol=new SimpleMarkerSymbol(Color.RED, 14, SimpleMarkerSymbol.STYLE.CIRCLE);
break;
case 2:
symbol=new SimpleMarkerSymbol(Color.BLUE, 14, SimpleMarkerSymbol.STYLE.CIRCLE);
break;
case 3:
symbol=new SimpleMarkerSymbol(Color.GREEN, 14, SimpleMarkerSymbol.STYLE.CIR