Neo4j пространственное расстояние wgs84

Я использую этот код для поиска ближайших мест к заданной точке в формате wgs84 (переменная co)

for(Node n : geomPoints){
    ExecutionResult result = engine.execute("START a=node(" + n.getId() + ") "+ 
                                                    "MATCH a-[:FIRST_NODE]->()-[:NEXT*0..]->()-[:NODE]->b "+
                                                    "RETURN b");

    Iterator<Node> nodes = result.columnAs("b");
    while(nodes.hasNext()){
        Node nodesInGeom = nodes.next();
        Float lon = Float.parseFloat(nodesInGeom.getProperty("lon").toString());
        Float lat = Float.parseFloat(nodesInGeom.getProperty("lat").toString());
        Coordinate coo = new Coordinate(lon,lat);
        if(co.distance(coo)<distance) {
            distance = co.distance(coo);
            nearestNabour = nodesInGeom;
        }
    }

Итак, важной частью этого кода является эта часть

co.distance(coo)

потому что мне сказали, что эта функция использует евклидово расстояние, а не расстояние, которое мне нужно для формата wgs84

Итак, мой вопрос: есть ли функция в neo4j satial, которая возвращает правильное расстояние??

Большое спасибо


person user3042984    schedule 12.12.2013    source источник
comment
Не могли бы вы поделиться классами точек и индексами, которые использовались в классе узлов? также, какие пакеты использовались в файле pom? Благодарность!   -  person USer22999299    schedule 21.11.2018


Ответы (1)


Я бы предложил использовать метод org.geotools.referencing.datum.DefaultEllipsoid.WGS84.orthodromicDistance(). См., например, его использование в OSMImporter по адресу https://github.com/neo4j/spatial/blob/master/src/main/java/org/neo4j/gis/spatial/osm/OSMImporter.java#L2158

А в ответ на второстепенный вопрос о поиске ближайшей геометрии к точке взгляните на служебный метод findClosestEdges по адресу https://github.com/neo4j/spatial/blob/master/src/main/java/org/neo4j/gis/spatial/SpatialTopologyUtils.java#L102. Это вернет коллекцию PointResult, содержащую ближайшую точку и геометрию, которой она принадлежит. Если вы просмотрите код, вы увидите, что он использует класс JTS LocationIndexedLine для вычисления ближайшей части ребра.

person Craig Taverner    schedule 17.12.2013
comment
Спасибо за ответ. Интересно, есть ли способ найти кратчайшее расстояние wgs84 между точкой и многоугольником. Привет - person user3042984; 29.03.2014
comment
Здесь может помочь класс JTS LocationIndexedLine. Мы также реализовали служебный метод, выполняющий то, о чем вы просили, на странице github.com/neo4j/spatial/blob/master/src/main/java/org/neo4j/. Я обновлю ответ выше и для этого. - person Craig Taverner; 07.04.2014