arcgis for android 图例

来源:互联网 发布:java 服务器 框架 编辑:程序博客网 时间:2024/06/03 03:02
</pre><p><span style="font-size:24px; color:#006600; background-color:rgb(255,255,255)">转自:http://blog.csdn.net/yifei1989/article/details/9383563</span></p><p><span style="font-size:24px; color:#006600; background-color:rgb(255,255,255)">1、加载地图</span></p><p></p><pre name="code" class="java">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的Holderclass 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;//获取FeatureTypeFeatureType[] types = af.getTypes();//获取Renderer渲染Renderer renders = af.getRenderer();//循环解析types主要用于获取namefor (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 typeFeatureTemplate.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的bitmapBitmap bitmap = featurelayer.createSymbolImage(symbol, geometry, 40,40, Color.WHITE);return bitmap;}
        

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

0 0