france

https://github.com/francecil

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理



参考.. 官方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\n%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\nGo %.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;
  }

}


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

posted on 2015-05-04 16:21  france  阅读(606)  评论(0编辑  收藏  举报