MarkLogic搜索包含多边形的文档

MarkLogic搜索包含多边形的文档,marklogic,Marklogic,我正试图针对包含地理空间信息的MarkLogic文档集编写一个查询。搜索包含点的文档相对容易,但我有一些定义多边形的文档 <gml:Polygon gml:id="test" srsName="EPSG:4326"> <gml:exterior> <gml:LinearRing> <gml:pos>0 5</gml:pos> <gml:pos>5 10</gml:pos>

我正试图针对包含地理空间信息的MarkLogic文档集编写一个查询。搜索包含点的文档相对容易,但我有一些定义多边形的文档

<gml:Polygon gml:id="test" srsName="EPSG:4326">
  <gml:exterior>
    <gml:LinearRing>
      <gml:pos>0 5</gml:pos>
      <gml:pos>5 10</gml:pos>
      <gml:pos>10 5</gml:pos>
      <gml:pos>5 0</gml:pos>
      <gml:pos>0 5</gml:pos>
    </gml:LinearRing>
  </gml:exterior>
</gml:Polygon>

0 5
5 10
10 5
5 0
0 5
我的问题是,我找不到cts:或gml:类型的查询,该查询允许用户定义多边形来搜索多边形。我可以使用()类型的函数比较多边形,但这似乎不允许我查询多边形,只需比较形状对象即可


如果您对如何执行此操作提出任何建议(或确认我无法执行此操作),我们将不胜感激。

创建一个
cts:polygon
,并将其与一起使用。
$regions
参数采用
cts:region*
,而
cts:polygon
cts:region
的子类型。一旦有了
cts:element地理空间查询
,您就可以将其与其他
cts:query
项组合,并将其与或一起使用


在尝试创建一个按预期工作的查询时经过了大量的尝试和错误之后,我创建了一个适合我的情况的解决方案。我在MarkLogic中的文档混合了
gml:Point
gml:Polygon
信息。我遇到的问题是,当用户输入任何WKT查询时,试图获得一个涵盖这两种情况的查询

例如
gml:Point

<gml:Point srsDimension="2" srsName="http://somesite.com">
  <gml:pos>1 1</gml:pos>
</gml:Point>

然后,添加适当的地理空间元素子索引将使查询返回我所期望的结果,并给出0.2秒以下的响应。

很接近,但仍有一些情况下,您的搜索多边形可以覆盖数据库中的区域,而不覆盖该区域的一个边界点

MarkLogic Professional Services有一个库,可以对存储的多边形、线串、长方体、圆进行标准地理操作(相交、不相交、包含、内部、重叠等),它通过使用预过滤步骤工作,该步骤涉及基于cts的正向和反向查询的组合:边界框和附加装饰点,利用MarkLogic地理索引。然后,它有一个第二步,对第一次过滤后的多边形/区域执行细粒度的精确过滤,因此最终得到一组精确的匹配区域


它不是公开提供的,但是如果您想引入专业服务来访问该库,可以联系您的MarkLogic客户经理。

那么您想搜索具有特定顶点集的多边形吗?仅精确匹配?任何匹配项是否也会以同样的方式使用
gml:Polygon
?我希望能够使用多边形搜索多边形,并为用户提供指定“相交”、“包含”的选项。。。可能是“不相交”(我没有看到API调用,但我假设有一种方法可以做到这一点)。Polygon只是一个例子,因为我希望能够接收WKT并将其用于搜索参数。这绝对是我所需要的,尽管测试我的数据返回的结果不够多(根据我假设的结果)。我将进一步讨论这个问题,但如果我不能弄清楚如何得到我期望的结果,我可能不得不提出另一个问题。经过一系列测试,这实际上不起作用。查询没有在一个非常简单的数据集中返回所有预期结果。更多信息请参见我的答案。
<gml:Point srsDimension="2" srsName="http://somesite.com">
  <gml:pos>1 1</gml:pos>
</gml:Point>
cts:or-query((
  cts:element-child-geospatial-query(
    xs:QName("gml:Point"),
    xs:QName("gml:pos"),
    $parsedGeometry
  ), 
  cts:element-child-geospatial-query(
    xs:QName("gml32:Point"),
    xs:QName("gml32:pos"),
    $parsedGeometry
  ),
  cts:element-child-geospatial-query(
    xs:QName("gml:LinearRing"),
    xs:QName("gml:pos"),
    $parsedGeometry
  ), 
  cts:element-child-geospatial-query(
    xs:QName("gml32:LinearRing"),
    xs:QName("gml32:pos"),
    $parsedGeometry
  )
))