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()方法。
1、 FeatureLayer图层对象所需的参数的设置,如:自身的url设置,Options对象设置,以及选择的要素渲染的样式设置等。
2、 定义一个Query对象,并且给其设置所需的值,如:设置查询条件、是否返回几何对象、输入的空间参考、空间要素以及查询的空间关系。
3、 执行FeatureLayer对象的selectFeatures()方法。
4 、Graphic graphic = new Graphic(feature.getGeometry(),
sfs);
// add graphic to layer
mGraphicsLayer.addGraphic(graphic);
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";//数据存放地址
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);
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
- Arcgis for android 离线查询
- ArcGIS for Android 离线数据空间查询--I查询
- ArcGIS for Android 离线数据编辑原理
- ArcGis for android 加载tpk离线文件
- arcgis for android 离线地图实现
- ArcGIS for android 离线地图 案例
- Arcgis For Android加载离线地图
- ArcGIS for android 离线地图 案例
- Arcgis for Android离线数据下载
- ArcGIS for Android 离线数据图例加载
- ArcGIS for Android Runtime100 基本操作(三)——离线数据空间查询
- arcgis for android 空间查询
- arcgis for android 空间查询
- Arcgis For Android 查询功能
- ArcGIS API For Android离线地图的实现
- ArcGIS for Android示例解析之离线地图-----LocalTiledLayer
- ArcGIS for Android离线数据编辑实现原理
- 【技术直通车】ArcGIS for Android离线数据编辑实现原理
- 如何批量删除redis中的key
- Leetcode20: Set Matrix Zeroes
- ioctl&SIOCGIFCONF提取IP和MAC
- HDU5091 Beam Cannon(线段树扫描线)
- 数组a[]存放1至N-1个数,其中某个数重复一次,写个函数找出那个数:
- Arcgis for android 离线查询
- activeMQ 备忘
- android SoundPool类测试
- NHibernate 执行存储过程
- POJ 3186Treats for the Cows 简单dp
- 排序算法实现与比较
- 获取toast的Text的值
- APP的Android.mk文件分析
- UTF的字节序和BOM