引言
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。