我试图通过在GeoServer中执行以下代码来获取某个特定图层的详细信息,并且必须执行一些CQL操作。
String getCapabilities = "http://localhost:8080/geoserver/wfs?service=wfs&version=1.1.0&request=DescribeFeatureType&typeNames=districtwpc:ernakulam";
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();
}
但是我得到了这个异常。
org.geotools.data.DataSourceException: Expected {http://www.opengis.net/wfs}WFS_Capabilities but was http://www.w3.org/2001/XMLSchema#schema
at org.geotools.data.wfs.WFSDataStoreFactory.parseCapabilities(WFSDataStoreFactory.java:557)
at org.geotools.data.wfs.WFSDataStoreFactory.createDataStore(WFSDataStoreFactory.java:477)
at com.hamdhan.geotooltest.controller.LayerController.TestGeoToolsRestAPI(LayerController.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
GeoTools WFSDataStoreFactory
希望你传递进来的URL指向的是 getCapabilities
的请求。你把它搞糊涂了,因为你传入了一个 describeFeature
请求,该请求返回的是一个功能集合的模式,而不是一个能力文档。
只需更改
String getCapabilities = "http://localhost:8080/geoserver/wfs?service=wfs&version=1.1.0&request=DescribeFeatureType&typeNames=districtwpc:ernakulam";
到
String getCapabilities = "http://localhost:8080/geoserver/wfs?service=wfs&version=1.1.0&request=getCapabilities";
还有几点。10000000
是一个很长的超时时间,如果遇到离线的机器,会大大降低你的程序速度。其次,我注意到你的程序叫 TestGeoToolsRestAPI
- 只是要注意的是,(此时)OGC服务,如WFS,在任何方面都不是RESTful的。例如,即使服务出错,你也会得到HTTP 200的响应。