Join 如何在ravendb中执行空间连接

Join 如何在ravendb中执行空间连接,join,ravendb,spatial,Join,Ravendb,Spatial,我收集了大量包含地理空间点数据(以及其他数据)的文档。我有另一个包含多边形(以及其他数据)的大型文档集合 我想通过点是否包含在任何具有特定属性的多边形中来过滤对点数据的查询 我可以用RavenDB做这个吗?如果可以,怎么做 我想的事情: 我不知道如何使用索引实现这一点,因为索引只映射(和/或减少),所以我无法逐个查询一个集合 我不能只进行查询并依赖Raven的结果缓存,因为通过多边形集进行查询会很快使查询长度超过任何合理的查询长度限制。在RavenDB中,您可以定义索引来处理空间数据。 假设您有

我收集了大量包含地理空间点数据(以及其他数据)的文档。我有另一个包含多边形(以及其他数据)的大型文档集合

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

我可以用RavenDB做这个吗?如果可以,怎么做

我想的事情:

我不知道如何使用索引实现这一点,因为索引只映射(和/或减少),所以我无法逐个查询一个集合


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

在RavenDB中,您可以定义索引来处理空间数据。 假设您有一个定义为WKT的空间多边形文档: (WKT-->众所周知的文本标记)

我说的多边形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());
    }
}
具有kt_byname和wkt:AbstractIndexCreationTask的公共类事件
{
公共活动,按名称和WKT()
{
Map=events=>来自事件中的e
选择新的
{
Name=e.Name,
WKT=e.WKT
};
Spatial(x=>x.WKT,options=>options.Geography.Default());
}
}
通过调用索引定义中的“Spatial”方法,RavenDB创建了一个特殊的列,然后可以使用空间查询来查询该列

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

var results = session
    .Query<EventWithWKT, EventsWithWKT_ByNameAndWKT>()
    .Customize(x => x.RelatesToShape("WKT", "POINT (30 10)", SpatialRelation.Within))
    .ToList();
var结果=会话
.Query()
.Customize(x=>x.RelatesToShape(“WKT”,“点(30-10)”,空间关系内))
.ToList();
这不是定义和使用空间数据的唯一方法。您可以在这些文档文章中阅读有关RavenDB空间索引的更多信息:


在RavenDB中,您可以定义索引来处理空间数据。 假设您有一个定义为WKT的空间多边形文档: (WKT-->众所周知的文本标记)

我说的多边形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());
    }
}
具有kt_byname和wkt:AbstractIndexCreationTask的公共类事件
{
公共活动,按名称和WKT()
{
Map=events=>来自事件中的e
选择新的
{
Name=e.Name,
WKT=e.WKT
};
Spatial(x=>x.WKT,options=>options.Geography.Default());
}
}
通过调用索引定义中的“Spatial”方法,RavenDB创建了一个特殊的列,然后可以使用空间查询来查询该列

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

var results = session
    .Query<EventWithWKT, EventsWithWKT_ByNameAndWKT>()
    .Customize(x => x.RelatesToShape("WKT", "POINT (30 10)", SpatialRelation.Within))
    .ToList();
var结果=会话
.Query()
.Customize(x=>x.RelatesToShape(“WKT”,“点(30-10)”,空间关系内))
.ToList();
这不是定义和使用空间数据的唯一方法。您可以在这些文档文章中阅读有关RavenDB空间索引的更多信息:


在某种程度上,我知道空间索引。我的问题不是如何查询单个简单多边形中的点数据。问题是:当点的数量和多边形的数量都很大(或者是一个非常复杂的多边形)时,我如何在多边形中找到点,而不会遇到Raven的任何默认安全限制。如果你说的是绕过每个会话的查询限制,执行惰性查询是绕过它()的方法之一。惰性查询被分组到一个请求中,并在服务器上并行处理。此外,多点和多多边形也可以工作。每个“连接”可以有多少个多点和多边形?另外,我认为这种问题更适合RavenDB邮件列表,因为它可能需要讨论()我真的不想绕过合理的限制。我想要一个普遍适用的解决方案(如果有的话)。至于点数的数量,我将详细说明手头的问题领域:点数是城市中的下水道人孔。多边形是道路曲面。可能有100K个点和5K个多边形,其中大多数相对简单,因此可能有20K个定义多边形。我会有类似这样的查询:“公共道路上的人孔,在这个边界框中”。但我会将其发布到邮件列表中,而不是。在某种程度上,我知道空间索引。我的问题不是如何查询单个简单多边形中的点数据。问题是:当点的数量和多边形的数量都很大(或者是一个非常复杂的多边形)时,我如何在多边形中找到点,而不会遇到Raven的任何默认安全限制。如果你说的是绕过每个会话的查询限制,执行惰性查询是绕过它()的方法之一。惰性查询被分组到一个请求中,并在服务器上并行处理。此外,多点和多多边形也可以工作。每个“连接”可以有多少个多点和多边形?另外,我认为这种问题更适合RavenDB邮件列表,因为它可能需要讨论()我真的不想绕过合理的限制。我想要一个普遍适用的解决方案(如果有的话)。至于点数的数量,我将详细说明手头的问题领域:点数是城市中的下水道人孔。多边形是道路曲面。可能有100K个点和5K个多边形,其中大多数相对简单,因此可能有20K个定义多边形。我可能会有这样的疑问:“在公共道路上的人孔,在这个边界框中”,例如