arcgis for android 学习 - (6) 属性查询。检索图层上某个要素,并高亮显示它。

"NAME like '%" + keyQuery + "%'" 既然是 “地图”,“gis”,那么 查询(QUERY)是必须的了。我们看看如何查询。

 

动机:

我想要查找地图上的某个点(要素,或者说某个位置 ),然后将检索的结果 显示出来(高亮)显示。

 

 执行查询:

// 查询的关键字
String keyQuery = txtQueryString.getText().toString();
Query query = new Query();
// 类似sql语句的查询 where语句
query.setWhere("NAME like '%" + keyQuery + "%'");
query.setReturnGeometry(true);
// 指定查询的目标图层
String queryUrl = URL_LAYER + "/0";
// 构建查询任务对象QueryTask

QueryTask queryTask = new QueryTask(queryUrl); 

 

 处理查询的结果集:

 FeatureSet fs = null;//结果集

try {
fs = queryTask.execute(query);//执行查询
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
GraphicsLayer graphicsLayer = GetGraphicLayer();
String message = "No result comes back";
if (fs != null && graphicsLayer.isInitialized() && graphicsLayer.isVisible()) {
//获得结果集内的 graphics 对象
Graphic[] grs = fs.getGraphics();
if (grs.length > 0) {
//构建  简单填充符号,该对象指定了一种“呈现方式”
SimpleFillSymbol symbol = new SimpleFillSymbol(
Color.RED);
//设定呈现方式
graphicsLayer.setRenderer(new SimpleRenderer(symbol));
//添加 graphic带图层,这时,会自动用刚刚指定的“呈现方式”来呈现
graphicsLayer.removeAll();//移除以前的
graphicsLayer.addGraphics(grs);
 
message = (grs.length == 1 ? "1 result has " : Integer
.toString(grs.length) + " results have ")
+ "come back";
}
 
}

 

你是否有了疑问:

为什么 我要写这么一句 

 

// 指定查询的目标图层
String queryUrl = URL_LAYER + "/0"; 

 

因为:你的图层服务URL地址可能包含有多个图层,而rest格式的url用  “/0 ” 这样的“方式”表示第0个图层。那么我们怎么知道要写0,或者1,2,3等什么呢?这要看你的地图制作者为你提供的内容了。我们再浏览器里打开我们的服务地址可以看到下面这样:

 

 

 

注意到上面的 Layers:  省(0)了么? 这里的 0 ,就是第0个图层。

 

为什么查询的约束条件要这么写?

// 类似sql语句的查询 where语句
query.setWhere("NAME like '%" + keyQuery + "%'");

 

 这其实是这么的一个查询方式 ,比如: NAME like '%北京%' 。 是不是很像sql语句里的like语句啊。它的意思是查询 “字段属性名称是NAME”的”值“,这里”是NAME里包含了 北京 这两个字的 对象“,这里的对象,就是你查询的结果,也就是返回的Graphic,这个对象,和字段(属性)是地图制作者向你提供的。我在浏览器打开我的地图服务,可以看到下马这样:

 

注意 Filelds:  下面的描述了么? "NAME (Type:esriFieldTypeString,Alias:NAME). 它描述的内容是:”字符串格式,字段名称是NAME“ 

 

----- -------------------

 

 代码如下

布局:

 <?xml version="1.0" encoding="utf-8"?>

< LinearLayout  xmlns:android ="http://schemas.android.com/apk/res/android"
    android:orientation
="vertical"
    android:layout_width
="fill_parent"
    android:layout_height
="fill_parent"
    
>

     < TextView
        
android:layout_width ="fill_parent"
        android:layout_height
="wrap_content"
        android:text
="请输入查询关键字:"   />

     < EditText
        
android:id ="@+id/txtQueryString"
        android:layout_width
="match_parent"
        android:layout_height
="wrap_content"
        android:ems
="10"  android:text ="北京"   >
 
         < requestFocus  />
     </ EditText >
< Button
    
android:id ="@+id/queryButton"   
    android:layout_width
="fill_parent"
    android:layout_height
="wrap_content"
    android:layout_gravity
="center"
    android:text
="执行查询"
    
/>   
    
< com.esri.android.map.MapView
    
xmlns:android ="http://schemas.android.com/apk/res/android"
    android:id
="@+id/map"  android:layout_width ="fill_parent"
    android:layout_height
="fill_parent"  url ="http://www.arcgis.com/home/webmap/viewer.html?webmap=58e58acce685442aa4c73f91fbb3a387"
    
> 
</ com.esri.android.map.MapView >
</ LinearLayout >

代码:

 package demo;


import java.util.Random;

import com.esri.android.map.GraphicsLayer;
import com.esri.android.map.MapView;
import com.esri.core.geometry.Envelope;
import com.esri.core.map.FeatureSet;
import com.esri.core.map.Graphic;
import com.esri.core.renderer.SimpleRenderer;
import com.esri.core.symbol.SimpleFillSymbol;
import com.esri.core.symbol.SimpleMarkerSymbol;
import com.esri.core.symbol.SimpleMarkerSymbol.STYLE;
import com.esri.core.tasks.ags.query.Query;
import com.esri.core.tasks.ags.query.QueryTask;

import demo.attrbuteQuery.R;
import android.app.Activity;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public  class attrbuteQueryActivity extends Activity {

    Button mQueryButton;
    MapView mMapView;
    final String URL_LAYER =  " http://192.168.3.130/ArcGIS/rest/services/China/MapServer ";
    GraphicsLayer mGraphicsLayer;
    EditText txtQueryString;

    @Override
     public  void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        txtQueryString = (EditText) findViewById(R.id.txtQueryString);

        mQueryButton = (Button) findViewById(R.id.queryButton);
        mQueryButton.setOnClickListener( new OnClickListener() {

            @Override
             public  void onClick(View arg0) {
                 //  查询的关键字
                String keyQuery = txtQueryString.getText().toString();
                Query query =  new Query();
                 //  类似sql语句的查询 where语句
                query.setWhere( " NAME like '% " + keyQuery +  " %' ");
                query.setReturnGeometry( true);
                 //  指定查询的目标图层
                String queryUrl = URL_LAYER +  " /0 ";
                 //  构建查询任务对象QueryTask
                QueryTask queryTask =  new QueryTask(queryUrl);

                FeatureSet fs =  null; // 结果集
                 try {
                    fs = queryTask.execute(query); // 执行查询
                }  catch (Exception e) {
                     //  TODO Auto-generated catch block
                    e.printStackTrace();
                }
                GraphicsLayer graphicsLayer = GetGraphicLayer();
                String message =  " No result comes back ";
                 if (fs !=  null && graphicsLayer.isInitialized() && graphicsLayer.isVisible()) {
                     // 获得结果集内的 graphics 对象
                    Graphic[] grs = fs.getGraphics();
                     if (grs.length >  0) {
                         // 构建  简单填充符号,该对象指定了一种“呈现方式”
                        SimpleFillSymbol symbol =  new SimpleFillSymbol(
                                Color.RED);
                         // 设定呈现方式
                        graphicsLayer.setRenderer( new SimpleRenderer(symbol));
                         // 添加 graphic带图层,这时,会自动用刚刚指定的“呈现方式”来呈现
                        graphicsLayer.removeAll(); // 移除以前的
                        graphicsLayer.addGraphics(grs);

                        message = (grs.length ==  1 ?  " 1 result has  " : Integer
                                .toString(grs.length) +  "  results have  ")
                                +  " come back ";
                    }

                }
                Toast toast = Toast.makeText(attrbuteQueryActivity. this,
                        message, Toast.LENGTH_LONG);
                toast.show();
            }
        });

        mMapView = (MapView) findViewById(R.id.map);
         //  Add layer to MapView
        mMapView.addLayer( new com.esri.android.map.ags.ArcGISDynamicMapServiceLayer(
                URL_LAYER));

        Envelope initextext =  new Envelope( 12891659.09751954817561.93785559,
                 12996377.826274884902.95977474);
        mMapView.setExtent(initextext);
    }

     /*
     * 获得 GetGraphicLayer
     
*/
     private GraphicsLayer GetGraphicLayer() {
         if (mGraphicsLayer ==  null) {
            mGraphicsLayer =  new GraphicsLayer();
            mMapView.addLayer(mGraphicsLayer);
        }
         return mGraphicsLayer;
    }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现多边形选择FeatureLayer中的要素,可以通过使用ArcGIS API for JavaScript中的GeometryEngine来实现。具体步骤如下: 1. 定义多边形 首先,定义一个多边形,可以使用ArcGIS API for JavaScript中的Polygon来创建。例如: ```javascript var polygon = new Polygon({ "rings": [[[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], "spatialReference": { "wkid": 4326 } }); ``` 这个多边形由五个点组成,可以通过rings属性设置。这里的空间参考系为4326。 2. 获取FeatureLayer 使用ArcGIS API for JavaScript中的FeatureLayer获取要素图层。例如: ```javascript var featureLayer = new FeatureLayer({ url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3" }); ``` 这里获取的是Census地图服务中的第3个图层。 3. 查询要素 使用FeatureLayer的queryFeatures方法查询要素。例如: ```javascript var query = featureLayer.createQuery(); query.geometry = polygon; query.spatialRelationship = "intersects"; featureLayer.queryFeatures(query).then(function(result) { // 处理查询结果 }); ``` 这里的查询条件为多边形和图层的交集。 4. 高亮显示选中的要素 查询结果中包含了符合条件的要素,可以遍历这些要素,对它们进行高亮显示。例如: ```javascript var features = result.features; for (var i = 0; i < features.length; i++) { var feature = features[i]; feature.symbol = new SimpleFillSymbol({ color: [255, 0, 0, 0.5], style: "solid", outline: { color: [255, 0, 0], width: 1 } }); featureLayer.graphics.add(new Graphic(feature.geometry, feature.symbol)); } ``` 这里使用SimpleFillSymbol创建一个红色的填充符号,将选中的要素的符号设置为该填充符号,并将它们添加到图层上。 完整代码如下: ```javascript require([ "esri/Map", "esri/views/MapView", "esri/layers/FeatureLayer", "esri/geometry/Polygon", "esri/geometry/geometryEngine", "esri/symbols/SimpleFillSymbol", "esri/Graphic" ], function(Map, MapView, FeatureLayer, Polygon, geometryEngine, SimpleFillSymbol, Graphic) { var polygon = new Polygon({ "rings": [[[0, 0], [0, 10], [10, 10], [10, 0], [0, 0]]], "spatialReference": { "wkid": 4326 } }); var featureLayer = new FeatureLayer({ url: "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3" }); var map = new Map({ basemap: "gray-vector", layers: [featureLayer] }); var view = new MapView({ container: "viewDiv", map: map, center: [-122.4194, 37.7749], zoom: 12 }); view.when(function() { var query = featureLayer.createQuery(); query.geometry = polygon; query.spatialRelationship = "intersects"; featureLayer.queryFeatures(query).then(function(result) { var features = result.features; for (var i = 0; i < features.length; i++) { var feature = features[i]; feature.symbol = new SimpleFillSymbol({ color: [255, 0, 0, 0.5], style: "solid", outline: { color: [255, 0, 0], width: 1 } }); featureLayer.graphics.add(new Graphic(feature.geometry, feature.symbol)); } }); }); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值