ArcGIS for Android 離線資料圖例載入
阿新 • • 發佈:2019-02-11
圖例是地圖展示裡常用的輔助展示工具。曾經我採用過將圖例截成圖片轉為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);//地圖背景
然後根據我們載入的圖層獲取對應的符號,然後將符號按照點,線,面型別轉換成對應的B
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