gpt4 book ai didi

rdf - 如何从 geosparql 的 wktLiteral 中检索纬度和经度?

转载 作者:行者123 更新时间:2023-12-01 23:58:35 27 4
gpt4 key购买 nike

我正在处理包含地理引用资料的 RDF 数据,例如具有指定位置的兴趣点:

@prefix ogc:   <http://www.opengis.net/ont/geosparql#> .

:poi ogc:hasGeometry :geo
:geo ogc:asWKT "POINT(48.5 11.7)"^^ogc:wktLiteral .

所以有某种兴趣点位于 (48.5, 11.7)。我可以使用 GeoSPARQL -查询与这些位置一起使用,但现在我想分别提取纬度和经度,因此我可以将它提供给不支持 WKT 的不同应用程序.

SELECT ?lat ?lon
WHERE {
# how do I get lat and lon from "POINT(48.5 11.7)"^^ogc:wktLiteral?
}

我没有在 OGC's GeoSPARQL specification 中找到任何有用的信息,所以我想知道在 SPARQL 查询中手动提取此类数据的最佳方法是什么。

最佳答案

用正则表达式做这类事情总是有点棘手,尤其是当我们看起来没有精确的语法可以使用时,但我认为以下方法可行:

prefix ogc: <urn:ex:>

select ?lat ?long where {
values ?point { "POINT(48.5 11.7)"^^ogc:wktLiteral }
bind( replace( str(?point), "^[^0-9\\.]*([0-9\\.]+) .*$", "$1" ) as ?long )
bind( replace( str(?point), "^.* ([0-9\\.]+)[^0-9\\.]*$", "$1" ) as ?lat )
}
-------------------
| lat | long |
===================
| "11.7" | "48.5" |
-------------------

这里的关键在于正则表达式

"^[^0-9\\.]*([0-9\\.]+) .*$" === <non-number>(number) <anything>
"^.* ([0-9\\.]+)[^0-9\\.]*$" === <anything> (number)<non-number>

当然,这实际上是 number 的近似值,因为它会匹配具有多个点的东西,但如果数据很好,你应该没有问题。如果您需要将这些值转换为数字类型,您也可以进行此类转换:

prefix ogc: <urn:ex:>
prefix xsd: <http://www.w3.org/2001/XMLSchema#>

select ?lat ?long where {
values ?point { "POINT(48.5 11.7)"^^ogc:wktLiteral }
bind( xsd:decimal( replace( str(?point), "^[^0-9\\.]*([0-9\\.]+) .*$", "$1" )) as ?long )
bind( xsd:decimal( replace( str(?point), "^.* ([0-9\\.]+)[^0-9\\.]*$", "$1" )) as ?lat )
}
---------------
| lat | long |
===============
| 11.7 | 48.5 | # note: no quotation marks; these are numbers
---------------

请注意,还有其他类型的 WKT 积分,此代码无法正确处理它们。例如,维基百科的一些示例 Well-known text文章:

POINT ZM (1 1 5 60)
POINT M (1 1 80)
POINT EMPTY

关于rdf - 如何从 geosparql 的 wktLiteral 中检索纬度和经度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22536467/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com