我正在尝试使用GeoTools从LuciadFusion wfs服务器检索数据,但是在查找有关如何实现目标的示例时遇到了麻烦。
我的想法是,我正在跟踪移动中的东西,并希望从移动中的物体所进入的区域中检索地图数据(特征),然后计算距离(例如到最近的道路,最近的湖滨海岸的距离)。
我想获得这些功能,然后将它们放入SpatialIndexFeatureCollection(保留在内存中以便快速访问,因为我正在跟踪多个移动的对象),在这里我可以查询自己想知道的内容。
到目前为止,我正在查询我发现的一些随机wfs服务器数据:http://ogc.bgs.ac.uk/digmap625k_gsml32_insp_gs/wfs?。我能够读取功能,并从构建我的SpatialIndexFeatureCollection的一种类型名称中读取:
String url = "http://ogc.bgs.ac.uk/digmap625k_gsml32_insp_gs/wfs?";
Map connectionParameters = new HashMap();
connectionParameters.put("WFSDataStoreFactory:GET_CAPABILITIES_URL", url)
connectionParameters.put(WFSDataStoreFactory.TIMEOUT.key, 100000);
WFSDataStoreFactory dsf = new WFSDataStoreFactory();
try {
WFSDataStore dataStore = dsf.createDataStore(connectionParameters);
for(String s : dataStore.getTypeNames()){
System.out.println(s);
}
SimpleFeatureSource source = dataStore.getFeatureSource("test:uk_625k_mapped_feature");
SimpleFeatureCollection fc = source.getFeatures();
System.out.println(fc.getBounds());
SpatialIndexFeatureCollection index = new SpatialIndexFeatureCollection();
fc.accepts(new FeatureVisitor() {
@Override
public void visit(Feature feature) {
SimpleFeature simpleFeature = (SimpleFeature) feature;
Geometry geom = (MultiPolygon) simpleFeature.getDefaultGeometry();
if(geom != null) {
Envelope env = geom.getEnvelopeInternal();
if(!env.isNull()) {
index.add(simpleFeature);
}
}
}
}, new NullProgressListener());
catch (FactoryException e) {
aLog.error("", e);
}
运行它会打印:
gsml:MappedFeature
gsmlgu:GeologicUnit
测试:uk_625k_mapped_feature
ReferencedEnvelope [-132576.7891571155:743466.624998733,
-15669.960592884949:1248847.1762802668]
但是,设置完我自己的WFS服务器后,它将包含更多类型名称,每个类型名称描述一个区域的FX道路或湖泊。
并适用于许多地区。
如何获得与定义区域(边界框BB)相关的类型名称,或者如果可能的话,甚至仅获得BB覆盖的类型名称中的要素?
其次,从上述示例中提取数据时,所有功能均位于错误的CoordinateReferenceSystem中-如何强制将其设为EPSG:4326?
谢谢!
最佳答案
首先要澄清术语:TypeName
是数据或架构类型的标识符。Feature
是具有位置和属性的实际数据。
要限制返回的功能数量,您需要使用Query
object。这使您可以指定Filter
来限制返回的功能。对于WFSDatastore(和大多数其他),它将转换为基础存储在此处理解和处理的内容。您可以通过各种方式创建功能,包括FilterFactory
,但最简单的方法是使用ECQL
,它允许您直接编写更多人类可以理解的过滤器。有一个helpful tutorial here。
Filter filter = ECQL.toFilter("BBOX(the_geom, 500000, 700000, 501000, 701000)");
query.setFilter(filter);
query.setMaxFeatures(10);
SimpleFeatureCollection fc = source.getFeatures(query);
至于重新投影,WFS不会直接处理它,但是您可以使用
ReprojectingFeatureCollection
来包装结果。ReprojectingFeatureCollection rfc = new ReprojectingFeatureCollection(fc, DefaultGeographicCRS.WGS84);
除非您期望有很多无效的多边形,否则您应该能够使用以下方法构建空间索引集合:
SpatialIndexFeatureCollection index = new SpatialIndexFeatureCollection(fc.getSchema());
index.addAll(fc);