ArcGIS for Android 离线数据图例加载

原创 2017年08月09日 19:35:58

  图例是地图展示里常用的辅助展示工具。曾经我采用过将图例截成图片转为2进制保存到数据库里,然后在加载图层时候调取对应图片作为图例展示。但是后来知道geodatabase数据其实就是个空间数据库,如果是通过geodatabase数据加载图层,图斑都是geodatabase数据里的空间数据Geometry根据样式Symbol进行动态渲染,所以这个Symbol如果能提取出来,也就是我们要的图例了。根据这个思路,我找了找,果然找到了对应的方法,于是记录下来。

  首先我们还是先初始化地图,并且加载图层:

mMapView=(MapView)findViewById(R.id.mapview);
rvDownload=(RecyclerView)findViewById(R.id.rv_tuli);
String path=StorageUtil.getSDCardRootPath(getApplicationContext())+"/ydyzt/data/GD_TDYT.geodatabase";
Geodatabase localGdb=null;
try {
    localGdb = new Geodatabase(path);
}catch (Exception e){
    e.printStackTrace();
}
if (localGdb != null) {
    for (GeodatabaseFeatureTable gdbFeatureTable : localGdb.getGeodatabaseTables()) {
        if (gdbFeatureTable.hasGeometry()){
            FeatureLayer layer = new FeatureLayer(gdbFeatureTable);
            mMapView.addLayer(layer);
        }
    }
}
mMapView.setMapBackground(0xFAFAFA, 0xffffff, 0.0f, 0.0f);//地图背景

  然后根据我们加载的图层获取对应的符号,然后将符号按照点,线,面类型转换成对应的Bitmap,而图例名称则取GeodatabaseFeatureTable里对应FeatureTemplate的名称,就构成了我们的图例:

Layer layer=mMapView.getLayer(0);
tuliBeanList=new ArrayList<>();
if(layer instanceof FeatureLayer){
    String typeFileid= ((GeodatabaseFeatureTable)(((FeatureLayer)layer).getFeatureTable())).getTypeIdField();
    if(typeFileid.equalsIgnoreCase("")){//TypeIdField没有值
        //获取图层中的FeatureTemplate
        List<FeatureTemplate> templates= ((GeodatabaseFeatureTable)(((FeatureLayer)layer).getFeatureTable())).getFeatureTemplates();
        //从templates构造出图例
        for(FeatureTemplate template :templates){
            try {
                //根据FeatureTemplate生成GdbFeature
                GeodatabaseFeature feature= ((GeodatabaseFeatureTable)(((FeatureLayer)layer).getFeatureTable())).createFeatureWithTemplate(template, null);
                Renderer renderer = ((FeatureLayer) layer).getRenderer();
                //获取符号
                Symbol symbol =  renderer.getSymbol(feature);
                //得到代表图例的图片
                Bitmap bitmap=createBitmapFromSymbol(symbol,layer);
                String name=template.getName();
                TuliBean bean=new TuliBean(name,bitmap);
                tuliBeanList.add(bean);
                //设置图例的布局和点击事件
                // populateTemplateView(layerTemplate,bitmap,template,symbol,(FeatureLayer)layer);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        initTuli();
    }else{//TypeIdField有值
        List<FeatureType> featureTypes= ((GeodatabaseFeatureTable)(((FeatureLayer)layer).getFeatureTable())).getFeatureTypes();
        for(FeatureType featureType :featureTypes){
            FeatureTemplate[] templates= featureType.getTemplates();
            for(FeatureTemplate template :templates){
                try {
                    //根据FeatureTemplate生成GeodatabaseFeature
                    GeodatabaseFeature feature= ((GeodatabaseFeatureTable)(((FeatureLayer)layer).getFeatureTable())).createFeatureWithTemplate(template, null);
                    Renderer renderer = ((FeatureLayer) layer).getRenderer();
                    //获取符号
                    Symbol symbol =  renderer.getSymbol(feature);
                    //得到代表图例的图片
                    Bitmap bitmap=createBitmapFromSymbol(symbol,layer);
                    String name=template.getName();
                    TuliBean bean=new TuliBean(name,bitmap);
                    tuliBeanList.add(bean);
                    //设置图例的布局和点击事件
                    //populateTemplateView(layerTemplate,bitmap,template,symbol,(FeatureLayer)layer);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            initTuli();
        }
    }
}

  符号转换Bitmap的方法为:

//根据Symbol和Layer来创建相对应的图例
private Bitmap createBitmapFromSymbol(Symbol symbol,Layer layer) {
    Bitmap bitmap=null;
    Geometry.Type type= ((FeatureLayer)layer).getGeometryType();
    //跟不同的Type来创建不同的图例
    if(type.equals(Geometry.Type.POINT)){//点图层
        Point point=new Point(20, 20);
        bitmap= SymbolHelper.getLegendImage(symbol, point, 50, 50, Color.WHITE);
    }else if(type.equals(Geometry.Type.POLYLINE)){//线图层
        Polyline polyLine=new Polyline();
        polyLine.startPath(0,0);
        polyLine.lineTo(40,40);
        bitmap=SymbolHelper.getLegendImage(symbol, polyLine, 50, 50, Color.WHITE);
    }else if(type.equals(Geometry.Type.POLYGON)){//面图层
        Polygon polygon=new Polygon();
        polygon.startPath(0, 0);
        polygon.lineTo(250, 0);
        polygon.lineTo(250, 100);
        polygon.lineTo(0, 100);
        polygon.lineTo(0, 0);
        bitmap= SymbolHelper.getLegendImage(symbol, polygon, 250, 100, Color.WHITE);
    }
    return bitmap;
}

  最后将获取到的图例展示出来:

baseRecyclerAdapterOfflineData=new BaseRecyclerAdapter<TuliBean>(this,tuliBeanList) {
    @Override
    public int getItemLayoutId(int viewType) {
        return R.layout.item_tuli;
    }

    @Override
    public void bindData(RecyclerViewHolder holder, int position, TuliBean item) {

        TextView tvName=holder.getTextView(R.id.tv_tuliname);
        ImageView ivTuli=holder.getImageView(R.id.iv_tuli);
        tvName.setText(item.getTuliName());
        ivTuli.setImageBitmap(item.getBitmap());
    }
};
rvDownload.setAdapter(baseRecyclerAdapterOfflineData);
rvDownload.setLayoutManager(new LinearLayoutManager(this));
rvDownload.setItemAnimator(new DefaultItemAnimator());

  看看最后的效果:



demo下载地址:http://download.csdn.net/detail/bit_kaki/9926236

参考文章:http://blog.csdn.net/yifei1989/article/details/17339095

版权声明:本文为博主原创文章,未经博主允许不得转载。

Arcgis For Android加载离线地图

包括两种离线地图1.arcgis10.1制作的tpk文件,2.离线地图数据Layers public class MapActivity extends Activity { MapVie...
  • u011116642
  • u011116642
  • 2014年02月14日 10:31
  • 1526

ArcGIS for Android示例解析之离线地图-----LocalTiledLayer

LocalTiledLayer 看到这个标题是否是很激动,如题,该示例就是添加一个离线地图,这应该是很多开发人员期盼已久的功能了吧,正式版一处这个应该是一个很大的亮点,原来操作离线地图如此简单,下面...
  • wozaifeiyang0
  • wozaifeiyang0
  • 2012年03月07日 09:15
  • 9102

ArcGIS for Android 离线数据空间查询--I查询

空间查询
  • bit_kaki
  • bit_kaki
  • 2017年08月01日 18:03
  • 1868

【技术直通车】ArcGIS for Android离线数据编辑实现原理

ArcGIS for Android中现已经提供了离线缓存图片的加载功能,极大的提高了我们访问地图的效率,对于离线的数据编辑暂时还不支持,而现在对于离线数据编辑操作的需求越来越多,那我们如何才能实现离...
  • arcgis_all
  • arcgis_all
  • 2012年12月03日 09:32
  • 3916

arcgis for android 图例

我们经常在公园或者路边都能看到地图,往往地图的左上角都会有图例,图例可以标识某些建筑是干嘛用的,某些建筑是什么,也可以说明方向等等,图例在地图中起到了很大的作用,,今天我们来说一下在线地图和离线地图图...
  • xiaomumu_mu
  • xiaomumu_mu
  • 2016年11月04日 15:51
  • 688

ArcGIS for Android 获取FeatureLayer的图例

要获得FeatureLayer的图例,可以从FeatureLayer的FeatureType中FeatureTemplate中获取,如果该FeatureLayer不包含FeatureType,可以直接...
  • yifei1989
  • yifei1989
  • 2013年07月19日 17:01
  • 3387

安卓智能地图开发与实施六:离线基础底图 - ArcGIS Runtime SDK for Android(Version 100.0.0)

离线基础底图(Offline Tiled Layers)离线基础底图最传统的方式是直接拷贝ArcGIS Server服务的切片成果,存在的问题是无论使用松散型还是紧凑型都包含太多碎小文件,部署不便。T...
  • allenlu2008
  • allenlu2008
  • 2017年05月04日 12:14
  • 2913

Android Studio2.0中使用离线ArcGIS Runtime Android SDK 100.1.0开发原生地图应用.docx

前言     最近因为工作关系,需要使用ArcGIS Runtime SDK for Android搭建一个简单的入门Demo,也就是传说中的Hello GISer。翻了一遍官方文档,ArcGIS ...
  • peckerzeng
  • peckerzeng
  • 2017年09月28日 18:04
  • 434

ArcGIS API离线部署

arcgis for js开发依赖arcgis地图服务的,而arcgis地图服务的发布是通过arcgisserver来发布的,所以,首先要学会安装arcgisserver,还有就是学会如何发布地图服务...
  • Godzillar
  • Godzillar
  • 2017年04月07日 11:36
  • 585

ArcGIS 10.2移动产品的离线功能

ArcGIS移动产品开发包Android和iOS 10.2版于前段时间正式发布,除了众所周知的强劲的离线支持,新版本中还有哪些激动人心的增强呢?请看“新特性系列博客”为您揭秘。          A...
  • luckypeng
  • luckypeng
  • 2015年04月21日 10:28
  • 1751
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ArcGIS for Android 离线数据图例加载
举报原因:
原因补充:

(最多只允许输入30个字)