将Facebook签到位置与db中保存的位置进行比较

时间:2013-09-09 09:20:24

标签: php facebook neo4j coordinates facebook-checkins

我正在旅游指南网站上工作。 我想要做的是阅读用户的facebook checkins并标记他们访问过的位置(保存在我的数据库中,其中包含从谷歌收集的坐标)。

我的问题是如何才能最好地将我的数据库中保存的位置与facebook给出的位置进行比较。坐标不完全匹配,Facebook上的名称在很多情况下保存为多种变体。

我正在使用带有php的neo4j db。

1 个答案:

答案 0 :(得分: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'].")

然后我用levenshtein()函数计算“Levenshtein距离”(你需要替换,插入或删除以将str1转换为str2的最小字符数)。并选择那些具有小于length的值的那些of string / 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的位置。