Java 使用地理工具通过WFS检索地图数据
我试图使用GeoTools从LuciadFusion wfs服务器检索数据,但在寻找如何实现目标的示例时遇到了困难 我的想法是,我在跟踪移动的东西,并希望从我移动的东西移动到的区域检索地图数据(特征),然后计算距离(比如离最近的道路多远,离最近的湖岸有多远) 我想获取这些特征,将它们放入SpatialIndexFeatureCollection(保存在内存中以便快速访问,因为我正在跟踪多个移动对象),在那里我可以查询我想知道的东西 到目前为止,我正在查询一些随机的wfs服务器,其中包含数据:?。我能够从构建SpatialIndexFeatureCollection的其中一个类型名中读取这些功能:Java 使用地理工具通过WFS检索地图数据,java,geotools,Java,Geotools,我试图使用GeoTools从LuciadFusion wfs服务器检索数据,但在寻找如何实现目标的示例时遇到了困难 我的想法是,我在跟踪移动的东西,并希望从我移动的东西移动到的区域检索地图数据(特征),然后计算距离(比如离最近的道路多远,离最近的湖岸有多远) 我想获取这些特征,将它们放入SpatialIndexFeatureCollection(保存在内存中以便快速访问,因为我正在跟踪多个移动对象),在那里我可以查询我想知道的东西 到目前为止,我正在查询一些随机的wfs服务器,其中包含数据:?。
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:地质学家
- 测试:uk_625; u映射_功能
- 参考信封[-132576.7891571155:743466.624998733, -15669.960592884949:1248847.1762802668]
谢谢 首先要澄清术语:
TypeName
是一种数据类型或模式的标识符功能
是具有位置和属性的实际数据段李>
要限制返回的功能的数量,您需要使用。这允许您指定一个限制返回的功能。对于WFSDatastore(以及其他大多数),它被转换为底层存储理解和处理的内容。您可以通过各种方式创建功能,包括FilterFactory
,但最简单的方法是使用ECQL
,它允许您直接编写更多人类可以理解的过滤器。有一个问题
至于重投影,WFS不会直接处理这个问题,但您可以使用
ReprojectingFeatureCollection rfc = new ReprojectingFeatureCollection(fc, DefaultGeographicCRS.WGS84);
除非您希望看到大量无效多边形,否则您应该能够使用以下方法构建空间索引集合:
SpatialIndexFeatureCollection index = new SpatialIndexFeatureCollection(fc.getSchema());
index.addAll(fc);
非常感谢您的回答!:-)我们的WFS服务器可能有问题,我想要获取源对象,我仍然需要说“SimpleFeatureSource=dataStore.getFeatureSource(“test:uk_625; k_mapped_feature”);”因此知道我要检查的类型名,对吗?当我在自己的服务器上执行此操作时,会得到一个“java.io.IOException:Schema”\u 772ced6e\u 45\u 54b5\u 45\u 45\u bb01\u 45\u a50b9179f1ecWorldType“不存在”。(是的,类型名似乎也很随机)。。。在原始问题中所述的wfs服务器上,我没有看到此模式错误。如果我将浏览器指向“”,我确实会得到一些充满数据的xml。在使用geotools时,是否需要模式来访问此数据?或者我可以读取数据吗(如果试图安装Luciad服务器的人不知道如何将模式设置到位)?再次感谢你的帮助,真的很感激!您确实需要知道要获取的featureCollection的typeName,您可以直接读取getCapabilities响应以查看可用内容。GeoTools应该自动获取并计算模式。因此,我成功地从我的服务器创建了一个WFSDataStore,并且能够列出所有的类型名。但是当试图说dataStore.getFeatureSource(aTypeName)时;它失败,因为“java.io.IOException:Schema'\u 772ced6e\u 45\u 54b5\u 45\u 4295\u 45\u bb01\u 45\u a50b9179f1ecWorldType'不存在。”-异常。我做错了什么?你用的字体名是什么?
SpatialIndexFeatureCollection index = new SpatialIndexFeatureCollection(fc.getSchema());
index.addAll(fc);