1. 程式人生 > >ArcGIS for Android示例解析之FeatureLayer服務-----SelectFeatures

ArcGIS for Android示例解析之FeatureLayer服務-----SelectFeatures

 

SelectFeatures

在這部分中主要討論一下FeatureLayer圖層的應用,此示例讓我們可以初步認識一下FeatureLayer,下面我來看一下程式碼:

public void onCreate(Bundle savedInstanceState) {

           super.onCreate(savedInstanceState);

            //例項化一個MapView物件

           map = new MapView(this);

           //初始化map的顯示範圍

map.setExtent(new Envelope(-10868502.895856911, 4470034.144641369,

                      -10837928.084542884, 4492965.25312689), 0);

           //切片地圖地圖服務

           ArcGISTiledMapServiceLayer tms = new ArcGISTiledMapServiceLayer(

                      "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer");

           //新增服務到map中顯示

           map.addLayer(tms);

           //FeatureLayer所需的可選引數物件

           Options o = new Options();

           o.mode = MODE.ONDEMAND;//立即執行

           //定義圖層顯示的欄位

           o.outFields = new String[] { "FIELD_KID", "APPROXACRE", "FIELD_NAME",

                      "STATUS", "PROD_GAS", "PROD_OIL", "ACTIVEPROD", "CUMM_OIL",

                      "MAXOILWELL", "LASTOILPRO", "LASTOILWEL", "LASTODATE",

                      "CUMM_GAS", "MAXGASWELL", "LASTGASPRO", "LASTGASWEL",

                      "LASTGDATE", "AVGDEPTH", "AVGDEPTHSL", "FIELD_TYPE",

                      "FIELD_KIDN" };

            //定義FeatureLayer物件,url指向為服務的一個圖層

           fLayer = new ArcGISFeatureLayer(

                       "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Petroleum/KSPetro/MapServer/1",

                      o);

           //定義面狀要素的填充的樣式物件,並給面狀要素的邊界設定樣式

           SimpleFillSymbol fiedldsSelectionSymbol = new SimpleFillSymbol(

                      Color.MAGENTA);

           fiedldsSelectionSymbol

                      .setOutline(new SimpleLineSymbol(Color.YELLOW, 2));

           //將圖層選擇的要素渲染成上面定義的樣式

           fLayer.setSelectionSymbol(fiedldsSelectionSymbol);

           //將圖層新增到map中

           map.addLayer(fLayer);

           // 例項化一個GraphicsLayer圖層物件

           gLayer = new GraphicsLayer();

            //例項化一個樣式物件

           sfs = new SimpleFillSymbol(Color.BLACK);

           sfs.setOutline(new SimpleLineSymbol(Color.RED, 2));

           sfs.setAlpha(100);

            //新增圖層到map中

           map.addLayer(gLayer);

           setContentView(map);

           //自定義擴充套件MapOnTouchListener類物件

           MyTouchListener touchListener = new MyTouchListener(this, map);

           map.setOnTouchListener(touchListener);//新增map的觸控事件監聽

           Toast.makeText(this, "Press down to start let go the stop",

                      Toast.LENGTH_SHORT).show();

      }

在onCreate()方法中主要是例項化一個MapView物件,給改物件添加了一個切片服務,又定義了一個Featurelayer服務,設定了該圖層中選擇的要素顯示的樣式和所需的Options可選引數物件,將其新增到MapView物件中,最後給MapView物件添加了一個GraphicsLayer圖層,並給MapView添加了一個觸控事件監聽。可以看出,在這個方法中多是一些初始化的工作,而Featurelayer操作在我們自定義的MyTouchListener類中完成的,看下面程式碼:

class MyTouchListener extends MapOnTouchListener {

           Graphic g;

           // 接觸地圖上的第一個點

           Point p0 = null;

           int uid = -1;

           public MyTouchListener(Context arg0, MapView arg1) {

                 super(arg0, arg1);

           }

           public boolean onDragPointerMove(MotionEvent from, MotionEvent to) {

                 //判斷uid如果等於-1說明這個點是第一個點之下下面if語句,如果不是-1之下else語句

                 if (uid == -1) { // first time

                      g = new Graphic(null, sfs);

                      p0 = map.toMapPoint(from.getX(), from.getY());//將螢幕座標轉成地理座標

                      uid = gLayer.addGraphic(g);//將要素新增到圖層中

                 } else {

                      //當手指在螢幕上移動時獲取最後的點並和第一點形成一個封閉的物件(一個矩形框)

                      Point p2 = map.toMapPoint(new Point(to.getX(), to.getY()));

                      Envelope envelope = new Envelope();

                      envelope.merge(p0);

                      envelope.merge(p2);

                      gLayer.updateGraphic(uid, envelope);//更新這個矩形框

                 }

                 return true;

           }         

           public boolean onDragPointerUp(MotionEvent from, MotionEvent to) {

                 if (uid != -1) {

                      g = gLayer.getGraphic(uid);//獲取這個矩形框要素

                      if (g!= null && g.getGeometry() != null) {

                            fLayer.clearSelection();//清除以前選擇的物件

                            Query q = new Query();//定義一個Query物件用於下面的查詢操作

                            // 定義它的相關引數及其條件

                            q.setWhere("PROD_GAS='Yes'");

                            q.setReturnGeometry(true);

                            q.setInSpatialReference(map.getSpatialReference());

                            q.setGeometry(g.getGeometry());

                            q.setSpatialRelationship(SpatialRelationship.INTERSECTS);

                            //執行選擇查詢操作

                            fLayer.selectFeatures(q, SELECTION_METHOD.NEW, callback);

                      }

                      gLayer.removeAll();

                 }

                 p0 = null;

                 // Resets it

                 uid = -1;

                 return true;

           }

      }

通過FeatureLayer我們可以很快的查詢出所選的要素,並進行渲染。下面我們梳理一下選擇查詢的步驟:

1、              FeatureLayer圖層物件所需的引數的設定,如:自身的url設定,Options物件設定,以及選擇的要素渲染的樣式設定等。

2、              定義一個Query物件,並且給其設定所需的值,如:設定查詢條件、是否返回幾何物件、輸入的空間參考、空間要素以及查詢的空間關係。

3、              執行FeatureLayer物件的selectFeatures()方法。