我正在尝试针对包含地理空间信息的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)类型的函数比较多边形,但这似乎不允许我查询多边形,只是比较形状对象。
任何关于如何做到这一点的建议(或确认我不能这样做)将不胜感激。
答案 0 :(得分:2)
创建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))
答案 1 :(得分: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秒以下的响应。
答案 2 :(得分:0)
您已关闭,但仍有一些情况,您的搜索多边形可能会与数据库中的区域重叠,而不会覆盖区域的其中一个分界点。
MarkLogic专业服务有一个库,可以对存储的多边形,线串,方框,圆圈等执行标准地理操作(交叉,不相交,包含,内部,重叠等)。它通过使用预过滤步骤来工作包括基于cts的前向和反向查询的组合:边界框和其他装饰点,利用MarkLogic地理索引。然后它有一个辅助步骤,可以在第一个滤波器上存活的多边形/区域上执行细粒度精确滤波,因此您可以得到一组精确的匹配区域。
它不公开,但如果您想引入专业服务以访问图书馆,可以联系您的MarkLogic客户经理。