2017-06-16 16 views
1

GeoToolsを使用してLuciadFusion wfsサーバーからデータを取得しようとしていますが、目標を達成する方法の例がわかりません。 アイデアは私が動くものを追跡していて、動いている音が動いているエリアから地図データ(機能)を取得し、次に距離を計算したいと思うということです(最寄りの道路から最寄りの湖岸沿岸までの距離など)。 私は複数の移動オブジェクトを追跡しているので、SpatialIndexFeatureCollection(高速アクセス用にメモリに保存されています)に配置して、私が知りたいものを照会できるようにしたいと考えています。GeoToolsを使用してWFS経由で地図データを取得

これまでのところ、私はデータで見つかったいくつかのランダムな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)に関連するタイプ名を取得するにはどうすればよいでしょうか?

第2に、上記の例からデータを抽出すると、すべてのフィーチャが間違ったCoordinateReferenceSystemにあります。どのようにしてEPSG:4326にする必要がありますか?

ありがとうございます!

答えて

1

用語を明確にする:まず

  1. TypeNameデータ又はスキーマタイプの識別子です。
  2. Featureは、位置と属性を持つ実際のデータです。

返される機能の数を制限するには、Query objectを使用する必要があります。これにより、返される機能を制限するためにFilterを指定することができます。 WFSDatastore(および他のほとんどの場合)の場合は、基になるストアがそこで理解して処理するものに変換されます。 FilterFactoryを含むさまざまな方法でフィーチャを作成できますが、最も理解しやすいフィルタを直接書くことができるECQLを使用するのが最も簡単です。 helpful tutorial hereがあります。 WFSは、それを直接扱うものではありませんが、あなたの結果をラップするReprojectingFeatureCollectionを使用することができます再投影用として

Filter filter = ECQL.toFilter("BBOX(the_geom, 500000, 700000, 501000, 701000)"); 
    query.setFilter(filter); 
    query.setMaxFeatures(10); 
    SimpleFeatureCollection fc = source.getFeatures(query); 

ReprojectingFeatureCollection rfc = new ReprojectingFeatureCollection(fc, DefaultGeographicCRS.WGS84); 

無効なポリゴンの多くを期待している場合を除き、あなたが使用して空間インデックス付きのコレクションを構築することができるはずです。

SpatialIndexFeatureCollection index = new SpatialIndexFeatureCollection(fc.getSchema()); 
index.addAll(fc); 
+0

あなたの答えをありがとうございました! :-) 私たちのWFSサーバーで何か問題が起きている可能性があります。私は_source_オブジェクトを取得するために、まだ と言う必要があります。 'SimpleFeatureSource source = dataStore.getFeatureSource( "test:uk_625k_mapped_feature");'したがって、私が調べたいtypeNameを知っていますか? 私自身のサーバでこれを行うと、 'java.io.IOExceptionが発生します。スキーマ' _772ced6e_45_54b5_45_4295_45_bb01_45_a50b9179f1ecWorldType 'は存在しません。 (ええとtypenameもかなりランダムに見えます)。 ... – Mars

+0

元の質問に記載されているwfsサーバーでこのスキーマエラーが表示されません。 私のブラウザで「http://172.20.6.150:8085/LuciadFusion/wfs?REQUEST=GetFeature&SERVICE=WFS&VERSION=1.1.0&TYPENAME=_772ced6e_45_54b5_45_4295_45_bb01_45_a50b9179f1ecWorldType」と指摘されていれば、いくつかのXMLデータがあります。 geotoolsを使用しているときに、このデータにアクセスするためのスキーマが必要ですか?とにかくデータを読み込むことはできますか(Luciadサーバーをセットアップしようとしている人はスキーマを取得する方法を理解できません)。 もう一度おねがいします - ヘルプは本当に感謝しています! – Mars

+0

あなたがフェッチしたいfeatureCollectionのtypeNameを知る必要がある場合は、getCapabilitiesレスポンスを直接読んで利用可能なものを確認することができます。 GeoToolsは自動的にスキーマを取得して把握する必要があります。 –

関連する問題