如何在ravendb

时间:2017-03-01 12:53:16

标签: join ravendb spatial

我有大量包含地理空间点数据的文档(以及其他数据)。我有另外一大堆包含多边形的文档(以及其他数据)。

我想通过点是否包含在具有特定属性的任何多边形中来过滤点数据的查询。

我可以使用RavenDB执行此操作吗?如果是,请执行此操作?

我想到的事情:

我无法看到如何使用索引执行此操作,因为索引仅映射(和/或减少),因此我无法查询另一个集合。

我不能只进行查询并依赖Raven的结果缓存,因为通过多边形集查询会很快使查询长度超过任何合理的查询长度限制。

1 个答案:

答案 0 :(得分:0)

在RavenDB中,您可以定义索引来处理空间数据。 假设您有一个空间多边形定义为WKT的文档: (WKT - >熟知的文字标记https://en.wikipedia.org/wiki/Well-known_text

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

    public string Name { get; set; }

    public string WKT { get; set; }
}

通过多边形WKT,我的意思是

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

然后你可以像这样定义处理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());
    }
}

通过调用&#34; Spatial&#34;在索引定义中,RavenDB创建了一个特殊列,然后可以使用空间查询进行查询。

现在可以使用以下查询来过滤某个点是否在文档的多边形内:

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

这不是定义和使用空间数据的唯一方法。您可以在这些文档文章中阅读有关RavenDB空间索引的更多信息: