我试图开发一个小站点,该站点按设定的半径从数据库中检索结果并将它们放置在地图上。我使用 Google 地图 api 从那里获取纬度和长度搜索条件,将它们传递给我的 php 脚本,该脚本查询数据库并将结果集作为 JSON 对象返回。
我在使用 json 将纬度和长度发送到 php 时遇到了一个小问题。
我的主要问题是我搜索数据库的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);
我表中的列称为经度和经度任何帮助,不胜感激。
对于您的情况,请尝试使用 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
我在使用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},
Larry Ullman在他的书"PHP 5 Advanced: Visual Quickpro Guide"中做了类似的事情。
看看他的示例代码,试试这个来计算距离:
ROUND(DEGREES(ACOS(SIN(RADIANS($lat))
* SIN(RADIANS(latitude))
+ COS(RADIANS($lat))
* COS(RADIANS(latitude))
* COS(RADIANS($long - longitude)))) * 69.09) AS distance
"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"
您需要修复查询以拉入纬度和经度值。 你只是在几个地方传递了纬度/经度这个词。 将此查询与您的查询进行比较,以了解我的意思。