Как использовать функцию geof:distance из GeoSPARQL

Я создал небольшую онтологию, в которой у меня есть класс с именем node. С ним связаны свойства данных has_latitude и has_longitude. Мне нужно выполнить запрос, который с учетом широты и длины входных данных должен быть в состоянии найти узлы в пределах 20 метров. Поэтому написал запрос, используя формулу Харвеса. Это работает, но запрос выглядит очень сложным. Ниже мой запрос

PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX math: <http://www.w3.org/2005/xpath-functions/math#>
PREFIX leviathan: <http://www.dotnetrdf.org/leviathan#>
PREFIX afn: <http://jena.hpl.hp.com/ARQ/function#>
PREFIX openStreetMapWithData: <http://www.semanticweb.org/yogitas/ontologies/2017/2/openStreetMapWithData.owl#>
PREFIX ont: <http://www.co-ode.org/ontologies/ont.owl#>
PREFIX has_k_recycling: <http://www.semanticweb.org/yogitas/ontologies/2017/2/openStreetMapWithData.owl#
has_k_recycling:>
PREFIX tags: <https://raw.github.com/doroam/planning-do-roam/master/Ontology/tags.owl#>
PREFIX k_addr: <https://raw.github.com/doroam/planning-do-roam/master/Ontology/tags.owl#k_addr:>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX uom: <http://www.opengis.net/def/uom/OGC/1.0/>

select  ?lat ?lon ?node ?way ?id
where {

  ?node openStreetMapWithData:node_has_latitude ?lat .
  ?node openStreetMapWithData:node_has_longitude ?lon . 
  filter ( 
  6371 * 2 * math:asin(math:sqrt(  
  math:pow( math:sin((("48.4321094"^^xsd:double - ?lat)*math:pi()/180)/2),2)
    +
    math:cos("48.4321094"^^xsd:double * math:pi() /180) *   math:cos(?lat * math:pi() / 180) * math:pow( math:sin(("10.0219117"^^xsd:double - ?lon)*math:pi()/180),2)))  < 0.02 )

 {?node openStreetMapWithData:node_has_id ?id .
    ?waynode openStreetMapWithData:waynode_has_reference_id ?id .
    ?way openStreetMapWithData:way_has_part ?waynode .
    ?waynode rdf:type openStreetMapWithData:way_node .
    ?way rdf:type openStreetMapWithData:way.}

 }

Я наткнулся на GeoSPARQL и обнаружил, что у него есть функция geo:distance(), которую можно использовать по той же причине, что и то, что я пытаюсь сделать выше. Я использую его в запросе ниже, чтобы найти расстояние до каждого узла с заданной точкой ввода.

PREFIX geo: <http://www.opengis.net/ont/geosparql#>
PREFIX uom: <http://www.opengis.net/def/uom/OGC/1.0/>
PREFIX geof: <http://www.opengis.net/def/function/geosparql/> 

select  ?node ?lat1 ?lon1
where {
?node1 openStreetMapWithData:node_has_latitude ?lat1 .
?node1 openStreetMapWithData:node_has_longitude ?lon1 .
BIND (geof:distance(?lat1,?lon1, "48.4332423"^^xsd:double, "10.0198943"^^xsd:double,uom:metre) as ?x)
}

Это не дает мне никакой ошибки, но даже не дает никакого значения. Какие все изменения мне нужно сделать для GeoSPARQL? Нужно ли мне сделать мой класс узла подклассом какого-то класса из GeoSPARQL или около того? Мне не удалось найти документацию о том, как использовать GeoSPARQL вместе с вашей собственной онтологией.

Любая помощь будет оценена! Спасибо.


person ysg7790    schedule 06.04.2017    source источник


Ответы (1)


Чтобы рассчитать расстояние, вы должны использовать экземпляр asWKT под геометрией, а не непосредственно широту и долготу. Например:

SELECT ?p ?dist
   WHERE {
     ?p rdf:type my:MyPoint .
     ?p1 rdf:type my:MyPoint .
     ?p my:Label "alpha1" .
     ?p my:Label "alpha2" . .
     ?p my:hasExactGeometry ?geom .
     ?geom my:asWKT ?wkt .
     ?p1 my:hasExactGeometry ?geom1 .
     ?geom1 my:asWKT ?wkt1 .
     BIND (geof:distance(?wkt, ?wkt1, <http://www.opengis.net/def/uom/OGC/1.0/meter>) as ?dist)
}
person Hervé Girod    schedule 27.09.2020