1

我正在使用 geoTools 库。我的目标是从 geoServer 返回功能。我已正确连接到 dataStore,但我无法接收集合功能的内容。

当我尝试:

SimpleFeatureCollection collection = featureSource.getFeatures();

在调试我的代码时,collectionFeaturecontainscashedSize = -1typeContentcontains 的响应是更正的propertyNames,但没有特征数据。

我认为问题出在依赖项中,但我无法解决。

这是我的代码:

CRS.decode("EPSG:4326", true);
// URL 
StringBuilder completeUrl = new StringBuilder();
completeUrl.append(url);
completeUrl.append("/geoserver/wfs?SERVICE=wfs&version=");
completeUrl.append(version);
completeUrl.append("&REQUEST=GetCapabilities");
String getCapabilities = completeUrl.toString();
logger.info("URL" + getCapabilities);
// Connexion to WFS
Map<String, String> connectionParameters = new HashMap<String, String>();
connectionParameters.put("WFSDataStoreFactory:GET_CAPABILITIES_URL", getCapabilities); 
 connectionParameters.put("WFSDataStoreFactory:MAXFEATURES", "50");
 DataStore dataStore = DataStoreFinder.getDataStore(connectionParameters);
SimpleFeatureSource featureSource = dataStore.getFeatureSource(layer);
SimpleFeatureCollection collection = featureSource.getFeatures();   
return  collection;             `

还有我的 POM.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>


            <!-- https://mvnrepository.com/artifact/org.geotools/gt-shapefile -->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>22.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


            <!-- https://mvnrepository.com/artifact/org.geotools/gt-main -->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>21.1</version>
        </dependency>   



        <!-- https://mvnrepository.com/artifact/org.geotools/gt-cql -->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-cql</artifactId>
            <version>21.1</version>
        </dependency>

            <!-- https://mvnrepository.com/artifact/org.geotools/gt-opengis -->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-opengis</artifactId>
            <version>21.1</version>
        </dependency>   

        <!-- https://mvnrepository.com/artifact/org.geotools/gt-epsg-hsql -->
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>22.1</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.geotools/gt-wfs -->
    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-wfs</artifactId>
        <version>11.2</version>
    </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>maven2-repository.dev.java.net</id>
            <name>Java.net repository</name>
            <url>http://download.java.net/maven/2</url>
        </repository>
        <repository>
            <id>osgeo</id>
            <name>Open Source Geospatial Foundation Repository</name>
            <url>http://download.osgeo.org/webdav/geotools/</url>
        </repository>
        <repository>
            <id>opengeo</id>
            <name>OpenGeo Maven Repository</name>
            <url>http://repo.opengeo.org</url>
        </repository>
    </repositories>
</project>

谢谢

4

1 回答 1

0

如果计算特征的数量过于昂贵,则特征集合可以返回 -1。这取决于数据存储,例如 Postgis 可以快速计数,geojson 不能,因为它必须读取和处理整个文件。

尝试通过从中获取迭代器来使用该集合。

更新

更仔细地查看您的pom.xml节目另一个问题:

    <dependency>
        <groupId>org.geotools</groupId>
        <artifactId>gt-epsg-hsql</artifactId>
        <version>22.1</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/org.geotools/gt-wfs -->
<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-wfs</artifactId>
    <version>11.2</version>
</dependency>

您正在混合 GeoTools 的版本,这可能会很糟糕,您也可能想要使用较新的gt-wfs-ng模块而不是gt-wfs模块。

更新 2

我将以下代码与本地 GeoServer 一起使用,没有问题。

    String getCapabilities = "http://localhost:8080/geoserver/ows?service=wfs&version=1.1.0&request=GetCapabilities";
    Map<String, Serializable> connectionParameters = new HashMap<>();
    connectionParameters.put(WFSDataStoreFactory.URL.key, getCapabilities);
    connectionParameters.put(WFSDataStoreFactory.TIMEOUT.key, 10000000);
    WFSDataStoreFactory dsf = new WFSDataStoreFactory();
    try {
      WFSDataStore dataStore = dsf.createDataStore(connectionParameters);
      String types[] = dataStore.getTypeNames();
      for (int i = 0; i < types.length; i++) {
        System.out.println(types[i]);
        String name = types[i];
        Query query = new Query(name);
        SimpleFeatureSource source = dataStore.getFeatureSource(name);
        SimpleFeatureType schema = source.getSchema();
        // System.out.println(schema);
        query.setMaxFeatures(10);
        SimpleFeatureCollection fc = source.getFeatures(query);
        try (SimpleFeatureIterator itr = fc.features()) {
          while (itr.hasNext()) {
            SimpleFeature sf = itr.next();
            System.out.println(sf);
          }
        }
      }
    } catch (IOException ex) {
      ex.printStackTrace();
    }
于 2020-01-25T19:13:10.950 回答