有这样一个需求,要求查询指定 geometry 附近的其他要素。
先看代码:
public class PrjNearAsyncQueryTask extends AsyncTask<String, Void, FeatureResult> {
// 指定的图形
Geometry geometry;
public PrjNearAsyncQueryTask(Geometry geometry) {
this.geometry = geometry;
}
@Override
protected void onPreExecute() {
// 查询前执行
}
@SuppressWarnings("null")
@Override
protected FeatureResult doInBackground(String... params) {
FeatureResult fs = null;
if(params == null && params.length <= 1){
return null;
}
try {
// 由于是查询所有的图形,所有这里没有设置查询条件,有需要可以自己设置 where条件语句
QueryParameters queryParameters = new QueryParameters();
queryParameters.setReturnGeometry(true);
queryParameters.setOutFields(new String[] { "*" });
// 关键点
// 1、新建一个 Envelope
Envelope envelope = new Envelope();
// 2、将指定的图形的envelope复制给新建的Envelope
geometry.queryEnvelope(envelope);
// 3、获取新的范围 在原 envelope 的基础上,params[1] -- 参数2 就是指定的范围
double newMaxX = envelope.getXMax()+Double.parseDouble(params[1]);
double newMaxY = envelope.getYMax()+Double.parseDouble(params[1]);
double newMinX = envelope.getXMin()-Double.parseDouble(params[1]);
double newMinY = envelope.getYMin()-Double.parseDouble(params[1]);
// 4、给 envelope 指定新的范围
envelope.setCoords(newMinX,newMinY,newMaxX,newMaxY);
// 5、将新的查询范围设置到查询参数中
queryParameters.setGeometry(envelope);
// 获取坐标系,根据自己实际情况 获取自己使用的坐标系
SpatialReference sr;
if(Constants.Map_Gis_Type == 0){
sr = SpatialReference.create(Constants.Map_Gis_Type_Str);
}else{
sr = SpatialReference.create(Constants.Map_Gis_Type);
}
// 给查询参数 设置查询坐标系 和 查询图层(params[0] -- 参数1 就是图层url)
queryParameters.setOutSpatialReference(sr);
QueryTask queryTask = new QueryTask(params[0]);
// 开始查询 得到查询结果后 返回查询结果 fs
fs = queryTask.execute(queryParameters);
} catch (Exception e) {
e.printStackTrace();
}
return fs;
}
@Override
protected void onPostExecute(FeatureResult result) {
// 查询完成后执行,可以通过 handler 或 EventBus 等将结果 传递到需要的地方
}
}
详细的注释都写到上面代码中了。仅供参考,不同的地方根据自己实际需求修改。
在Activity中使用的时候:
PrjNearAsyncQueryTask task = new PrjNearAsyncQueryTask(prjBeanGeometry);
// 参数params 第一个是待查询的图层 ; 第二个是 查询附近距离(偏移距离)
String[] params = {layerUrl, prjinfoSearchKey};
task.execute(params);