2017-05-30 1 views
1

Dans mon projet, j'utilise un MapView d'ArcGIS Runtime pour Android. J'effectue une requête pour les entités dans un polygone et avec une certaine valeur d'attribut. Lorsque la recherche est terminée, je souhaite effacer tous les graphiques existants sur la carte. J'ai essayé map.removeAll() mais il efface toutes mes couches! Comment puis-je effacer tous les graphiques au lieu de supprimer tous les calques?Effacer le calque MapView dans ArcGIS Runtime pour Android

Ceci est mon code:

private class AsyncQueryTask extends AsyncTask<String, Void, FeatureResult> { 

    @Override 
    protected void onPreExecute() { 

     progress = new ProgressDialog(Naghshe.this); 
     progress = ProgressDialog.show(Naghshe.this, "", 
       "Please wait....query task is executing"); 

    } 


    @Override 
    protected FeatureResult doInBackground(String... queryArray) { 

     if (queryArray == null || queryArray.length <= 1) 
      return null; 

     String url = queryArray[0]; 
     QueryParameters qParameters = new QueryParameters(); 
     String whereClause = queryArray[1]; 
     // SpatialReference sr = SpatialReference.create(102100); 
     qParameters.setGeometry(map.getExtent()); 
     // qParameters.setOutSpatialReference(sr); 
     qParameters.setReturnGeometry(true); 
     qParameters.setWhere(whereClause); 

     QueryTask qTask = new QueryTask(url); 

     try { 
      FeatureResult results = qTask.execute(qParameters); 

      return results; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 

    } 

    @Override 
    protected void onPostExecute(FeatureResult results) { 


     if (results != null) { 
      int size = (int) results.featureCount(); 

      for (Object element : results) { 
       progress.incrementProgressBy(size/100); 
       if (element instanceof Feature) { 
        Feature feature = (Feature) element; 
        Graphic graphic = new Graphic(feature.getGeometry(), 
          feature.getSymbol(), feature.getAttributes()); 

        _graphicsLayer = new GraphicsLayer(); 
        _graphicsLayer.addGraphic(graphic); 

        SimpleRenderer sr = new SimpleRenderer(new SimpleFillSymbol(Color.RED)); 
        _graphicsLayer.setRenderer(sr); 

        boolean m =false; 
        if(!m) 
        { 
         map.addLayer(_graphicsLayer); 
         m=true; 
        }else { 
         map.removeLayer(_graphicsLayer); 

         map.addLayer(_graphicsLayer); 
        } 

        map.zoomin(); 

        k++; 
       } 
      } 
     } 
     progress.dismiss(); 
     boolQuery = false; 
    } 
+0

FYI il semble que vous créez une nouvelle 'GraphicsLayer' pour chaque résultat de recherche. Vous devriez probablement créer votre 'GraphicsLayer' en dehors de la boucle de sorte que vous ayez plusieurs graphismes dans un calque au lieu de plusieurs calques avec un graphisme chacun. Mais c'est à vous de décider. –

Répondre

1

MapView.removeAll() supprime toutes les couches de la carte. Ce n'est pas ce que tu veux. Au lieu de cela, essayez de boucler à travers les couches MapView et pour chaque couche de type GraphicsLayer (mais pas de type ArcGISFeatureLayer), supprimez la couche ou supprimez les graphiques de la couche. Faites quelque chose comme ceci:

private void somewhereInYourExistingCode() { 
    ... 
    for (Layer layer : map.getLayers()) { 
     clearGraphics(layer); 
    } 
    ... 
} 

private void clearGraphics(Layer layer) { 
    /** 
    * ArcGISFeatureLayer extends GraphicsLayer, but what you're 
    * probably looking for is GraphicsLayer objects that are 
    * not of type ArcGISFeatureLayer. 
    */ 
    if (layer instanceof GraphicsLayer && !(layer instanceof ArcGISFeatureLayer)) { 
     // You can call map.removeLayer(layer), or... 
     ((GraphicsLayer) layer).removeAll(); 
    } else if (layer instanceof GroupLayer) { 
     GroupLayer groupLayer = (GroupLayer) layer; 
     for (Layer sublayer : groupLayer.getLayers()) { 
      // Recursive call 
      clearGraphics(sublayer); 
     } 
    } 
}