我想查看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返回的内容并不相同。存储在数据库中的值存储在与上面相同的代码中,只是将值插入到数据库中的部分。
答案 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;
}
}