java GeoTools: сортировка FeatureIterator по области объекта - PullRequest
1 голос
/ 21 февраля 2020

Мне нужно перебрать уже отсортированную SimpleFeatureCollection по их геометрии ie.

Я понял, что класс c SimpleFeatureIterator приходит несортированный и SortedFeatureIterator (итератор SimpleFeatureIterator, схема SimpleFeatureType, SortBy [] sortBy, int maxFeatures) существует объект, который я пытался использовать.

Для этого объекта sortBy требуется PropertyName, которое должно быть сгенерированным FilterFactory, я думаю. Вот моя проблема: я не могу найти, как установить это свойство для запуска с функцией. Я обнаружил, что org.opengis.filter.expression.Function существует, например, org.opengis.filter.expression.Function.AreaFunction . Но так как PropertyName и AreaFunction оба расширяют интерфейс org.opengis.filter.expression.Expression , я не могу найти способ поместить функцию в SortBy объект. Я попробовал пару вещей и посмотрел, но не нашел решения.

Есть идеи? Имею ли я правильное мышление, и я пропустил методы спасения? Большое спасибо за вашу помощь.

PS: Площадь не является атрибутом моей коллекции (хотя об этом для грязного хакерского решения, но я стараюсь их избегать ...)

Пример кода:

       SimpleFeatureIterator sfcIt = sfc.features();   
       FilterFactory2 ff = FeatureUtilities.DEFAULT_FILTER_FACTORY;
       Function function = new AreaFunction();
           //first intention
       SortBy[] s = {ff.sort(function.toString(), SortOrder.ASCENDING)};
       //second intention
       Expression expr = ff.function(function.toString(), ff.property("the_geom"));
       //desperate intention
       final PropertyName propertyName = (PropertyName) function; //utopic
       final PropertyName propertyName = ff.arithmeticOperators(true, function); //that isn't the same function object... 

       SortBy[] sort = { new SortByImpl(expr, SortOrder.ASCENDING) };      
       SortBy[] sort = { new SortByImpl(propertyName, SortOrder.ASCENDING) };      

       SortedFeatureIterator sfcIter = new SortedFeatureIterator(sfcIter, sfc.getSchema(), sort, sfc.size());



Спасибо за ваше мнение! Максим Коломб

1 Ответ

0 голосов
/ 22 февраля 2020

К сожалению, SortBy определено только для того, чтобы принимать имя свойства, поэтому нет возможности добавить туда функцию. Это связано с тем, что объект SortBy взят из стандарта WFS и там он ограничен именем свойства. Нет никаких причин, по которым вы не могли бы расширить код для обработки выражений (мы расширили множество других частей спецификаций OG C, чтобы удовлетворить наши потребности.

Но для быстрой сортировки по областям без явного добавления атрибута области к вашим объектам вы можете сделать что-то вроде:

    Unit<Area> sq_mile = USCustomary.MILE.multiply(USCustomary.MILE).asType(Area.class);
    File file = new File("../../data/states.shp");
    FileDataStore store = FileDataStoreFinder.getDataStore(file);
    SimpleFeatureSource featureSource = store.getFeatureSource();
    SortedMap<Quantity<Area>, SimpleFeature> index = new TreeMap<>();
    try(SimpleFeatureIterator itr = featureSource.getFeatures().features()){
      while (itr.hasNext()) {
        SimpleFeature feature = itr.next();
        Quantity<Area> area = calcArea(feature);
        index.put(area, feature);
      }
    }

    for (Entry<Quantity<Area>, SimpleFeature> entry : index.entrySet()) {
      Quantity<Area> quantity = entry.getKey().to(sq_mile);
      String out = String.format("%-30s % 8.0f %s", entry.getValue().getAttribute("STATE_NAME"), quantity.getValue(),
          quantity.getUnit());
      System.out.println(out);
    }

, что дает:

District of Columbia                 66 mi²
Rhode Island                       1045 mi²
Delaware                           2053 mi²
Connecticut                        4977 mi²
New Jersey                         7502 mi²
Massachusetts                      8178 mi²
New Hampshire                      9262 mi²
Vermont                            9604 mi²
Maryland                           9740 mi²
West Virginia                     24214 mi²
South Carolina                    30849 mi²
Maine                             32141 mi²
Indiana                           36378 mi²
Virginia                          39841 mi²
Kentucky                          40333 mi²
Ohio                              41193 mi²
Tennessee                         42098 mi²
Pennsylvania                      45405 mi²
Louisiana                         45824 mi²
Mississippi                       47662 mi²
New York                          48546 mi²
North Carolina                    49073 mi²
Alabama                           51685 mi²
Arkansas                          52889 mi²
Florida                           55839 mi²
Wisconsin                         56136 mi²
Iowa                              56238 mi²
Illinois                          56311 mi²
Michigan                          57901 mi²
Georgia                           58674 mi²
Washington                        67336 mi²
Missouri                          69808 mi²
Oklahoma                          70032 mi²
North Dakota                      70815 mi²
South Dakota                      77208 mi²
Nebraska                          77340 mi²
Kansas                            82205 mi²
Idaho                             83384 mi²
Minnesota                         84498 mi²
Utah                              84840 mi²
Oregon                            97150 mi²
Wyoming                           97891 mi²
Colorado                         104100 mi²
Nevada                           110637 mi²
Arizona                          113695 mi²
New Mexico                       121769 mi²
Montana                          147374 mi²
California                       158017 mi²
Texas                            264714 mi²
...