2017-09-12 8 views
0

マップに2つのフィーチャレイヤが追加されており、MapViewを表示すると表示されます。ただし、Touch Listenerで処理できるのは最後に追加されたフィーチャレイヤだけです。 Touch Listenerですべての機能レイヤを考慮する方法を理解できません。ArcGIS Androidの多くのフィーチャレイヤのリスナを取得する方法は?

私の目標は、CARTO_ETAREの機能のクリックとCARTO_PT_EAUの機能のクリックを区別することです。

ご協力いただければ幸いです。唯一それだけを添加したものは何でも層保持しててジオデータベースのテーブルの上にループ内たびに上書きなっている

mFuture = mFeatureLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.ADD); 

ここで行ごとにmFeatureLayer内にあるものは何でもフィーチャーを選択します

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

あなたの現在のコード最終。

私は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); 
} 
関連する問題