arcgis for android 图例

ArcGISTiledMapServiceLayer atm = new ArcGISTiledMapServiceLayer(serviceUrl);
ArcGISFeatureLayer afl = new ArcGISFeatureLayer(layerUrl,ArcGISFeatureLayer.MODE.ONDEMAND);
mMapView.addLayer(atm);
mMapView.addLayer(afl);
mMapView.setOnLongPressListener(this);

 

 

 

 

2、我们要做一个图例肯定要有一个名字和一个图片,好我们可以定义好实体类。实体类如下:
 

 

public class Legend {
	//名字
	private String name;
	//图片
	private Bitmap bitmap;

	public Legend(String name, Bitmap bitmap) {
		super();
		this.name = name;
		this.bitmap = bitmap;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Bitmap getBitmap() {
		return bitmap;
	}

	public void setBitmap(Bitmap bitmap) {
		this.bitmap = bitmap;
	}
}


3、实体类建好后我们就可以写我们的适配器了,我们需要在listview中去展示这个图例,那么这个适配器事实上就很简单了。

 

 

class MyAdapter extends BaseAdapter {
		public int getCount() {
			return gends.size();
		}
		
		public Object getItem(int position) {
			return gends.get(position);
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			ListViewHolder holder;
			if (convertView == null) {
				holder = new ListViewHolder();
				convertView = View.inflate(GetLegendActivity.this,R.layout.apdapter, null);
				holder.legendview = (ImageView) convertView.findViewById(R.id.adapter_image);
				holder.textview = (TextView) convertView.findViewById(R.id.adapter_text);
			} else {
				holder = (ListViewHolder) convertView.getTag();
			}
			Legend l = (Legend) getItem(position);
			holder.legendview.setImageBitmap(l.getBitmap());
			holder.textview.setText(l.getName());
			convertView.setTag(holder);
			return convertView;
		}
	}

	// ListView adapter的Holder
	class ListViewHolder {
		ImageView legendview;
		TextView textview;
	}

 

 

4、接下来我们需要拿到数据,代码如下:

 

// 取得图例,并将取得的图例放到List<Legend> 中返回
	private List<Legend> getLends() {
		List<Legend> ls = new ArrayList<Legend>();
		//获取所有的图层
		Layer[] layers = mMapView.getLayers();
		for (Layer l : layers) {
			//判断是否属于ArcGISFeatureLayer类
			if (l instanceof ArcGISFeatureLayer) {
				ArcGISFeatureLayer af = (ArcGISFeatureLayer) l;
				//获取FeatureType
				FeatureType[] types = af.getTypes();
				//获取Renderer渲染
				Renderer renders = af.getRenderer();
				//循环解析types主要用于获取name
				for (FeatureType type : types) {
					FeatureTemplate[] tems = type.getTemplates();
					for (FeatureTemplate tem : tems) {
						String name = tem.getName();
						Bitmap bitmap = createSymbolBitmap(af, tem);
						Legend le = new Legend(name, bitmap);
						ls.add(le);
					}
				}
				if (ls.size() == 0) {
					// 该FeatureLayer不包含FeatureType,此代码和上面的代码相似
					FeatureTemplate[] templates = af.getTemplates();
					for (FeatureTemplate template : templates) {
						Graphic gra = af.createFeatureWithTemplate(template,null);
						Symbol symbol = renders.getSymbol(gra);
						//上面两行可以忽略,只是可以获取到symbol和Graphic,如果有用途可以使用
						Bitmap bitm = createSymbolBitmap(af, template);
						Legend le = new Legend(template.getName(), bitm);
						ls.add(le);
					}
				}
			}

		}
		return ls;
	}

 

        上面的代码我们来解释一下。首先我们先初始化一个集合,这个都没问题。紧接着我们直接获取地图的所有图层。之后我们遍历这个地图的图层,我们需要判断这个图层里面哪些属于ArcGISFeatureLayer。也许我们道Renderer用来渲染symbol,而FeatureTemplate似乎用来存储一些信息,至少我们可以通过getname方法来获取他的信息。当然FeatureTemplate可以不用通过FeatureType来获取,这个下面的代码也能看到这种情况,所以下面的代码只是上面代码的一些改动。我们拿到type之后就可以获取FeatureTemplate,之后也就能获取到他的名字。


5、获得图片

private Bitmap createSymbolBitmap(ArcGISFeatureLayer featurelayer,
			FeatureTemplate featureTemplate) {
		// determine feature type
		FeatureTemplate.DRAWING_TOOL drawing_tool = featureTemplate
				.getDrawingTool();
		Geometry geometry = null;
		//用于判断点线面
		if (drawing_tool == DRAWING_TOOL.POLYGON) {
			Polygon polygon = new Polygon();
			polygon.startPath(0, 0);
			polygon.lineTo(0, 40);
			polygon.lineTo(40, 40);
			polygon.lineTo(40, 0);
			polygon.lineTo(0, 0);
			geometry = polygon;
		} else if (drawing_tool == DRAWING_TOOL.LINE) {
			Polyline polyline = new Polyline();
			polyline.startPath(1, 1);
			polyline.lineTo(39, 39);
			geometry = polyline;
		} else if (drawing_tool == DRAWING_TOOL.POINT)
			geometry = new Point(20, 20);

		Graphic g = featurelayer.createFeatureWithTemplate(featureTemplate,
				null);
		Renderer renderer = featurelayer.getRenderer();
		Symbol symbol = renderer.getSymbol(g);
		//画一个40*40的bitmap
		Bitmap bitmap = featurelayer.createSymbolImage(symbol, geometry, 40,
				40, Color.WHITE);
		return bitmap;
	}

        

        这些代码都应该都能看得懂,画点线面的。后面只是创建了一个bitmap并返回,应该不需要讲解。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值