2017-03-01 5 views
1

私は、(他のデータの中でも)地理空間ポイントデータを含む大量のドキュメントを持っています。私はポリゴンを含む別の大きなコレクションを持っています(他のデータの中でも)。ravendbで空間結合を実行する方法

ポイントデータが特定のプロパティを持つポリゴンに含まれているかどうかでクエリをフィルタリングしたいのですが、

RavenDBでこれを行うことができますか?その場合はどうすればよいですか?私が考えた

もの:

私はインデックスのみをマッピング(および/または軽減)ので、私は、インデックスでこれを行うことができるか見ることができないので、私は別のもののコレクションを照会することはできません。

ポリゴンのセットによるクエリーがすばやくクエリーの長さを意味のあるクエリーの長さの制限を超えてしまうため、クエリーを作成してRavenの結果キャッシングに依存することはできません。

答えて

0

RavenDBでは、空間データを扱うためのインデックスを定義できます。 -

public class EventWithWKT 
{ 
    public string Id { get; set; } 

    public string Name { get; set; } 

    public string WKT { get; set; } 
} 

私はその後

POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10)) 

あなたができるようなものを意味ポリゴンWKTによって (>ウェルノウンテキストマークアップhttps://en.wikipedia.org/wiki/Well-known_text WKT): あなたはWKTのように定義空間ポリゴンとの文書を持っていると仮定しましょう

public class EventsWithWKT_ByNameAndWKT : AbstractIndexCreationTask<EventWithWKT> 
{ 
    public EventsWithWKT_ByNameAndWKT() 
    { 
     Map = events => from e in events 
         select new 
         { 
          Name = e.Name, 
          WKT = e.WKT 
         }; 

     Spatial(x => x.WKT, options => options.Geography.Default()); 
    } 
} 

インデックス定義の "Spatial"メソッドを呼び出すことによって、次のようにWKTを処理するインデックスを定義します。 RavenDBは特別な列を作成し、空間クエリを使用してクエリを実行することができます。

は今、特定のポイントがたりない、次のクエリで行うことができる書類のポリゴン内にあるかどうかでフィルタリング:定義し、空間データを使用するための唯一の方法ではありません

var results = session 
    .Query<EventWithWKT, EventsWithWKT_ByNameAndWKT>() 
    .Customize(x => x.RelatesToShape("WKT", "POINT (30 10)", SpatialRelation.Within)) 
    .ToList(); 

を。あなたは、これらのドキュメントの記事でRavenDB空間インデックスについての詳細を読むことができます:

+0

私は、ある程度、空間インデックスを認識しています。私の質問は、単一の単純なポリゴンでポイントデータを照会する方法ではありません。問題はむしろです:ポイント数とポリゴン数の両方が大きい場合(あるいは非常に複雑なポリゴンが1つの場合)、ポリゴン内のポイントをどのように見つけることができますか?限界。 – AdamAL

+0

セッションごとの制限をバイパスすることについて話している場合は、遅延クエリを実行することがバイパスする方法の1つです(https://ravendb.net/docs/article-page/3.5/csharp/client-api/session/)。クエリ/実行方法 - クエリ - 遅れて)。レイジークエリは1つの要求にグループ化され、サーバー上で並列に処理されます – Michael

+0

また、MULTIPOINTとMULTIPOLYGONも同様に動作します。それぞれの「参加」のためにいくつのポイントとポリゴンを持つことができますか?また、この種の質問はRavenDBのメーリングリストに適しています。なぜなら、議論が必要かもしれないからです(https://groups.google.com/forum/#!forum/ravendb) – Michael

関連する問題