2013-09-09 3 views
1

Я работаю на веб-сайте путеводителя. Что я хочу сделать, так это прочитать пользовательские проверки facebook и пометить местоположения (сохраненные в моем db с координатами, собранными из Google), которые они посетили.Сравните места регистрации Facebook с местоположениями, сохраненными в db

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

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

+1

Вы ознакомились с пространственной библиотекой Neo4j? На сайте Neo4j, посвященном Neo4j Spatial, есть [веб-страница] (http://www.neo4j.org/develop/spatial). Оттуда вы можете посмотреть сообщение [Поиск вещей, близких к другим вещам] (http://blog.neo4j.org/2011/03/neo4j-spatial-part1-finding-things.html). Я понимаю, что пространственная библиотека не основана на php, но вы все еще можете работать с ней или, по крайней мере, учиться на ней ... –

ответ

0

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

Сначала я выбрал некоторые пункты назначения, где разница между координатами меньше 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. Это значение также может быть скорректировано для ваших нужд. И Heres код:

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 ,