Как рассчитать расстояние между двумя точками с помощью geosparql

Я пытаюсь рассчитать расстояние между двумя точками с помощью geosparql. У меня есть объекты, подобные следующему изображению (те же свойства, разные значения):

введите здесь описание изображения

И я выполняю этот запрос в sparql:

PREFIX geos: <http://www.opengis.net/ont/geosparql#>
PREFIX geosf: <http://www.opengis.net/def/function/geosparql/>
PREFIX : <http://www.semanticweb.org/frubi/ontologies/2017/10/puntsWIFI#>

SELECT ?distance
WHERE {
    ?wifipoint1 :hasGeometry ?geo1 .
    ?geo1 geos:asWKT ?wpoint1 .
    FILTER sameterm(?wifipoint1, <http://www.semanticweb.org/frubi/ontologies/2017/10/puntsWIFI#NYWifiFree103>) 
    ?wifipoint2 :hasGeometry ?geo2 .
    ?geo2 geos:asWKT ?wpoint2 .
    FILTER sameterm(?wifipoint2, <http://www.semanticweb.org/frubi/ontologies/2017/10/puntsWIFI#NYWifiFree105>) .
    ?distance geosf:distance(?wpoint1 ?wpoint2 <http://qudt.org/vocab/unit#Kilometer>)
}

Не прибавляя расстояния, я могу получить следующий результат:

введите здесь описание изображения

Но в тот момент, когда я добавляю расстояние, получаются пустые строки. Любая идея?

Примечания:

  • Мне нужно рассчитать расстояние между двумя Wi-Fi точками (NYWifiFree103 и NYWifiFree105), каждый из которых имеет точку.

  • Я выполняю эти запросы в stardog.

** ИЗМЕНИТЬ **

Я упростил запрос:

PREFIX geos: <http://www.opengis.net/ont/geosparql#>
PREFIX geof: <http://www.opengis.net/def/function/geosparql/>
PREFIX : <http://www.semanticweb.org/frubi/ontologies/2017/10/puntsWIFI#>

SELECT (geof:distance(?wpoint1, ?wpoint2, <http://qudt.org/vocab/unit#Kilometer>) as ?distance)
WHERE {
    ?wifipoint1 :hasGeometry ?geo1 .
    ?geo1 geos:asWKT ?wpoint1 .
    FILTER sameterm(?wifipoint1, <http://www.semanticweb.org/frubi/ontologies/2017/10/puntsWIFI#NYWifiFree103>) .
    ?wifipoint2 :hasGeometry ?geo2 .
    ?geo2 geos:asWKT ?wpoint2 .
    FILTER sameterm(?wifipoint2, <http://www.semanticweb.org/frubi/ontologies/2017/10/puntsWIFI#NYWifiFree105>)
}

Когда я устанавливаю geof:distance два жестко закодированных wktLiteral, я возвращаю правильное расстояние, но использование Points не возвращает ничего.


person Mohamed Said Benmousa    schedule 07.06.2018    source источник
comment
Разве вы не должны просто использовать SELECT (geosf:distance(?wpoint1 ?wpoint2 <http://qudt.org/vocab/unit#Kilometer>) as ?distance) WHERE ...?   -  person UninformedUser    schedule 08.06.2018
comment
@AKSW Я пробовал, но расстояние пустое   -  person Mohamed Said Benmousa    schedule 10.06.2018
comment
Что значит пустой? Вы должны получить хоть какое-то число. Что произойдет, если вы воспользуетесь им через BIND внутри запроса? У вас включен пространственный индекс?   -  person UninformedUser    schedule 10.06.2018
comment
А что такое geos:asWKT? Префикса geos: в вашем запросе нет, он должен быть geo:asWKT   -  person UninformedUser    schedule 10.06.2018
comment
Пусто означает, что возвращается 0 элементов без какого-либо числа на расстоянии.   -  person Mohamed Said Benmousa    schedule 10.06.2018
comment
И извините, что исправил префикс geos   -  person Mohamed Said Benmousa    schedule 10.06.2018
comment
Как я могу узнать, включен ли у меня пространственный индекс?   -  person Mohamed Said Benmousa    schedule 10.06.2018
comment
Тот же результат при привязке запроса с использованием BIND (geof:distance(?wpoint1, ?wpoint2, <http://qudt.org/vocab/unit#Kilometer>) as ?distance)   -  person Mohamed Said Benmousa    schedule 10.06.2018
comment
В какой-то момент вы должны были сделать что-то вроде stardog-admin db create -o spatial.enabled=true -n ...   -  person UninformedUser    schedule 11.06.2018
comment
@AKSW Да, тогда включается   -  person Mohamed Said Benmousa    schedule 11.06.2018
comment
Также я установил в папку server / ext библиотеки stardog jts, чтобы использовать geosparql. Я тоже использую stardog Enterprise.   -  person Mohamed Said Benmousa    schedule 11.06.2018


Ответы (3)


Функция geof:distance принимает геометрию в качестве первых двух параметров. Таким образом, с вашим упрощенным запросом использование geof:distance(?geo1, ?geo2, unit:Kilometer) должно дать вам желаемый результат. В блоге Stardog есть полезный учебник по геопространственным данным.

person snowell    schedule 11.06.2018

AKSW верен, для расчета следует использовать встроенную функцию geof: distance.

person Michael    schedule 08.06.2018

У меня такая же проблема с GraphDB. вместо расстояния он возвращает 2 пустых поля, и я уже включил geosparql

Вот мой код:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX : <http://www.semanticweb.org/evangelos/ontologies/2019/2/untitled-ontology-2#>
prefix geo: <http://www.opengis.net/ont/geosparql#>
prefix geof: <http://www.opengis.net/def/function/geosparql/>
prefix unit: <http://qudt.org/vocab/unit#>
prefix sf: <http://www.opengis.net/ont/sf#>
prefix test24: <http://www.semanticweb.org/evangelos/ontologies/2019/2/untitled-ontology-2#>
prefix omgeo: <http://www.ontotext.com/owlim/geo#>

SELECT (geof:distance(?point, ?point2, <http://qudt.org/vocab/unit#Kilometer>) as ?distance)
WHERE
{
    :MouseioMetaksisSoufliou :hasGPSCoordinates ?geom2.
    ?geom2 geo:asWKT ?point.
    ?geom3 geo:asWKT ?point2.
    FILTER (?geom2 != ?geom3)
} 
person GGEv    schedule 24.06.2019