Как рассчитать расстояние между двумя точками, используя 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
возвращает мне правильное расстояние, но использование очков не возвращает ничего.
2 ответа
geof:distance
Функция принимает геометрию в качестве первых двух параметров. Так что с вашим упрощенным запросом, используя geof:distance(?geo1, ?geo2, unit:Kilometer)
должен дать вам желаемый результат. В блоге Stardog есть геопространственный пост, который вы можете найти полезным.
AKSW правильно, вы должны использовать встроенную функцию Geof: расстояние для расчета.
У меня такая же проблема с 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)
}