要获得FeatureLayer的图例,可以从FeatureLayer的FeatureType中FeatureTemplate中获取,如果该FeatureLayer不包含FeatureType,可以直接从FeatureLayer的FeatureTemplate中获取。
以下代码展示了,长按屏幕,弹出对话框,对话框中显示MapView中FeatureLayer的图例:(绝大部分代码来自API中的GeometryEditor例子)
public class GetLegendActivity extends Activity {
MapView mMapView ;
private List<Legend> gends=new ArrayList<Legend>();
private ListView lv;
/** Calledwhen the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMapView = new MapView(this);
ArcGISTiledMapServiceLayer atm=new ArcGISTiledMapServiceLayer("http://services.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapSer ver");
ArcGISFeatureLayer afl=new ArcGISFeatureLayer("http://sampleserver5.arcgisonline.com/ArcGIS/rest/services/LocalGovernment/Recreation/FeatureServer/ 0", ArcGISFeatureLayer.MODE.ONDEMAND);
mMapView.addLayer(atm);
mMapView.addLayer(afl);
setContentView(mMapView);
mMapView.setOnStatusChangedListener(new OnStatusChangedListener() {
private static final long serialVersionUID = 1L;
public void onStatusChanged(Object arg0, STATUS arg1) {
if(arg0==mMapView && arg1==STATUS.INITIALIZED){//地图加载成功
Toast.makeText(GetLegendActivity.this, "地图加载成功", Toast.LENGTH_SHORT).show();
//添加长按地图事件
mMapView.setOnLongPressListener(new MyOnLongPressListener());
}
}
});
}
//取得图例,并将取得的图例放到List<Legend> 中返回
private List<Legend> getLends(){
List<Legend> ls=new ArrayList<Legend>();
Layer[]layers= mMapView.getLayers();
for(Layer l: layers){
if(l instanceofArcGISFeatureLayer){
ArcGISFeatureLayeraf=(ArcGISFeatureLayer) l;
FeatureType[]types= af.getTypes();
Renderer<Graphic> renders= af.getRenderer();
for(FeatureType type:types){
FeatureTemplate[]tems= type.getTemplates();
for(FeatureTemplatetem:tems){
Stringname=tem.getName();
Graphicg= af.createFeatureWithTemplate(tem, null);
Symbols=renders.getSymbol(g);
//由于该FeatureLayer是个点图层,所以可以直接new Point(20, 20),如下:
//Bitmap bitmap= af.createSymbolImage(s, new Point(20,20), 40, 40, Color.WHITE);
//如果不知道FeatureLayer是的类型,就要需要使用FeatureTemplate.DRAWING_TOOL,如下createSymbolBitmap方法:
Bitmap bitmap= createSymbolBitmap(af, tem);
Legendle=new Legend(name, bitmap, s);
ls.add(le);
}
}
if(ls.size()==0){//该FeatureLayer不包含FeatureType
FeatureTemplate[]templates= af.getTemplates();
for(FeatureTemplatetemplate : templates){
Graphicgra=af.createFeatureWithTemplate(template, null);
Symbolsymbol=renders.getSymbol(gra);
//Bitmap bitm=af.createSymbolImage(symbol,new Point(20,20), 40, 40, Color.WHITE);
Bitmapbitm=createSymbolBitmap(af, template);
Legendle=new Legend(template.getName(), bitm, symbol);
ls.add(le);
}
}
}
}
Log.i("GetLegendActivity", "共有图例"+ls.size());
return ls;
}
//长按地图事件
class MyOnLongPressListener implements OnLongPressListener{
private static final long serialVersionUID = 1L;
public void onLongPress(float arg0, float arg1) {
showDialog(0);
}
}
//如果不知道FeatureLayer的类型,可以通过 FeatureTemplate.DRAWING_TOOL来判断
private Bitmap createSymbolBitmap(ArcGISFeatureLayerfeaturelayer, 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<Graphic>renderer = featurelayer.getRenderer();
Symbol symbol =renderer.getSymbol(g);
Bitmap bitmap =featurelayer.createSymbolImage(symbol, geometry, 40, 40, Color.WHITE);
return bitmap;
}
@Override
protected Dialog onCreateDialog(int id) {
lv=new ListView(this);
gends=getLends();
Builder builder=new Builder(this);
builder.setView(lv);
lv.setAdapter(new MyAdapter());
return builder.create();
}
//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, ViewGroupparent) {
ListViewHolder holder;
if(convertView==null){
convertView=View.inflate(GetLegendActivity.this, R.layout.apdapter,null);
holder=new ListViewHolder();
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;
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
mMapView.pause();
}
@Override protected void onResume() {
super.onResume();
mMapView.unpause();
}
}
效果