我在地图中添加了两个要素图层,当我显示 MapView 时可以看到它们。但是,只有最后一个添加的要素图层可以由 Touch Listener 处理。我无法弄清楚如何让 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);
}
});
}
}
}
});