【问题标题】:java GeoTools : Sort a FeatureIterator by feature's areajava GeoTools:按特征区域对 FeatureIterator 进行排序
【发布时间】:2020-06-05 21:33:18
【问题描述】:

我需要按他们的几何区域遍历已排序的 SimpleFeatureCollection

我发现经典的 SimpleFeatureIterator 未排序,并且存在一个 SortedFeatureIterator( SimpleFeatureIterator iterator, SimpleFeatureType schema,SortBy[] sortBy, int maxFeatures) 对象,我试过了使用。

这个 sortBy 对象需要一个 PropertyName,我猜它必须由 FilterFactory 生成。 这是我的问题:我找不到如何设置此属性以使用函数运行。我发现org.opengis.filter.expression.Function是存在的,比如org.opengis.filter.expression.Function.AreaFunction比较合适。但是由于 PropertyNameAreaFunction 都扩展了 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());



感谢您的意见! 马克西姆·科伦布

【问题讨论】:

    标签: java geotools filterfactory


    【解决方案1】:

    不幸的是,SortBy 被定义为仅采用属性名称,因此无法在其中添加函数。这是因为 SortBy 对象来自 WFS 标准,因此它被限制为属性名称。没有理由不能扩展代码来处理那里的表达式(我们已经扩展了 OGC 规范的许多其他部分以满足我们的需求。

    但是为了快速按区域排序而不显式向您的要素添加区域属性,您可以执行以下操作:

        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²
    

    【讨论】:

    • 您好,感谢您的回答!我想实现它,但我不了解每个对象之间的类型和关系。非常感谢您的解决方案,这比我所做的要好得多!干杯马克斯
    • 你能不能edit你的问题来解释你需要哪些类型或关系
    • 好吧,我说的是抽象类 ExpressionAbstract、DefaultExpression FunctionExpressionImpl、接口 FunctionExpression 以及每种类型的函数(在我的示例中为 AreaFunction)。例如,如果我实现了通过 SortBy() 对象接受函数的机会,它应该接受哪种抽象状态?哪种方法足够通用来比较不同的功能?
    • 您需要更新 SortBy 以接受表达式而不仅仅是属性名称 - Sortby 处理比较,因此您只需要一个返回值的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2011-09-29
    相关资源
    最近更新 更多