1

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

J. Scott Elblein
  • 3,179
  • 11
  • 44
  • 72

1 Answers1

0

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();
    }
Ian Turton
  • 8,054
  • 1
  • 26
  • 42
  • when I use Iterator, I get always error like this: ; nested exception is java.lang.NoSuchMethodError: Org.geotools.factory.CommonFactoryFinder.getFilterFactory2(Lorg/geotools/factory/Hints;)Lorg/opengis/filter/FilterFactory2;] – Ahmed cherif Jan 25 '20 at 21:42
  • that's an unrelated error - please add the actual code you are using to the question – Ian Turton Jan 26 '20 at 10:24
  • I fixed the versions of different modules to 21.1 and when i changed gt-wfs to gt-wfs-ng i can't connected to dataStore. I have an error. – Ahmed cherif Jan 26 '20 at 14:50
  • I am used your code and i have the same issue, i think i have something wrong in my POM.xml. thanks for your help. – Ahmed cherif Jan 26 '20 at 15:42
  • use a property geotools.version defined at the top and then use ${geotools.version} for **all** the geotools dependencies so they all match! – Ian Turton Jan 26 '20 at 15:45