You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

geof:buffer函数使用问题求助及可行查询示例请求

GeoSPARQL中geof:buffer函数使用问题

我在构建使用geof:buffer的有效查询时遇到困难。geof:buffer的定义为:

该函数返回一个几何对象,代表所有与geom1的距离小于或等于指定单位半径的点。计算基于geom1的空间参考系统。

数据集信息

我的数据集是10km范围内的1000个1km正方形网格,ex:center为该范围的中心点,定义如下:

<center>  geo:asWKT  "<http://www.opengis.net/def/crs/OGC/1.3/CRS84> POINT(138.5763200 -34.9500700)" .

查询3结果集中的一个网格示例:

<box122>  a        geo:Geometry ;
        geo:asWKT  "<http://www.opengis.net/def/crs/OGC/1.3/CRS84> POLYGON((138.5559465 -34.9582197, 138.5778899 -34.9582197, 138.5778899 -34.9402337, 138.5559465 -34.9402337, 138.5559465 -34.9582197))"^^geo:wktLiteral .

各查询情况

查询1:无结果返回(预期约37条)

我期望该查询返回与查询3一致的约37条结果,且?buffer为填充圆形(多边近似),但实际无结果:

PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX uom: <http://www.opengis.net/def/uom/OGC/1.0/>
PREFIX ex: <http://example.com/>
select ?thing (geof:distance(?box,?center ,uom:metre) as ?distance) where { 
    ?thing geo:asWKT ?box.
    ex:center geo:asWKT ?center.
    bind (geof:buffer(?center,1000,uom:metre) as ?buffer).
    FILTER(geof:sfOverlaps(?box, ?buffer))
}  ORDER BY ?distance

查询2:验证?buffer未绑定

执行后返回1条结果;若将!bound改为bound则无结果,说明geof:buffer未成功生成缓冲区对象:

PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX uom: <http://www.opengis.net/def/uom/OGC/1.0/>
PREFIX ex: <http://example.com/>
select ?center ?buffer where { 
    ex:center geo:asWKT ?center.
    bind (geof:buffer(?center,1000,uom:metre) as ?buffer).
    FILTER (!bound(?buffer))
}  ORDER BY ?distance

查询3:使用geof:distance得到预期结果

该查询返回了我期望的37条结果:

PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX uom: <http://www.opengis.net/def/uom/OGC/1.0/>
PREFIX ex: <http://example.com/>
select ?thing (geof:distance(?box,?center ,uom:metre) as ?distance) where { 
    ?thing geo:asWKT ?box.
    ex:center geo:asWKT ?center.
    FILTER (geof:distance(?box,?center ,uom:metre) < 1000)
}  ORDER BY ?distance

疑问与需求

  1. 若geof:buffer确实可用,能否将?buffer与sf:overlaps谓词配合使用而非函数?
  2. 最终我希望查询距离某点一定范围内的网格,但不想使用Filter(预计性能差,需遍历所有几何对象),希望用谓词查询以利用空间索引。

内容的提问来源于stack exchange,提问作者alanr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:57:50