ArcGIS for Android 离线数据图例加载
来源:互联网 发布:开票软件 含税价标志 编辑:程序博客网 时间:2024/06/05 16:02
图例是地图展示里常用的辅助展示工具。曾经我采用过将图例截成图片转为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
阅读全文
0 0
- ArcGIS for Android 离线数据图例加载
- arcgis for android 图例
- ArcGis for android 加载tpk离线文件
- Arcgis For Android加载离线地图
- ArcGIS for Android 离线数据编辑原理
- Arcgis for Android离线数据下载
- ArcGIS for Android 获取FeatureLayer的图例
- ArcGIS for Android离线数据编辑实现原理
- 【技术直通车】ArcGIS for Android离线数据编辑实现原理
- ArcGIS for Android离线数据编辑实现原理
- ArcGIS for Android 离线数据空间查询--I查询
- ArcGIS for Android 离线数据空间分析--叠加分析
- Arcgis for android 离线查询
- ArcGIS for iOS如何加载离线地图包
- [ArcGIS for Android] arcgis runtime for android 中加载矢量数据的实现
- arcgis for android 离线地图实现
- ArcGIS for android 离线地图 案例
- ArcGIS for android 离线地图 案例
- .NET 中的委托
- react native学习笔记0——windows环境搭建
- spring与cxf整合开发webservice服务接口
- struts2中jsp页面传值到action方式总结
- 技术文章 | 阿里云前端周刊
- ArcGIS for Android 离线数据图例加载
- Java 环境变量配置
- 自己配置yum源
- 关于主键设置的increament属性的设置
- 剑指Offer--数组中的逆序对--归并排序!
- PhpStorm2017版激活方法、汉化方法以及界面配置
- KNN算法详解
- vue.js实战笔记:父子组件之间的那些事儿
- 都在谈人工智能,但你知道它的潜力、实践意义、障碍是什么吗?