我正在尝试针对包含地理空间信息的 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>
我的问题是我找不到 cts: 或 gml: 类型的查询,允许用户定义多边形以搜索多边形。我可以使用 (http://docs.marklogic.com/6.0/cts:polygon-intersects) 类型的函数来比较多边形,但这似乎不允许我查询多边形,只是比较形状对象。
任何关于如何做到这一点的建议(或确认我不能这样做)将不胜感激。
创建一个cts:polygon
并将其与cts:element-geospatial-query
一起使用。$regions
参数取cts:region*
,cts:polygon
是cts:region
的子类型。有了cts:element-geospatial-query
后,您可以将其与其他cts:query
项目组合,并将其与cts:search
或search:resolve
一起使用。
cts:element-geospatial-query(
xs:QName("gml:Polygon"),
cts:polygon(10.0, 35.0, 20.0, 40.0))
经过大量试验和错误尝试创建按预期工作的查询,我创建了一个适合我的情况的解决方案。我在 MarkLogic 中有混合了gml:Point
和gml:Polygon
信息的文档。我遇到的问题是试图在用户输入任何 WKT 查询时获取涵盖这两种情况的查询。
gml:Point
一个例子是:
<gml:Point srsDimension="2" srsName="http://somesite.com">
<gml:pos>1 1</gml:pos>
</gml:Point>
或者它可能像原始问题中描述的gml:Polygon
一样。
我的想法是我需要查询gml:Polygon
,但实际上,我需要使用 cts:element-child-geospatial-query 查询来查询gml:LinearRing
。
我的最后一个查询看起来像(同时支持 gml 和 gml32):
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
)
))
然后添加适当的地理空间元素子索引将使查询返回我所期望的内容,并给出低于 0.2 秒的响应。
您已经接近了,但仍存在搜索多边形可以重叠数据库中的区域而不覆盖该区域的外围点的情况。
MarkLogic 专业服务有一个库,可以对存储的多边形、线串、框、圆等执行标准地理操作(相交、不相交、包含、内、重叠等)。 它通过使用预过滤器步骤来工作,该步骤涉及基于 cts:边界框和其他修饰点的正向和反向查询的组合,利用 MarkLogic 地理索引。 然后,它有一个辅助步骤,对第一个过滤器中幸存下来的多边形/区域执行细粒度精确筛选,因此您最终会得到一组精确的匹配区域。
它不公开可用,但如果您想引入专业服务来访问该库,您可以联系您的 MarkLogic 客户经理。