2016-12-05 4 views
0

Я тестирую orientdb spatial module. Я соединил простой набор данных с координатами для нескольких геоглифов в Наска (nazca_lines.csv):OrientDB пространственный запрос, чтобы найти все пары в пределах X км друг от друга

Name,Latitude,Longitude 
Hummingbird,-14.692131,-75.148892 
Monkey,-14.706940,-75.138532 
Condor,-14.697444,-75.126208 
Spider,-14.694145,-75.122381 
Spiral,-14.688277,-75.122746 
Hands,-14.694459,-75.113881 
Tree,-14.693898,-75.114520 
Astronaut,-14.745222,-75.079755 
Dog,-14.706401,-75.130788 
Wing,-14.680309,-75.100385 
Parrot,-14.689463,-75.107498 

создать пространственный индекс с помощью:

CREATE INDEX GeoGlyph.index.Location 
ON GeoGlyph(Latitude,Longitude) SPATIAL ENGINE LUCENE 

я могу генерировать список узлы, которые находятся в пределах, скажем, в 2 км, определенного геоглиф с помощью запроса, как один я генерируемой в this stack-overflow question:

SELECT $temp.Name AS SourceName, Name AS TargetName, $distance.format("%.4f") AS Distance 
FROM GeoGlyph 
LET $temp = first((SELECT * FROM GeoGlyph WHERE Name = "Tree")) 
WHERE [Latitude,Longitude,$spatial] 
NEAR [$temp.Latitude, $temp.Longitude,{"maxDistance":2}] 
ORDER BY Distance 

что дает мне этот результат:

+----+----------+----------+--------+ 
|# |SourceName|TargetName|Distance| 
+----+----------+----------+--------+ 
|0 |Tree  |Tree  |0.0000 | 
|1 |Tree  |Hands  |0.0884 | 
|2 |Tree  |Spider |0.9831 | 
|3 |Tree  |Spiral |1.0883 | 
|4 |Tree  |Condor |1.5735 | 
+----+----------+----------+--------+ 

Это хорошо, но я могу найти только узлы относительно определенного узла. Я хотел бы расширить это, чтобы спросить все пары узлов, которые находятся в пределах 2 км друг от друга.

Результат, который я заинтересован в будет выглядеть примерно так:

+----+-----------+-----------+--------+ 
|# |SourceName |TargetName |Distance| 
+----+-----------+-----------+--------+ 
|1 |Hummingbird|Monkey  |1.6314 | 
|2 |Monkey  |Dog  |1.8035 | 
|3 |Dog  |Condor  |0.9349 | 
|4 |Dog  |Spider  |1.5487 | 
|5 |Condor  |Spider  |0.6772 | 
|6 |Condor  |Spiral  |1.2685 | 
|7 |Condor  |Tree  |1.5735 | 
|8 |Condor  |Hands  |1.6150 | 
|9 |Spider  |Spiral  |0.6797 | 
... 

Есть идеи?

ответ

0

вы должны использовать новую пространственную функцию модуля с типом OPoint

и использовать функцию ST_Distance_Sphere

http://orientdb.com/docs/2.2/Spatial-Index.html#stdistancesphere-from-orientdb-224

+0

Спасибо, я могу смотреть на это. Я не использую метод WKT, потому что наши данные не используют WKT. Возможно, в будущем. Это по-прежнему не очень помогает моему основному вопросу: в настоящее время единственный способ, которым я получаю эту работу, - это укоренившийся поиск узлов с 2 км определенного узла. Я хочу найти _все пары узлов, которые находятся в пределах 2 км друг от друга. Я могу сделать это в javascript или Java достаточно легко, но я ищу решение на основе запросов. – TxAG98

Смежные вопросы