【问题标题】:Compare Facebook check-in locations with locations saved in db将 Facebook 签到位置与数据库中保存的位置进行比较
【发布时间】:2013-09-09 09:20:24
【问题描述】:

我正在开发一个旅游指南网站。 我想要做的是阅读用户的 Facebook 签到并标记他们访问的位置(保存在我的数据库中,并使用从谷歌收集的坐标)。

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

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

【问题讨论】:

  • 您看过 Neo4j 空间库吗? Neo4j 网站上有一个web page 专门用于 Neo4j Spatial。从那里,您可能想查看Finding things close to other things 的帖子。我意识到 Spatial 库不是基于 php 的,但您仍然可以使用它,或者至少可以从中学习...

标签: php facebook neo4j coordinates facebook-checkins


【解决方案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'].")

然后我使用levenshtein() 函数计算“Levenshtein 距离”(将 str1 转换为 str2 所必须替换、插入或删除的最小字符数。)并仅选择那些该值小于字符串长度的字符/ 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 的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    相关资源
    最近更新 更多