5

設定した半径でデータベースから結果を取得し、それらを地図上に配置する小さなサイトを開発しようとしています。私はGoogleマップAPIを使用して、そこからlatとlongの検索条件を取得し、これらをphpスクリプトに渡します。このスクリプトは、データベースにクエリを実行し、結果セットをJSONオブジェクトとして返します。

jsonを使用してPHPにlatとlongの両方を送信する際に小さな問題が発生しています。

私の主な問題は、データベースを検索するためのSQLが間違っているように見えることです。これは、データベース内の最初の10件の結果を取得するだけだからです。検索ポイントから半径内の最初の10件の結果を返すようにします。

これが私のajaxコードです

function showCarPark(location)
{
    var lat = location.lat();
    var lng = location.lng();
    //alert("Lat: " +lat.toFixed(6));
    //alert("Lng: " +lng.toFixed(6));
    document.getElementById('carParkResults').innerHTML = "";
    var criterion = document.getElementById("address").value;
    var count = 0;
    $.ajax({    
              url: 'process.php',
              type: 'GET',
              data: "lat=" + lat + "&lng=" + lng,
              dataType: 'json',
              success: function(data) 
              {
                  jQuery.each(data, function()
                  {
                    $('<p>').text("Car Park: " + data[count].name).appendTo('#carParkResults');
                    placeCarParks(data[count].postcode,data[count].name, data[count].street, data[count].type);
                    count++;
                  });
              },
              error: function(e) 
              {
                //called when there is an error
                console.log(e.message);
                alert("error" + e.message);
              }
    });

そしてこれが私のphpスクリプトです

$rad = 20;
$lat = $_GET['lat'];
$lng = 1.4681464; //put a temporary number in as it wont pass the lng in the JSON

$sql="SELECT *, (3959 * acos(cos(radians('".$lat."')) * cos(radians(lat)) * cos( radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * 
sin(radians(lat)))) 
AS distance 
FROM carpark HAVING distance < 15 ORDER BY distance LIMIT 0 , 10";

$result = mysql_query($sql);

while($r = mysql_fetch_assoc($result)) $rows[] = $r;

echo json_encode($rows);

私のテーブルの列はlatとlongと呼ばれています。助けていただければ幸いです。

4

4 に答える 4

10

あなたの場合WHEREの代わりに使用してみてくださいHAVING

SELECT *, (3959 * acos(cos(radians('".$lat."')) * cos(radians(lat)) * cos( radians(long) - radians('".$lng."')) + sin(radians('".$lat."')) * 
sin(radians(lat)))) 
AS distance 
FROM carpark WHERE distance < 15 ORDER BY distance LIMIT 0 , 10
于 2012-05-16T15:15:38.773 に答える
9

HAVINGの使用に問題はありませんでした。iLLinの答えは誤解を招くものです。ニューヨーク市からの距離を見つけるための正しいクエリの例を次に示します。

SELECT *, (3959 * acos(cos(radians('40.7142')) * cos(radians(latitudeColName)) * cos( radians(longitudeColName) - radians('-74.0064')) + sin(radians('40.7142')) * sin(radians(latitudeColName)))) AS distance FROM myTable HAVING distance < 15 ORDER BY distance LIMIT 0 , 10

この表記を使用するようにjQueryリクエストの行を変更します{name:value、name:value}:

          data: {lat : lat, long : long},
于 2013-04-08T03:51:44.050 に答える
1

Larry Ullmanは、彼の著書「PHP 5 Advanced:VisualQuickproGuide」で非常によく似たことをしました。

彼のサンプルコードを見て、距離を計算するためにこれを試してください:

ROUND(DEGREES(ACOS(SIN(RADIANS($lat)) 
* SIN(RADIANS(latitude)) 
+ COS(RADIANS($lat))  
* COS(RADIANS(latitude))
* COS(RADIANS($long - longitude)))) * 69.09) AS distance
于 2012-05-16T15:15:05.000 に答える
0
"SELECT *, ( 3959 * acos( cos( radians(".$lat.") ) * cos( radians( ".$lat." ) ) * cos( radians( ".$long." ) - radians(".$long.") ) + sin( radians(".$lat.") ) * sin( radians( ".$lat." ) ) ) ) AS distance FROM carpark HAVING distance < 15 ORDER BY distance LIMIT 0, 10"

緯度と経度の値を取得するには、クエリを修正する必要があります。いくつかの場所でlat/longという単語を渡しているだけです。このクエリをあなたのクエリと比較して、私が何を意味するかを確認してください。

于 2012-05-16T15:20:37.427 に答える