ArcGIS Runtime SDK For Android 10.2.x版本空间查询和属性查询

xiaoxiao2021-02-28  111

引言

arcgis查询包括空间查询和属性查询,其中空间查询包括点击查询、多边形查询等。

一、空间查询

1、点击查询

通过重写MapView的OnSingleTapListener事件,对地图点击事件进行处理。主要有三种实现方式:(1)根据点击的x、y坐标,直接调用FeatureLayer的getFeatureIDs(float x, float y, int tolerance)方法查询得到要素的objectid;(2)编写QueryParameters查询参数,设置其查询geometry为当前点,调用FeatureLayer的selectFeatures方法或者FeatureTable的queryFeatures方法进行查询;(3)结合Query和QueryTask进行查询,但该方式只适合地图服务的查询。具体代码如下:

mMapView.setOnSingleTapListener(new OnSingleTapListener() { @Override public void onSingleTap(float x, float y) { if (!mMapView.isLoaded()) return; Point identifyPoint = mMapView.toMapPoint(x, y); try { highLightLayer.removeAll(); Layer[] mapLayers = mMapView.getLayers(); for (int i = mapLayers.length; i > 0; --i) { Layer item = mapLayers[i - 1]; if (item instanceof FeatureLayer) { FeatureLayer featureLayer = ((FeatureLayer) item); //方式一 /*long[] objectIDs = featureLayer.getFeatureIDs(x, y, 10); if (objectIDs != null && objectIDs.length > 0) { Feature feature = featureLayer.getFeature(objectIDs[0]);//取第一个选中的要素 renderFeature(mMapView, feature, highLightLayer); //initMapViewCallout(feature, identifyPoint); break; }*/ //方式二 QueryParameters queryParameters = new QueryParameters(); queryParameters.setGeometry(identifyPoint); queryParameters.setReturnGeometry(true); //queryParameters.setWhere("1=1"); //queryParameters.setSpatialRelationship(SpatialRelationship.INTERSECTS); //SpatialReference sr = SpatialReference.create(102100); //queryParameters.setInSpatialReference(featureLayer.getSpatialReference()); //queryParameters.setOutSpatialReference(sr); //queryParameters.setOutFields(new String[]{"*"}); featureLayer.selectFeatures(queryParameters, FeatureLayer.SelectionMode.NEW, new CallbackListener<FeatureResult>() { @Override public void onCallback(FeatureResult result) { if (result != null) { Iterator<Object> it = result.iterator(); while (it.hasNext()) { Feature feature = (Feature) it.next(); try { //featureLocated(feature); renderFeature(mMapView, feature, highLightLayer); break; } catch (Exception e) { e.printStackTrace(); } } } } @Override public void onError(Throwable throwable) { } }); /*featureLayer.getFeatureTable().queryFeatures(queryParameters, new CallbackListener<FeatureResult>() { @Override public void onError(Throwable e) { Log.e("Test", "Unable to perform query", e); } @Override public void onCallback(FeatureResult result) { if (result != null) { Iterator<Object> it = result.iterator(); while (it.hasNext()) { Feature feature = (Feature) it.next(); try { //featureLocated(feature); renderFeature(mMapView, feature, highLightLayer); break; } catch (Exception e) {ArcGIS Android API 应用开发之图形绘制与长度面积量算 e.printStackTrace(); } } } } });*/ } } } catch (Exception ex) { Log.i("test", ex.getMessage()); } } });

2、多边形查询

首先需要绘制一个多边形,绘制多边形的代码可以参考ArcGIS Android API应用开发之图形绘制与长度面积量算。通过绘制得到geometry之后,即可用点击查询中的方法2进行查询。

二、属性查询

类似点击查询的方式二,只不过需要手动设置where条件,例如:name = '项目1'等。一般查询到要素之后,需要将该要素定位到地图视图的中部,此时可以调用featurelocated方法,见三。

三、上文用到的函数

/** * 在这里我们进行要素的高亮显示,也就是要素渲染工作 * * * @param feature 要渲染的要素 * @return 返回要素的中心点位置 */ private Point renderFeature(MapView mMapView, Feature feature, GraphicsLayer highLightLayer) { highLightLayer.removeAll(); Geometry geometry = feature.getGeometry(); String typeName = geometry.getType().name(); Envelope env = new Envelope(); geometry.queryEnvelope(env); Graphic highlightGraphic = null; int color = Color.rgb(19, 255, 234); if (typeName.equalsIgnoreCase("point")) { SimpleMarkerSymbol sms = new SimpleMarkerSymbol(color, 20, SimpleMarkerSymbol.STYLE.CIRCLE); highlightGraphic = new Graphic(geometry, sms); } else if (typeName.equalsIgnoreCase("polyline")) { SimpleLineSymbol sls = new SimpleLineSymbol(color, 5); highlightGraphic = new Graphic(geometry, sls); } else if (typeName.equalsIgnoreCase("polygon")) { SimpleFillSymbol sfs = new SimpleFillSymbol(color); sfs.setAlpha(0); sfs.setOutline(new SimpleLineSymbol(color, 5)); highlightGraphic = new Graphic(geometry, sfs); } highLightLayer.setMaxScale(mMapView.getMaxScale()); highLightLayer.setMinScale(mMapView.getMinScale()); highLightLayer.addGraphic(highlightGraphic); //mMapView.centerAt(env.getCenter(), true); return env.getCenter(); } /** * 根据项目对象定位项目要素 */ private void featureLocated(Feature feature) {     //点击列表中项目行,定位到地图中的项目数据,并高亮显示     if (feature != null) {         highLightLayer.removeAll();         Point mapPoint = renderFeature(mMapView, feature, highLightLayer);         Point pt = mMapView.toScreenPoint(mapPoint);//渲染图层,并取得渲染点屏幕位置         pt.setY(pt.getY() - 100);         mMapView.centerAt(mMapView.toMapPoint(pt), true);         initMapViewCallout(feature, mapPoint);     } }

参考资料:http://blog.csdn.net/vaecer/article/details/8814071。

转载请注明原文地址: https://www.6miu.com/read-31077.html

最新回复(0)