Arcgis for android 离线查询

来源:互联网 发布:54美工网 编辑:程序博客网 时间:2024/05/16 16:55



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

以及。。

 ArcGIS for Android示例解析之高亮要素-----HighlightFeatureshttp://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服务-----SelectFeatureshttp://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;  }}


0 0
原创粉丝点击