2017-05-30 5 views
1

私のプロジェクトでは、ArcGIS Runtime for AndroidのMapViewを使用しています。ポリゴン内のフィーチャと特定の属性値を使用してクエリを実行します。検索が完了したら、マップ上の既存のすべてのグラフィックをクリアしたい。私はmap.removeAll()を試しましたが、それはすべてのレイヤーをクリアします!すべてのレイヤーを削除する代わりに、すべてのグラフィックスをクリアするにはどうすればよいですか?Android用ArcGIS RuntimeのMapViewレイヤーをクリア

これは私のコードです:

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

すべての検索結果に対して新しい「GraphicsLayer」を作成しているようです。おそらくループの外側に 'GraphicsLayer'を作成して、複数のレイヤの代わりに複数のグラフィックをそれぞれ1つのグラフィックで作成するようにしてください。しかし、それはあなた次第です。 –

答えて

1

MapView.removeAll()がマップからすべてのレイヤを削除します。それはあなたが望むものではありません。

代わりにMapViewのレイヤーとタイプGraphicsLayerの各レイヤー(ただしタイプはArcGISFeatureLayerではありません)をループしてみてください。レイヤーを削除するか、レイヤーからグラフィックスを削除してください。

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