Как отфильтровать SpatialIndexFeatureCollection?

При просмотре документации для Geotools FeatureCollection, подраздел "Параметры производительности" отмечает:

TreeSetFeatureCollection: традиционная реализация TreeSet, используемая по умолчанию.

Обратите внимание, что это плохо работает с пространственными запросами, так как содержимое не индексируется.

Позже он рекомендует SpatialIndexFeatureCollection для более быстрых запросов:

SpatialIndexFeatureCollection: использует пространственный индекс для удержания содержимого для быстрого визуального отображения в MapLayer; Вы не можете добавить больше контента в эту коллекцию функций после ее использования.

DataUtilities.source(featureCollection) обернет SpatialIndexFeatureCollection в SpatialIndexFeatureSource, который может использовать пространственный индекс.

Пример приведен ниже:

final SimpleFeatureType TYPE = 

DataUtilities.createType("location","geom:Point,name:String");
WKTReader2 wkt = new WKTReader2();

SimpleFeatureCollection collection = new SpatialIndexFeatureCollection();
collection.add( SimpleFeatureBuilder.build( TYPE, new Object[]{ wkt.read("POINT(1,2)"), "name1"} ));
collection.add( SimpleFeatureBuilder.build( TYPE, new Object[]{ wkt.read("POINT(4,4)"), "name1"} ));

// Fast spatial Access
SimpleFeatureSource source = DataUtilities.source( collection );
SimpleFeatureCollection features = source.getFeatures( filter );

Помимо невозможности скомпилировать этот код (SimpleFeatureCollection является интерфейсом и не содержит члена add), код для SpatialIndexFeatureSource.getFeatures(Filter) напрямую звонит SpatialIndexFeatureCollection.subCollection(Filter) который определяется как

public SimpleFeatureCollection subCollection(Filter filter) {
    throw new UnsupportedOperationException();
}

Github

Вот пример моей собственной попытки использовать это

  FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2();

  SimpleFeatureCollection answers = getAnswers();
  SpatialIndexFeatureCollection collection = new SpatialIndexFeatureCollection();
  collection.addAll(answers);
  SimpleFeatureSource source = DataUtilities.source( collection );

  SimpleFeatureCollection gridCollection = getGridCollection();
  SimpleFeatureIterator iter = gridCollection.features();
  while(iter.hasNext()) {
    SimpleFeature grid = iter.next();
    Geometry gridCell = (Geometry) grid.getDefaultGeometry();
    Filter gridFilter = ff.intersects(ff.property("geometry"), ff.literal(gridCell));

    SimpleFeatureCollection results = source.getFeatures(combinedFilter);
  }

Неудивительно, что это приводит к UnsupportedOperationException

Я не смог заставить этот пример работать и очень хотел бы воспользоваться пространственной индексацией. Как я должен использовать SpatialIndexFeatureCollection похож на приведенный выше пример?

1 ответ

SpatialIndexFeatureCollection теперь реализует метод subCollection. Смотрите пиар здесь. У меня не было возможности зарегистрировать изменения, но будущие выпуски теперь будут работать так, как вы ожидали.

Другие вопросы по тегам