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

      空间查询是 地理信息中的一个概念,指的是通过空间数据进行空间数据库的查询操作。 ArcGIS 10.2.2 的版本发布了 .geodatabase 数据,其本质上就是一个轻量级的空间数据库,并通过发布了 ArcGIS Android 10.2.9 API ,使得 Android 设备可以直接该 API 实现空间查询的功能。

  首先我们先看下官方文档对于空间查询提供的工具:


  

  可以看到这个ArcGIS 10.2版本以后新增的一个包,包含了四个类,分别应用于:

  • OutStatistics:用来定义一个或多个领域的统计数据的计算;
  • QueryParameters:类在支持查询的图层或表上保存查询参数,在本地或访问服务上执行;
  • QueryTask:用于在ArcGIS Server服务的图层或表资源上执行“查询”和“查询相关记录”操作;
  • RelatedQueryParameters:这个类是用来建立一个在对应图层/表查询相关记录的操作的参数。
其实这个和之前的query 包很相似,不过那个 query 包换到 ags 目录下了。然后这四个类里,和我们离线空间查询相关的主要就是Q ueryParameters 类了。我们可以看看对于这个类的官方解释为:


  简单翻译下,就是该类可以用来设置查询参数用来进行离线或者在线的空间查询,使用时候,需要先 对QueryParameters实例填充所需的查询参数,然后把这些参数传递给一个QueryTask实例或者一个对GeodatabaseFeatureTable类查询方法。然后就是可以定义的参数包含:
  • WHERE子句
  • 是否在结果集里必须包含与每个结果相关联的空间数据
  • 要返回结果集中包含的字段列表
  • 要查询的这个图层/表的对象的ID
  • 响应是否应该只包含对象ID数组或其他特性集。
  • 搜索文本
  • 作为空间查询条件的空间数据
  • 和输入的空间数据存在某种空间关系
  • 输入空间数据的空间参考系
  • 返回空间数据的空间参考系
  • 是否在结果集必须包含与每个结果相关的空间数据
  其中,第二条和第十条挺像的,具体的差别我也不太清楚- -!
  好了,对这个类有了了解后 我们先 下如何实现 I查询 I查询其实就是通过选取地图上某个点,经过空间分析后获取到该点对应图斑的信息。 简单来说,就是进行一个数据库查询的操作,只是查询的条件是一个点。    我们先创建个地图,并加载 geodatabase数据:
mMapView.setMapBackground(0xFAFAFA, 0xffffff, 0.0f, 0.0f);//地图背景
String path= StorageUtil.getSDCardRootPath(getApplicationContext())+"/ydyzt/data/TDXZ_JBNT.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 = new FeatureLayer(gdbFeatureTable);
            mMapView.addLayer(featureLayer);
        }}
}

   此时就可以在我们的设备的屏幕上看到对应图层了。 然后我们要 I查询,首先需要进行取点操作,然后将这个点转换为地图上的点:
mMapView.setOnLongPressListener(new OnLongPressListener() {@Override
        public boolean onLongPress(float v, float v1) {Point point = mMapView.toMapPoint(v, v1);                return false;
        }});

}

   接下里就是通过 QueryParameters 类输入查询参数。 I 查询的条件很简单,只需要通过我们取的点返回该点所属图斑的信息即可,所以代码为:
QueryParameters query = new QueryParameters();//定义并初始化查询
query.setOutFields(new String[]{"*"});// 设置返回字段的数组
query.setGeometry(point);// 设置空间几何对象
if (featureLayer == null) {return false;
}
FeatureTable mTable = featureLayer.getFeatureTable();//得到查询属性表
mTable.queryFeatures(query, new CallbackListener() {@Override
    public void onCallback(FeatureResult featureResul) {for (Object element : featureResul) {if (element instanceof Feature) {Feature mFeatureGrafic = (Feature) element;
                Map, Object> mQuerryString = mFeatureGrafic.getAttributes();
                for(String key : mQuerryString.keySet()){Log.i("==============="+key,String.valueOf(mQuerryString.get(key)));
                }}}}@Override
    public void onError(Throwable throwable) {}

  运行下,我们看看结果:
     很明显,这是个地类图斑的数据。   至此,I查询工作完成,剩下只需要将结果展示出来即可。   附上完整代码:
public class GisActivity extends AppCompatActivity {@BindView(R.id.mapview)MapView mMapView;

    FeatureLayer featureLayer;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_arcgis );
        ButterKnife.bind(this);
        initGeodatabase();

        mMapView.setOnLongPressListener(new OnLongPressListener() {@Override
            public boolean onLongPress(float v, float v1) {try {Point point = mMapView.toMapPoint(v, v1);
                    QueryParameters query = new QueryParameters();//定义并初始化查询
                    query.setOutFields(new String[]{"*"});// 设置返回字段的数组
                    query.setGeometry(point);// 设置空间几何对象
                    if (featureLayer == null) {return false;
                    }FeatureTable mTable = featureLayer.getFeatureTable();//得到查询属性表
                    mTable.queryFeatures(query, new CallbackListener() {@Override
                        public void onCallback(FeatureResult featureResul) {for (Object element : featureResul) {if (element instanceof Feature) {Feature mFeatureGrafic = (Feature) element;
                                    Map, Object> mQuerryString = mFeatureGrafic.getAttributes();
                                    for(String key : mQuerryString.keySet()){Log.i("==============="+key,String.valueOf(mQuerryString.get(key)));
                                    }}}}@Override
                        public void onError(Throwable throwable) {}});
                }catch (Exception e){e.printStackTrace();
                }return false;
            }});

    }private void initGeodatabase(){mMapView.setMapBackground(0xFAFAFA, 0xffffff, 0.0f, 0.0f);//地图背景
        String path= StorageUtil.getSDCardRootPath(getApplicationContext())+"/ydyzt/data/TDXZ_JBNT.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 = new FeatureLayer(gdbFeatureTable);
                    mMapView.addLayer(featureLayer);
                }}}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部