2016-08-30 1 views
0

Latitudeを参照してください。& Longitudeは既にデータベースに存在します。私は人々が彼らの物理的なアドレスを入力することができ、マップ上に表示されるウェブサイトを持っています。私は物理的なアドレスが二度入力されるのを防ぎたい。これを行う最善の方法は、Latitude &の経度とデータベースに格納されているものとを比較することです。Latitiude&Longitudeがデータベースに存在するかどうか確認してください

私はGoogle Map APIを使用してLatitudeを探しています&ユーザーが入力した住所の経度です。 Googleの推奨に従って、これらの値を浮動小数点(10,6)の値として保存(キャッシング)しています。

私が経験している問題は、ユーザーが入力したアドレスの値とデータベースに格納されている値を比較しようとすると浮動小数点値が丸められてしまうようです。ここで

は、私は、これらの値を比較するために使用していたコードです:

$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.752488 
lng = -87.082734 

そして、これは私が私のデータベースを持っているとどのようなGoogleが返す等しくないことになります。データベースに格納されている値は、上記のコードと同じコードに格納され、データベースに値を挿入しているセクションの外に置かれます。

お読みいただきありがとうございました。

+1

http://php.net/manual/en/function.bccomp.phpまたはhttp://php.net/manual/en/function.gmp- cmp.php – Aaron

+1

小数点以下6桁のみを格納します。ここで、(M、D)は、M桁までの値を格納することができることを意味し、D桁は小数点以下になる可能性があります。たとえば、FLOAT(7,4)として定義された列は、表示されるときに-999.9999のようになります。 MySQLは値を格納するときに丸めを行います。したがって、FLOAT(7,4)カラムに999.00009を挿入すると、おおよその結果は999.0001です。-http://dev.mysql.com/doc/refman/5.7/en/floating- point-types.html – chris85

+0

このフィールドの値を変更すると、MySQL内でFLOAT(11,7)に保存されますか? –

答えて

0

PHPコマンドBCCOMPを指摘してくれてありがとう@Aaron。私はそれを使って問題を解決しました。ここで

は、コードは以下のようになります。

$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; 
     } 
    } 
関連する問題