1. 程式人生 > >ArcGIS for Android 離線資料圖例載入

ArcGIS for Android 離線資料圖例載入

  圖例是地圖展示裡常用的輔助展示工具。曾經我採用過將圖例截成圖片轉為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

itmap,而圖例名稱則取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