can't get contents in FeaturesCollection with geoTools

734 Views Asked by At

I am working with geoTools Library. My goal is to return features from geoServer. I am connected to dataStore correctly but i can't receive the content of collection features.

When i try:

SimpleFeatureCollection collection = featureSource.getFeatures();

In degugging my code, the response of collectionFeature contains cashedSize = -1 and the typeContent contains the corrects propertyNames, but without data of features.

I think the issue is in the dependencies but i can't fix it.

This is my code:

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;             `

And my 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>

Thanks

1

There are 1 best solutions below

5
Ian Turton On

A feature collection can return -1if counting the number of features is too expensive. This depends on the datastore e.g. Postgis can count quickly, geojson can't as it has to read and process the whole file.

Try to use the collection by getting an iterator from it.

Update

Looking more closely at your pom.xml shows one other issue:

    <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>

You are mixing GeoTools' versions which will probably be bad, also you may want to use the newer gt-wfs-ng module instead of the gt-wfs module.

Update 2

I use the following code with my local GeoServer with no issue.

    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();
    }