2016-12-08 1 views
0

J'utilise la bibliothèque arcgis 100.0.0 dans android pour afficher des cartes et des informations à l'intérieur de la carte.Comment extraire tous les champs de ServiceFeatureTable dans arcgis

J'utilise le code suivant pour remplir un ServiceFeaturetable en utilisant l'URL fournie par arcGis. Je suis capable de charger la couche d'entités avec succès dans la carte. J'ai écrit un code qui écoute le clic sur le symbole sur la carte, afin que je puisse obtenir des informations sur l'élément spécifique sur la carte. Je suis en mesure d'obtenir la fonctionnalité spécifique OnClick.

Lors de l'analyse du résultat GetAttributes() de l'entité spécifique, je me rends compte qu'elle ne possède pas tous les champs. Après avoir enquêté sur internet, j'ai trouvé que FeatureTable.QueryFeaturesAsync pouvait être utilisé pour obtenir tous les champs de la fonctionnalité. Même si j'ai écrit le code pour obtenir tous les champs, je ne sais pas comment lier ce résultat avec la couche d'entités, de sorte que la fonctionnalité possède tous les champs dont j'ai besoin. Voici le code

final ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable("some URL"); 



     ListenableFuture<FeatureQueryResult> queryresult = serviceFeatureTable.queryFeaturesAsync(null, ServiceFeatureTable.QueryFeatureFields.LOAD_ALL); 


     // create the feature layer using the service feature table 
     final FeatureLayer featureLayer = new FeatureLayer(serviceFeatureTable); 

     featureLayer.setSelectionColor(Color.YELLOW); 
     featureLayer.setSelectionWidth(10); 

     // add the layer to the map 
     mapView.getMap().getOperationalLayers().add(featureLayer); 

     // set an on touch listener to listen for click events 
     mapView.setOnTouchListener(new DefaultMapViewOnTouchListener(getContext(), mapView) { 
      @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, mapView.getMap().getSpatialReference()); 
       QueryParameters query = new QueryParameters(); 

       query.setGeometry(envelope); 


       // call select features 
       final ListenableFuture<FeatureQueryResult> future = featureLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.NEW); 

       // add done loading listener to fire when the selection returns 
       future.addDoneListener(new Runnable() { 
        @Override 
        public void run() { 
         try { 
          //call get on the future to get the result 
          FeatureQueryResult result = future.get(); 
          // create an Iterator 
          Iterator<Feature> iterator = result.iterator(); 
          Feature feature; 
          // cycle through selections 
          int counter = 0; 
          while (iterator.hasNext()){ 
           feature = iterator.next(); 
           counter++; 
           String name = feature.getAttributes().get(Constants.FIELD_NAME).toString(); 
           Log.d(getResources().getString(R.string.app_name), "Selection #: " + counter + " Table name: " + feature.getFeatureTable().getTableName()); 
          } 
          //Toast.makeText(getApplicationContext(), counter + " features selected", Toast.LENGTH_SHORT).show(); 
         } catch (Exception e) { 
          Log.e(getResources().getString(R.string.app_name), "Select feature failed: " + e.getMessage()); 
         } 
        } 
       }); 
       return super.onSingleTapConfirmed(e); 
      } 
     }); 

Répondre

0

Essayez de remplacer votre code

de

final ListenableFuture<FeatureQueryResult> future = featureLayer.selectFeaturesAsync(query, FeatureLayer.SelectionMode.NEW); 

à

final ListenableFuture<FeatureQueryResult> future = serviceFeatureTable.queryFeaturesAsync(query, ServiceFeatureTable.QueryFeatureFields.LOAD_ALL); 

Il fonctionne pour moi!