Как отфильтровать 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();
}
Вот пример моей собственной попытки использовать это
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. Смотрите пиар здесь. У меня не было возможности зарегистрировать изменения, но будущие выпуски теперь будут работать так, как вы ожидали.