Ahmed cherif
Ahmed cherif

Reputation: 11

can't get contents in FeaturesCollection with geoTools

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

Upvotes: 1

Views: 834

Answers (1)

Ian Turton
Ian Turton

Reputation: 10976

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

Upvotes: 0

Related Questions