我在地图中添加了两个功能图层,当我显示MapView时,我可以看到它。但是,它只是触摸侦听器可以处理的最后添加的要素图层。我无法弄清楚如何通过Touch Listener将所有功能图层考虑在内。
我的目标是区分点击CARTO_ETARE的功能,点击CARTO_PT_EAU的功能。
任何帮助都将不胜感激。
mGeodatabase = new Geodatabase(mGeoDb);
// load the geodatabase
mGeodatabase.loadAsync();
// add feature layer from geodatabase to the ArcGISMap
mGeodatabase.addDoneLoadingListener(new Runnable() {
@Override
public void run() {
for (GeodatabaseFeatureTable geoDbTable : mGeodatabase.getGeodatabaseFeatureTables()){
ArrayList<String> list_of_tables = new ArrayList<String>();
list_of_tables.add("CARTO_ETARE");
list_of_tables.add("CARTO_PT_EAU");
Set<String> set = new HashSet<String>(list_of_tables);
if (set.contains(geoDbTable.getTableName())) {
mFeatureLayer = new FeatureLayer(geoDbTable);
mFeatureLayer.setLabelsEnabled(true);
mFeatureLayer.setSelectionWidth(10);
//featureLayer.selectFeatures();
mMap.getOperationalLayers().add(mFeatureLayer);
mMapView.setMap(mMap);
// set an on touch listener to listen for click events
mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(MainActivity.this, mMapView) {
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// get the point that was clicked and convert it to a point in map coordinates
Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
int tolerance = 10;
double mapTolerance = tolerance * mMapView.getUnitsPerDensityIndependentPixel();
// create objects required to do a selection with a query
Envelope envelope = new Envelope(clickPoint.getX() - mapTolerance,
clickPoint.getY() - mapTolerance,
clickPoint.getX() + mapTolerance,
clickPoint.getY() + mapTolerance,
mMap.getSpatialReference());
QueryParameters query = new QueryParameters();
query.setGeometry(envelope);
// call select features
mFuture = mFeatureLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.ADD);
// add done loading listener to fire when the selection returns
mFuture.addDoneListener(new Runnable() {
@Override
public void run() {
try {
//call get on the future to get the result
FeatureQueryResult result = mFuture.get();
// create an Iterator
Iterator<Feature> iterator = result.iterator();
Feature feature;
while (iterator.hasNext()) {
feature = iterator.next();
Map<String, Object> attributes = feature.getAttributes();
if(feature.getFeatureTable().getTableName().equals("CARTO_PT_EAU")) {
Toast.makeText(getApplicationContext(), Long.toString((Long)attributes.get("ID_PT_EAU")), Toast.LENGTH_SHORT).show();
}
else if(feature.getFeatureTable().getTableName().equals("CARTO_ETARE")) {
mPdfFilename = (String) attributes.get("COD");
}
}
} catch (Exception e) {
Log.e(getResources().getString(R.string.app_name), "Select feature failed: " + e.getMessage());
}
}
});
return super.onSingleTapConfirmed(e);
}
});
}
}
}
});
答案 0 :(得分:0)
您当前的代码只会根据此行选择mFeatureLayer中的所有功能
mFuture = mFeatureLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.ADD);
每次在地理数据库表格中循环时都会被覆盖,因此它只是保留最后添加的任何图层。
我认为Identify或其中一个重载可能更适合您的目的。
一些快速示例用法代码是:
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
android.graphics.Point screenPoint = new android.graphics.Point((int) e.getX(), (int) e.getY());
final ListenableFuture<List<IdentifyLayerResult>> identifyFuture = mMapView
.identifyLayersAsync(screenPoint, 10, false, 10);
identifyFuture.addDoneListener(new Runnable() {
@Override public void run() {
try {
List<IdentifyLayerResult> identifyLayerResultList = identifyFuture.get();
//if the point that the identify occurs at contains points from both layers, this should return 2 results, one for each layer
Log.d("identifySize", String.valueOf(identifyLayerResultList.size()));
for (IdentifyLayerResult result : identifyLayerResultList) {
LayerContent layer = result.getLayerContent();
//do whatever you want for the layer
//the features are retrieved through result.getElements()
}
} catch (InterruptedException | ExecutionException e1) {
e1.printStackTrace();
}
}
});
return super.onSingleTapConfirmed(e);
}