Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用地理工具通过WFS检索地图数据_Java_Geotools - Fatal编程技术网

Java 使用地理工具通过WFS检索地图数据

Java 使用地理工具通过WFS检索地图数据,java,geotools,Java,Geotools,我试图使用GeoTools从LuciadFusion wfs服务器检索数据,但在寻找如何实现目标的示例时遇到了困难 我的想法是,我在跟踪移动的东西,并希望从我移动的东西移动到的区域检索地图数据(特征),然后计算距离(比如离最近的道路多远,离最近的湖岸有多远) 我想获取这些特征,将它们放入SpatialIndexFeatureCollection(保存在内存中以便快速访问,因为我正在跟踪多个移动对象),在那里我可以查询我想知道的东西 到目前为止,我正在查询一些随机的wfs服务器,其中包含数据:?。

我试图使用GeoTools从LuciadFusion wfs服务器检索数据,但在寻找如何实现目标的示例时遇到了困难

我的想法是,我在跟踪移动的东西,并希望从我移动的东西移动到的区域检索地图数据(特征),然后计算距离(比如离最近的道路多远,离最近的湖岸有多远)

我想获取这些特征,将它们放入SpatialIndexFeatureCollection(保存在内存中以便快速访问,因为我正在跟踪多个移动对象),在那里我可以查询我想知道的东西

到目前为止,我正在查询一些随机的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:地质学家
  • 测试:uk_625; u映射_功能
  • 参考信封[-132576.7891571155:743466.624998733, -15669.960592884949:1248847.1762802668]
然而,当我自己的WFS服务器安装好后,它将包含更多的类型名称,每个类型名称描述一个地区的fx道路或湖泊。 在许多领域

我如何获取与定义区域(边界框BB)相关的类型名,或者如果可能的话,甚至可能仅获取BB覆盖的类型名中的特征

第二,当从上面的例子中提取数据时,所有的特征都在一个错误的坐标引用系统中-我如何强制它为EPSG:4326


谢谢

首先要澄清术语:

  • 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);