Reputation: 11
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
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.
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.
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