检查Latitude&经度存在于数据库中

时间:2016-08-30 18:31:03

标签: php mysql google-maps google-maps-api-3 floating-point

我想查看Latitude& amp;经度已存在于数据库中。我有一个网站,人们可以输入他们的实际地址,它将显示在地图上。我确实希望防止输入两次物理地址。我认为最好的方法是比较Latitude&地址的经度与数据库中存储的内容。

我正在使用Google Map API查找Latitude&用户输入的地址的经度。根据Google的建议,我将这些值存储(缓存)为Float(10,6)值。

当我尝试比较用户输入的地址的值和我存储在数据库中的地址时,我遇到的问题似乎是将Float值四舍五入。

以下是我用于比较这些值的代码:

$url = "http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=".urlencode($address);
    $lat_long = get_object_vars(json_decode(file_get_contents($url)));
    // pick out what we need (lat,lng)
    $lat = $lat_long['results'][0]->geometry->location->lat;
    $lng = $lat_long['results'][0]->geometry->location->lng;
    // Check to see if Property is already in database
    $getlatlng = sprintf("SELECT * FROM `Property` WHERE CAST(lat AS DECIMAL(10,6)) = CAST(%s AS DECIMAL(10,6)) AND CAST(lng AS DECIMAL(10,6)) = CAST(%s AS DECIMAL(10,6))",
        $PDO_DB->quote($lat),
        $PDO_DB->quote($lng));
    $resultlatlng = $PDO_DB->query($getlatlng);
    $rowlatlng = $resultlatlng->fetch(PDO::FETCH_ASSOC);

这方面的一个例子是地址:601 N Lincoln Rd, Escanaba, MI 49829

存储在数据库中的值为:

lat = 45.752487
lng = -87.082733 

Google Map API返回的值为:

lat = 45.7524878
lng = -87.0827338

我的猜测与返回的值被舍入为:

lat = 45.752488
lng = -87.082734

这导致我在数据库中拥有的内容以及Google返回的内容并不相同。存储在数据库中的值存储在与上面相同的代码中,只是将值插入到数据库中的部分。

1 个答案:

答案 0 :(得分:0)

感谢@Aaron指出PHP命令BCCOMP。我用它来解决这个问题。

现在是代码:

$url = "http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=".urlencode($address);

$lat_long = get_object_vars(json_decode(file_get_contents($url)));
// pick out what we need (lat,lng)
$lat = $lat_long['results'][0]->geometry->location->lat;
$lng = $lat_long['results'][0]->geometry->location->lng;

$propertyexist = FALSE; 

    // Check to see if Property is already in database  
    $getlatlng = sprintf("SELECT * FROM `Property`");
    $resultlatlng = $PDO_DB->query($getlatlng);
    $rowlatlng = $resultlatlng->fetchALL(PDO::FETCH_ASSOC);

    foreach ($rowlatlng AS $rowlt) {
        $checklat = bccomp($rowlt['lat'], $lat, 6);
        $checklng = bccomp($rowlt['lng'], $lng , 6);

        if (($checklat === 0) && ($checklng === 0)) {
            $propertyexist = TRUE;
            break;
        }
    }