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并返回,应该不需要讲解。