Сравните места регистрации в Facebook с местоположениями, сохраненными в БД

Я работаю над сайтом путеводителя. То, что я хочу сделать, это прочитать отметки пользователей в Facebook и отметить места (сохраненные в моей базе данных с координатами, собранными из Google), которые они посетили.

Мой вопрос заключается в том, как я могу лучше сравнить местоположение, сохраненное в моей БД, с местоположением, указанным на Facebook. Координаты не совпадают точно, и имя на Facebook во многих случаях сохраняется в нескольких вариантах.

Я использую neo4j DB с php.

1 ответ

Решение

Так вот что я придумал. Надеюсь, это поможет кому-то.

Сначала я выбрал несколько направлений, где разница между координатами меньше 0,25. Вы можете настроить это значение по мере необходимости. Мой запрос на шифрование выглядит так:

START n = node:Destination('*:*')
WHERE has( n.lat ) AND has( n.long ) AND ABS(n.lat - ".$value['place']['location']['latitude'].") < 0.25 AND ABS(n.long - ".$value['place']['location']['longitude'].") < 0.25
RETURN n, ABS(n.lat - ".$value['place']['location']['latitude']."), ABS(n.long - ".$value['place']['location']['longitude'].")

Затем я вычисляю "расстояние Левенштейна" (минимальное количество символов, которое нужно заменить, вставить или удалить, чтобы преобразовать str1 в str2.) С помощью функции levenshtein() и выбрать только те из них, у которых это значение меньше длины строки / 2. Это значение также может быть скорректировано для ваших нужд. И вот код:

foreach( $nodes as $key2 => $value2 ){
    $name1 = strtolower($value2['x']->getProperty('name'));
    $name2 = strtolower($value['place']['name']);
    $name2 = explode( ",", $name2 );
    $name2 = $name2[0];
    $similarity = levenshtein($name1, $name2);
    if( abs($similarity) <= intval(strlen($name1)/2) ){
       array_push($similarityArray,$value2);
    }
}

После этого я сузил его, выбрав места, которые были ближайшими просто так:

$minDifference = 0.4;
foreach( $similarityArray as $key2 => $value2 ){
        if( $minDifference > ($value2[1]+$value2[2]) ){
            $minDifference = ($value2[1]+$value2[2]);
            $minKey = $key2;
        }
    }

Скорее всего, это будет местоположение с ключом $minKey.

Другие вопросы по тегам