2012-03-05 3 views
0

Я хочу сделать вложенный цикл над SimpleFeatureCollection. Для каждой точки мне нужно найти ее neihgbours и обработать их.Geotools вложенная петля поверх SimpleFeatureCollection

Однако SimpleFeatureCollection позволяет использовать только итераторы, но не доступ к массиву, что делает невозможным (по крайней мере, так кажется) реализовать вложенный цикл. Этот итератор не имеет метода previous(), поэтому я не могу его сбросить и использовать два итератора над одной и той же коллекцией.

Так что мне было интересно, есть ли другой способ доступа к функции по его индексу.

Благодаря

ответ

0

В целом, можно иметь несколько итераторов над коллекцией, при условии, что они просто читать, не изменяя коллекцию. См. this question.

Я надеюсь, что SimpleFeatureCollection не является исключением из правила!

Для вложенного цикла вы можете просто создать другой итератор для каждого прогона через внутренний цикл; вам не нужно «перезагружать» предыдущий.

+0

Спасибо, ДНК. Дело в том, что мне действительно нужно изменить эту коллекцию (мне нужно отметить уже обработанные точки, изменив определенное свойство). Я как-то понял, как делать то, что я хочу, это просто выглядит так уродливо. В принципе, я создаю новую коллекцию и перезаписываю итератор. Спасибо, во всяком случае – porter

+0

Просто зарегистрируйте признаки функций, которые вы уже нажали в HashSet . Примечание. GeoTools структурирован таким образом, чтобы вы могли работать с огромными объемами данных, если знаете, что работаете с небольшими объемами данных, скопируйте их в список . –

2

Существует пример кода здесь: http://docs.geotools.org/latest/userguide/library/main/collection.html#join

Он показывает, как гнездо петли:

void polygonInteraction() { 
    SimpleFeatureCollection polygonCollection = null; 
    SimpleFeatureCollection fcResult = null; 
    final SimpleFeatureCollection found = FeatureCollections.newCollection(); 

    FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(); 
    SimpleFeature feature = null; 

    Filter polyCheck = null; 
    Filter andFil = null; 
    Filter boundsCheck = null; 

    String qryStr = null; 

    SimpleFeatureIterator it = polygonCollection.features(); 
    try { 
     while (it.hasNext()) { 
      feature = it.next(); 
      BoundingBox bounds = feature.getBounds(); 
      boundsCheck = ff.bbox(ff.property("the_geom"), bounds); 

      Geometry geom = (Geometry) feature.getDefaultGeometry(); 
      polyCheck = ff.intersects(ff.property("the_geom"), ff.literal(geom)); 

      andFil = ff.and(boundsCheck, polyCheck); 

      try { 
       fcResult = featureSource.getFeatures(andFil); 
       // go through results and copy out the found features 
       fcResult.accepts(new FeatureVisitor() { 
        public void visit(Feature feature) { 
         found.add((SimpleFeature) feature); 
        } 
       }, null); 
      } catch (IOException e1) { 
       System.out.println("Unable to run filter for " + feature.getID() + ":" + e1); 
       continue; 
      } 

     } 
    } finally { 
     it.close(); 
    } 
} 

Если вы хотите, чтобы игнорировать некоторые функции, которые вы уже посетили, и пропустить содержание ::

HashSet<FeatureId> skip = new HashSet<FeatureId>(); 
... 
if(skip.contains(feature.getId())) continue;