Android GIS开发系列-- 入门季(5) FeatureLayer加载本地shp文件与要素查询
FeatureLayer是要素图层,也是Arcgis的主要图层。用这个图层可以加载本地的shp文件。下面我们看怎样加载shp文件到MapView中。查看ArcGis API可知FeatureLayer的构造方法要传一个FeatureTable,而FeatureTable可用子类ShapefileFeatureTable来实现。代码如下,其中shpPath为shp文件的本地路径。\ privatevoidinitLayer(){ try{ featureLayer=newFeatureLayer(newShapefileFeatureTable( shpPath)); featureLayer.setRenderer(newSimpleRenderer(newSimpleFillSymbol( Color.GREEN))); mapView.addLayer(featureLayer); }catch(Exceptione){ e.printStackTrace(); } } 效果图如下。 这样就可以很简单地加载shp文件了。下面我们来学习一下FeatureLayer的查询。 一、FeatureLayer点击查询主要用到的方法是featureLayer.getFeatureIDs(float x, float y, int tolerance),方法与上一讲GraphicsLayer的查询差不多。可以获取每个要素的属性属性值。 privatevoidhandleSingleTap(floatx,floaty){ long[]featureIds=featureLayer.getFeatureIDs(x,y,8); if(featureIds!=null&&featureIds.length>0){ for(longid:featureIds){ com.esri.core.map.Featurefeature=featureLayer.getFeature(id); Map<String,Object>attrs=feature.getAttributes(); Set<Entry<String,Object>>setEntry=attrs.entrySet(); for(Entry<String,Object>entryItem:setEntry){ Log.e(TAG, entryItem.getKey()+"===="+entryItem.getValue()); } } } } 二、利用FeatureTable查询,这是FeatureLayer特别的地方。比如在一个shp文件中,有多个要素,我们知道有每个要素中有name这个属性,怎样快速查询name为shanghai的要素呢?要用到FeatureTable的queryFeatures(QueryParametersquery,CallbackListener<FeatureResult> callback)方法或者是queryIds(QueryParametersquery,CallbackListener<long[]> callback)这个方法。 privatevoidqueryTable(){ FeatureTablefeatureTable=featureLayer.getFeatureTable(); QueryParametersparameters=newQueryParameters(); //查询条件,有点像数据库中的查询 parameters.setWhere("name='shanghai'");<spanstyle="white-space:pre"></span>Future<long[]>queryIds=featureTable.queryIds(parameters,newCallbackListener<long[]>(){ @Override publicvoidonError(Throwablearg0){ //TODOAuto-generatedmethodstub } @Override publicvoidonCallback(long[]arg0){ //TODOAuto-generatedmethodstub } }); try{ long[]Ids=queryIds.get(); if(Ids!=null&&Ids.length>0){ for(inti=0;i<Ids.length;i++){ Featurefeature=featureLayer.getFeature(Ids[i]); Log.i(TAG,feature.getAttributes().get("name")+""); } } }catch(InterruptedExceptione){ e.printStackTrace(); }catch(ExecutionExceptione){ e.printStackTrace(); } 这样就可以快速查询到某个具体的要素。 Code for all 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。 本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7751880.html ,如需转载请自行联系原作者