zoukankan      html  css  js  c++  java
  • Arcgis for android 离线查询



    参考.. 官方API demo 。。。 各种资料

    以及。。

     ArcGIS for Android示例解析之高亮要素-----HighlightFeatures
    http://blog.csdn.net/wozaifeiyang0/article/details/7323606


    arcgis android 中 Geodatabase geodata = new Geodatabase(filepath);得到geodata为空
    
    http://zhidao.baidu.com/link?url=iH5IDhbjIKOrZE3WffmhHwJ2ZqFF8AzU8tir8qvSl_BP5AUIHiGSc3aKbqZ7MWVHS1_8Umey4tgNcm9fEm3eVX0pN5DMnhe2_Z7FoGa2ppe&qq-pf-to=pcqq.group
    

    ArcGIS for Android示例解析之FeatureLayer服务-----SelectFeatures
    http://bbs.hiapk.com/thread-3940420-1-1.html

    过程:

    通过FeatureLayer我们可以很快的查询出所选的要素,并进行渲染。下面我们梳理一下选择查询的步骤:

    1、              FeatureLayer图层对象所需的参数的设置,如:自身的url设置,Options对象设置,以及选择的要素渲染的样式设置等。
    2、              定义一个Query对象,并且给其设置所需的值,如:设置查询条件、是否返回几何对象、输入的空间参考、空间要素以及查询的空间关系。
    3、              执行FeatureLayer对象的selectFeatures()方法。
     4 、Graphic graphic = new Graphic(feature.getGeometry(),
                                   sfs);
                            // add graphic to layer
                            mGraphicsLayer.addGraphic(graphic);

    详细:先
    1.GraphicsLayer mGraphicsLayer = new GraphicsLayer();  //类似于画布
    final String tpkPath = "/Arcgis/hello.tpk";
        public static final String GEO_FILENAME="/Arcgis/hello/data/z01.geodatabase";//数据存放地址
    2. onCreate里面加 mMapView.addLayer(mGraphicsLayer); 
    3.class TouchListener extends MapOnTouchListener {
    长按清除所有画布的要素
    public void onLongPress(MotionEvent point) {
          // Our long press will clear the screen
          mStops.clearFeatures();
          mGraphicsLayer.removeAll();
          mMapView.getCallout().hide();
        }
    public boolean onSingleTap(MotionEvent point) {
            Point mapPoint = mMapView.toMapPoint(point.getX(), point.getY());
            Log.i("zjx",""+mapPoint.getX()/1000+",,,"+(mapPoint.getY()/1000+1));
            Graphic graphic = new Graphic(mapPoint, new SimpleMarkerSymbol(Color.BLUE, 10, STYLE.DIAMOND));
            mGraphicsLayer.addGraphic(graphic);}
    单击得到相对地图的位置

    双击。。这里我订死了查询条件,显示要素
    Geodatabase geodatabase =null;
            try {
                geodatabase =new Geodatabase(filename);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            List<GeodatabaseFeatureTable> table = geodatabase
          .getGeodatabaseTables();
            Log.i("zjx","list:"+table);
            GeodatabaseFeatureTable mytable=geodatabase.getGeodatabaseFeatureTableByLayerId(0);

    得到数据库 以及第一个数据表
     FeatureLayer  featureLayer = new FeatureLayer(mytable);
            QueryParameters qParameters = new QueryParameters();
            String whereClause = "name='z5'";
    //        SpatialReference sr = SpatialReference.create(102100);
            qParameters.setGeometry(mMapView.getExtent());
    //        qParameters.setOutSpatialReference(sr);
            qParameters.setReturnGeometry(true);
            qParameters.setWhere(whereClause);
            CallbackListener<FeatureResult> callback=new CallbackListener<FeatureResult>(){
                public void onError(Throwable e) {
                    e.printStackTrace();
                }
    
                public void onCallback(FeatureResult featureIterator) {
                    //...
                    Log.i("zjx","featureIterator.featureCount():"+featureIterator.featureCount());
                    Log.i("zjx","featureIterator.getDisplayFieldName()"+featureIterator.getDisplayFieldName());
                    Log.i("zjx","i m callback");
                }
    
    
            };
            Log.i("zjx","sb:"+featureLayer.selectFeatures(qParameters, FeatureLayer.SelectionMode.NEW,callback));
    //        featureLayer.getU
            Future<FeatureResult> resultFuture=featureLayer.selectFeatures(qParameters, FeatureLayer.SelectionMode.NEW,callback);
            Log.i("zjx","resultFuture:"+ resultFuture);
            try{
                FeatureResult results = resultFuture.get();//最关键  得到结果
                Log.i("zjx","feature.featureCount():"+results.featureCount());//得到结果的数量
                Log.i("zjx","feature.getDisplayFieldName():"+results.getDisplayFieldName());
                if (results != null) {
                    Log.i("zjx","results no null");
                    int size = (int) results.featureCount();
                    int i = 0;
                    for (Object element : results) {//得到每个要素
                        Log.i("zjx","the element:"+element);
                        if (element instanceof Feature) {
                            Log.i("zjx","element");
                            Feature feature = (Feature) element;
                            Log.i("zjx","Feature feature = (Feature) element;:"+element);
                            // turn feature into graphic
                            Random r = new Random();
                            int color = Color.rgb(r.nextInt(255), r.nextInt(255), r.nextInt(255));
                            SimpleFillSymbol sfs = new SimpleFillSymbol(color);
                            sfs.setAlpha(75);
                            Graphic graphic = new Graphic(feature.getGeometry(),
                                   sfs);
                            // add graphic to layer
                            mGraphicsLayer.addGraphic(graphic);//显示要素
                        }
                        i++;
                    }
                    // update message with results
    
    
                }
    设置查询条件 高亮样式



    完整:
    package com.esri.arcgis.android.samples.offlineroutingandgeocoding;
    
    import java.io.FileNotFoundException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Random;
    import java.util.concurrent.Future;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.os.Environment;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemSelectedListener;
    import android.widget.ArrayAdapter;
    import android.widget.Spinner;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.esri.android.map.FeatureLayer;
    import com.esri.android.map.GraphicsLayer;
    import com.esri.android.map.GraphicsLayer.RenderingMode;
    import com.esri.android.map.MapOnTouchListener;
    import com.esri.android.map.MapView;
    import com.esri.android.map.TiledLayer;
    import com.esri.android.map.ags.ArcGISLocalTiledLayer;
    import com.esri.core.geodatabase.Geodatabase;
    import com.esri.core.geodatabase.GeodatabaseFeature;
    import com.esri.core.geodatabase.GeodatabaseFeatureTable;
    import com.esri.core.geometry.Geometry;
    import com.esri.core.geometry.Point;
    import com.esri.core.geometry.SpatialReference;
    import com.esri.core.map.CallbackListener;
    import com.esri.core.map.Feature;
    import com.esri.core.map.FeatureResult;
    import com.esri.core.map.FeatureSet;
    import com.esri.core.map.Graphic;
    import com.esri.core.symbol.SimpleFillSymbol;
    import com.esri.core.symbol.SimpleLineSymbol;
    import com.esri.core.symbol.SimpleMarkerSymbol;
    import com.esri.core.symbol.SimpleMarkerSymbol.STYLE;
    import com.esri.core.tasks.geocode.Locator;
    import com.esri.core.tasks.geocode.LocatorReverseGeocodeResult;
    import com.esri.core.tasks.na.NAFeaturesAsFeature;
    import com.esri.core.tasks.na.Route;
    import com.esri.core.tasks.na.RouteDirection;
    import com.esri.core.tasks.na.RouteParameters;
    import com.esri.core.tasks.na.RouteResult;
    import com.esri.core.tasks.na.RouteTask;
    import com.esri.core.tasks.na.StopGraphic;
    import com.esri.core.tasks.query.QueryParameters;
    
    public class RoutingAndGeocoding extends Activity {
    
      // Define ArcGIS Elements
      MapView mMapView;
      final String extern = Environment.getExternalStorageDirectory().getPath();
    //  final String tpkPath = "/ArcGIS/samples/OfflineRouting/SanDiego.tpk";
    final String tpkPath = "/Arcgis/hello.tpk";
        public static final String GEO_FILENAME="/Arcgis/hello/data/z01.geodatabase";
      TiledLayer mTileLayer = new ArcGISLocalTiledLayer(extern + tpkPath);
      GraphicsLayer mGraphicsLayer = new GraphicsLayer();
        String filename=extern+GEO_FILENAME;
      RouteTask mRouteTask = null;
      NAFeaturesAsFeature mStops = new NAFeaturesAsFeature();
    
      Locator mLocator = null;
      View mCallout = null;
      Spinner dSpinner;
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_routing_and_geocoding);
        
        // Find the directions spinner
        dSpinner = (Spinner) findViewById(R.id.directionsSpinner);
        dSpinner.setEnabled(false);
    
        // Retrieve the map and initial extent from XML layout
        mMapView = (MapView) findViewById(R.id.map);
    
        // Set the tiled map service layer and add a graphics layer
        mMapView.addLayer(mTileLayer);
        mMapView.addLayer(mGraphicsLayer);
    
        // Initialize the RouteTask and Locator with the local data
        initializeRoutingAndGeocoding();
        mMapView.setOnTouchListener(new TouchListener(RoutingAndGeocoding.this, mMapView));
      //    Point mapPoint = null;
    
    //      mapPoint.setXY(0.1942*1928,(0.6842-1)*1928);
    //      Log.i("zjx",""+mapPoint);
    //      Graphic graphic = new Graphic(mapPoint, new SimpleMarkerSymbol(Color.BLUE, 10, STYLE.DIAMOND));
    //      mGraphicsLayer.addGraphic(graphic);
      }
    
      private void initializeRoutingAndGeocoding() {
    
        // We will spin off the initialization in a new thread
        new Thread(new Runnable() {
    
          @Override
          public void run() {
            // Get the external directory
    //        String locatorPath = "/ArcGIS/samples/OfflineRouting/Geocoding/SanDiego_StreetAddress.loc";
    //        String networkPath = "/ArcGIS/samples/OfflineRouting/Routing/RuntimeSanDiego.geodatabase";
                String locatorPath = "/Arcgis/hello/data/z01.loc";
                String networkPath = "/Arcgis/hello/data/z01.geodatabase";
                String networkName = "Streets_ND";
    
            // Attempt to load the local geocoding and routing data
            try {
              mLocator = Locator.createLocalLocator(extern + locatorPath);
              mRouteTask = RouteTask.createLocalRouteTask(extern + networkPath, networkName);
            } catch (Exception e) {
              popToast("Error while initializing :" + e.getMessage(), true);
              e.printStackTrace();
            }
          }
        }).start();
      }
    
      class TouchListener extends MapOnTouchListener {
    
        private int routeHandle = -1;
    
        @Override
        public void onLongPress(MotionEvent point) {
          // Our long press will clear the screen
          mStops.clearFeatures();
          mGraphicsLayer.removeAll();
          mMapView.getCallout().hide();
        }
    
        @Override
        public boolean onSingleTap(MotionEvent point) {
            Point mapPoint = mMapView.toMapPoint(point.getX(), point.getY());
            Log.i("zjx",""+mapPoint.getX()/1000+",,,"+(mapPoint.getY()/1000+1));
            Graphic graphic = new Graphic(mapPoint, new SimpleMarkerSymbol(Color.BLUE, 10, STYLE.DIAMOND));
            mGraphicsLayer.addGraphic(graphic);
          if (mLocator == null) {
                popToast("Locator uninitialized", true);
                return super.onSingleTap(point);
            }
    
          String stopAddress = "";
          try {
            // Attempt to reverse geocode the point.
            // Our input and output spatial reference will
            // be the same as the map.
            SpatialReference mapRef = mMapView.getSpatialReference();
            LocatorReverseGeocodeResult result = mLocator.reverseGeocode(mapPoint, 50, mapRef, mapRef);
    
            // Construct a nicely formatted address from the results
            StringBuilder address = new StringBuilder();
            if (result != null && result.getAddressFields() != null) {
              Map<String, String> addressFields = result.getAddressFields();
              address.append(String.format("%s
    %s, %s %s", addressFields.get("Street"), addressFields.get("City"),
                  addressFields.get("State"), addressFields.get("ZIP")));
            }
    
            // Show the results of the reverse geocoding in
            // the map's callout.
            stopAddress = address.toString();
            showCallout(stopAddress, mapPoint);
    
          } catch (Exception e) {
            Log.v("Reverse Geocode", e.getMessage());
          }
    
          // Add the touch event as a stop
          StopGraphic stop = new StopGraphic(graphic);
          stop.setName(stopAddress.toString());
          mStops.addFeature(stop);
    
          return true;
        }
    
        @Override
        public boolean onDoubleTap(MotionEvent point) {
            Log.i("zjx","double");
    
           // String filename=Environment.getExternalStorageDirectory().getAbsolutePath()+GEO_FILENAME;
            Geodatabase geodatabase =null;
            try {
                geodatabase =new Geodatabase(filename);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            List<GeodatabaseFeatureTable> table = geodatabase
          .getGeodatabaseTables();
            Log.i("zjx","list:"+table);
            GeodatabaseFeatureTable mytable=geodatabase.getGeodatabaseFeatureTableByLayerId(0);
            FeatureLayer  featureLayer = new FeatureLayer(mytable);
            QueryParameters qParameters = new QueryParameters();
            String whereClause = "name='z5'";
    //        SpatialReference sr = SpatialReference.create(102100);
            qParameters.setGeometry(mMapView.getExtent());
    //        qParameters.setOutSpatialReference(sr);
            qParameters.setReturnGeometry(true);
            qParameters.setWhere(whereClause);
            CallbackListener<FeatureResult> callback=new CallbackListener<FeatureResult>(){
                public void onError(Throwable e) {
                    e.printStackTrace();
                }
    
                public void onCallback(FeatureResult featureIterator) {
                    //...
                    Log.i("zjx","featureIterator.featureCount():"+featureIterator.featureCount());
                    Log.i("zjx","featureIterator.getDisplayFieldName()"+featureIterator.getDisplayFieldName());
                    Log.i("zjx","i m callback");
                }
    
    
            };
            Log.i("zjx","sb:"+featureLayer.selectFeatures(qParameters, FeatureLayer.SelectionMode.NEW,callback));
    //        featureLayer.getU
            Future<FeatureResult> resultFuture=featureLayer.selectFeatures(qParameters, FeatureLayer.SelectionMode.NEW,callback);
            Log.i("zjx","resultFuture:"+ resultFuture);
            try{
                FeatureResult results = resultFuture.get();
                Log.i("zjx","feature.featureCount():"+results.featureCount());
                Log.i("zjx","feature.getDisplayFieldName():"+results.getDisplayFieldName());
                if (results != null) {
                    Log.i("zjx","results no null");
                    int size = (int) results.featureCount();
                    int i = 0;
                    for (Object element : results) {
                        Log.i("zjx","the element:"+element);
                        if (element instanceof Feature) {
                            Log.i("zjx","element");
                            Feature feature = (Feature) element;
                            Log.i("zjx","Feature feature = (Feature) element;:"+element);
                            // turn feature into graphic
                            Random r = new Random();
                            int color = Color.rgb(r.nextInt(255), r.nextInt(255), r.nextInt(255));
                            SimpleFillSymbol sfs = new SimpleFillSymbol(color);
                            sfs.setAlpha(75);
                            Graphic graphic = new Graphic(feature.getGeometry(),
                                   sfs);
                            // add graphic to layer
                            mGraphicsLayer.addGraphic(graphic);
                        }
                        i++;
                    }
                    // update message with results
    
    
                }
    
    
            }
           catch (Exception e){
               Log.i("zjx","e:"+e);
           }
    
    //        Log.i("zjx","featureLayer2:"+featureLayer);
    //        mMapView.addLayer(featureLayer);
    //        QueryParameters query = new QueryParameters();
    ////        query.setWhere("*");
    //
    //        query.setOutFields(new String[]{"*"});
    //        Log.i("zjx","query:"+query.toString());
    //
    
    //        Future resultFuture = mytable.queryFeatures(query, callback);
    //        try{
    //            Log.i("zjx","resultFuture:"+resultFuture.get().toString());
    //             Object result = resultFuture.get();
    //                Feature feature = (Feature) result;
    //                Map attrs = feature.getAttributes();
    //                Log.i("zjx","feature:"+feature);
    //            Log.i("zjx","attrs:"+attrs);
    //        }
    //        catch(Exception e){
    //
    //            Log.i("zjx","error:"+e);
    //        }
    
    //        Future resultFuture = gdbFeatureTable.queryFeatures(query, new CallbackListener() {
    //
    //            public void onError(Throwable e) {
    //                e.printStackTrace();
    //            }
    //
    //            public void onCallback(FeatureResult featureIterator) {
    //             //   ...
    //            }
    //        });
    //
    //        for (Object result : resultFuture.get()) {
    //            Feature feature = (Feature) result;
    //            // Map attrs = feature.getAttributes();
    //        }
          // Return default behavior if we did not initialize properly.
    //      if (mRouteTask == null) {
    //        popToast("RouteTask uninitialized.", true);
    //        return super.onDoubleTap(point);
    //      }
    //
    //      try {
    //
    //        // Set the correct input spatial reference on the stops and the
    //        // desired output spatial reference on the RouteParameters object.
    //        SpatialReference mapRef = mMapView.getSpatialReference();
    //        RouteParameters params = mRouteTask.retrieveDefaultRouteTaskParameters();
    //        params.setOutSpatialReference(mapRef);
    //        mStops.setSpatialReference(mapRef);
    //
    //        // Set the stops and since we want driving directions,
    //        // returnDirections==true
    //        params.setStops(mStops);
    //        params.setReturnDirections(true);
    //
    //        // Perform the solve
    //        RouteResult results = mRouteTask.solve(params);
    //
    //        // Grab the results; for offline routing, there will only be one
    //        // result returned on the output.
    //        Route result = results.getRoutes().get(0);
    //
    //        // Remove any previous route Graphics
    //        if (routeHandle != -1)
    //          mGraphicsLayer.removeGraphic(routeHandle);
    //
    //        // Add the route shape to the graphics layer
    //        Geometry geom = result.getRouteGraphic().getGeometry();
    //        routeHandle = mGraphicsLayer.addGraphic(new Graphic(geom, new SimpleLineSymbol(0x99990055, 5)));
    //        mMapView.getCallout().hide();
    //
    //        // Get the list of directions from the result
    //        List<RouteDirection> directions = result.getRoutingDirections();
    //
    //        // enable spinner to receive directions
    //        dSpinner.setEnabled(true);
    //
    //        // Iterate through all of the individual directions items and
    //        // create a nicely formatted string for each.
    //        List<String> formattedDirections = new ArrayList<String>();
    //        for (int i = 0; i < directions.size(); i++) {
    //          RouteDirection direction = directions.get(i);
    //          formattedDirections.add(String.format("%s
    Go %.2f %s For %.2f Minutes", direction.getText(),
    //              direction.getLength(), params.getDirectionsLengthUnit().name(), direction.getMinutes()));
    //        }
    //
    //        // Add a summary String
    //        formattedDirections.add(0, String.format("Total time: %.2f Mintues", result.getTotalMinutes()));
    //
    //        // Create a simple array adapter to visualize the directions in
    //        // the Spinner
    //        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(),
    //            android.R.layout.simple_spinner_item, formattedDirections);
    //        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    //        dSpinner.setAdapter(adapter);
    //
    //        // Add a custom OnItemSelectedListener to the spinner to allow
    //        // panning to each directions item.
    //        dSpinner.setOnItemSelectedListener(new DirectionsItemListener(directions));
    //
    //      } catch (Exception e) {
    //        popToast("Solve Failed: " + e.getMessage(), true);
    //        e.printStackTrace();
    //      }
          return true;
        }
    
        public TouchListener(Context context, MapView view) {
          super(context, view);
        }
      }
    
      class DirectionsItemListener implements OnItemSelectedListener {
    
        private List<RouteDirection> mDirections;
    
        public DirectionsItemListener(List<RouteDirection> directions) {
          mDirections = directions;
        }
    
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
          // We have to account for the added summary String
          if (mDirections != null && pos > 0 && pos <= mDirections.size())
            mMapView.setExtent(mDirections.get(pos - 1).getGeometry());
        }
    
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }
      }
    
      private void showCallout(String text, Point location) {
    
        // If the callout has never been created, inflate it
        if (mCallout == null) {
          LayoutInflater inflater = (LayoutInflater) getApplication().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          mCallout = inflater.inflate(R.layout.callout, null);
        }
    
        // Show the callout with the given text at the given location
        ((TextView) mCallout.findViewById(R.id.calloutText)).setText(text);
        mMapView.getCallout().show(location, mCallout);
        mMapView.getCallout().setMaxWidth(700);
      }
    
      private void popToast(final String message, final boolean show) {
        // Simple helper method for showing toast on the main thread
        if (!show)
          return;
    
        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            Toast.makeText(RoutingAndGeocoding.this, message, Toast.LENGTH_SHORT).show();
          }
        });
      }
    
      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.routing_and_geocoding, menu);
        return true;
      }
    
    }
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    【BZOJ2749】【HAOI2012】外星人[欧拉函数]
    【BZOJ3675】【APIO2014】序列分割 [斜率优化DP]
    【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
    【BZOJ1996】【HNOI2010】合唱队 [区间DP]
    【BZOJ1857】【SCOI2010】传送带 [三分]
    【BZOJ2338】【HNOI2011】数矩形 [计算几何]
    【BZOJ2330】【SCOI2011】糖果 [差分约束]
    【BZOJ1095】【ZJOI2007】捉迷藏 [动态点分治]
    【BZOJ4031】【HEOI2015】小Z的房间 [Matrix-Tree][行列式]
    【FJWC2017】交错和查询 [线段树]
  • 原文地址:https://www.cnblogs.com/france/p/4808562.html
Copyright © 2011-2022 走看看