用户位置数据聚类

时间:2014-03-22 13:23:54

标签: php mysql geo

我有一个应用程序,用于存储Twitter用户在数据库中的位置(来自API GET /搜索推文 - 位置)。然而,这里的问题是它需要用户在他的个人资料中输入的内容。已包含在我的数据库中的示例数据:

All over the world & London
Boca Raton, Florida
Sunway Damansara, Malaysia
Munich
Brazil
40.769549,-73.993696
Long Island City, NY USA
United States
USA-Japan

正如你所看到的,有一个很大的变化(+垃圾信息,例如“位置:在我的世界中”),当我尝试处理这些数据时,这会产生很大的问题。我想要做的是有一个脚本,它将实际解析值并将每一行更新到一个国家(例如慕尼黑将更改为德国,纽约可能会更改为美国 - 因为它只是一个原型应用程序,而不是产品)。我正在做PHP和&amp ;; MySQL的。

对于如何解决这个问题有什么建议吗?

更新

我找到了这个例子,它有点像我想做的那样,但它并不适用于每一个值。例如,当我进入伦敦或雅典时,它会显示美国,但是当我进入慕尼黑时,它显示了德国...任何想法为什么?

<?php
// Get STATE from Google GeoData
function reverse_geocode($address) {
    $address = str_replace(" ", "+", "$address");
    $url = "http://maps.google.com/maps/api/geocode/json?address=$address&sensor=false";
    $result = file_get_contents("$url");
    $json = json_decode($result);
    foreach ($json->results as $result)
    {
        foreach($result->address_components as $addressPart) {
            if((in_array('locality', $addressPart->types)) && (in_array('political', $addressPart->types)))
                $city = $addressPart->long_name;
            else if((in_array('administrative_area_level_1', $addressPart->types)) && (in_array('political', $addressPart->types)))
                $state = $addressPart->long_name;
            else if((in_array('country', $addressPart->types)) && (in_array('political', $addressPart->types)))
                $country = $addressPart->long_name;
        }
    }

    if(($city != '') && ($state != '') && ($country != ''))
        $address = $city.', '.$state.', '.$country;
    else if(($city != '') && ($state != ''))
        $address = $city.', '.$state;
    else if(($state != '') && ($country != ''))
        $address = $state.', '.$country;
    else if($country != '')
        $address = $country;

    // return $address;
    return "$country/$state/$city";
}

// Usage: In my case, I needed to return the State and Country of an address
$myLocation = reverse_geocode("Athens");
echo "$myLocation";
?>

实际上,首先要在美国进行搜索。所以它显示了美国的雅典和伦敦,而不是希腊和英国。但有人怎么能改变呢?它甚至可能吗?

1 个答案:

答案 0 :(得分:0)

因为我找到了解决问题的方法,所以我在这里也发布了从发布的代码中解决上述问题的代码。我可以在第一次迭代中获得城市,州,国家的价值,因此它正在进行不必要的迭代,因此我在json返回的结果中获得了美国的结果。 现在我还将解析数据以排除诸如“在我的世界等”中的垃圾数据,并且我将能够按国家对它们进行分组。

<?php
// Get STATE from Google GeoData
function reverse_geocode($address) {
    $address = str_replace(" ", "+", "$address");
    $url = "http://maps.google.com/maps/api/geocode/json?address=$address&sensor=false";
    $result = file_get_contents("$url");
    $json = json_decode($result);
    foreach ($json->results as $k => $result)
    {
        if ($k == 0) {
            foreach($result->address_components as $addressPart) {
                if ((in_array('locality', $addressPart->types)) && (in_array('political', $addressPart->types))) {
                    $city = $addressPart->long_name;
                } else if((in_array('administrative_area_level_1', $addressPart->types)) && (in_array('political', $addressPart->types))) {
                    $state = $addressPart->long_name;
                }
                else if((in_array('country', $addressPart->types)) && (in_array('political', $addressPart->types))) {
                    $country = $addressPart->long_name;
                }
            }
        } else {
            break; //Will comes out of loop directly after getting result.
        }
    }

    if($country != '')
        $address = $country;

    // return $address;
    return "$country";
}

// Usage: In my case, I needed to return the State and Country of an address
$myLocation = reverse_geocode("Athens");
echo "$myLocation";
?>

@JaredFarrish感谢您在第一部分提供的帮助:)