Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于空间坐标获取最近的位置_Php_Mysql_Geolocation - Fatal编程技术网

Php 基于空间坐标获取最近的位置

Php 基于空间坐标获取最近的位置,php,mysql,geolocation,Php,Mysql,Geolocation,我有一张MySQL表格,里面有很多纬度/经度的地方。另一方面,我有一个客户端javascript/html5页面,它向服务器发送坐标 使用客户的坐标,我希望能够找到最近的位置。实现这一目标最简单的方法是什么 类似于SELECT*的地方是p,p.纬度在'49.8330001'附近,p.经度在'-119.45600'附近将非常好 我在这里遇到了一些问题,但他们没有给我一个正确的答案。我读到了MySQL的空间扩展和其他一些SQL查询,这些查询可能会起到作用,但似乎没有什么是真正“简单”的,因此我认为可

我有一张MySQL表格,里面有很多纬度/经度的地方。另一方面,我有一个客户端javascript/html5页面,它向服务器发送坐标

使用客户的坐标,我希望能够找到最近的位置。实现这一目标最简单的方法是什么

类似于
SELECT*的地方是p,p.纬度在'49.8330001'附近,p.经度在'-119.45600'附近将非常好

我在这里遇到了一些问题,但他们没有给我一个正确的答案。我读到了MySQL的空间扩展和其他一些SQL查询,这些查询可能会起到作用,但似乎没有什么是真正“简单”的,因此我认为可以有一种更标准化的方法来实现这一点,并提供一些示例


任何人都有这方面的经验吗?

为什么不计算点与阵列中数据库中每个坐标之间的距离呢。然后,在这个数组中选择最小值。

为什么不创建一个公差,比如坐标的5%,然后执行

$latplus5percent = $lat + .5*$lat; 
$latminus5percent = $lat - .5*$lat;
WHERE p.latitude BETWEEN $latplus5percent AND $latminus5percent 

[编辑:格式化]

您可以使用四键。这是一个基于空间填充曲线的空间索引。您可以下载我的php类hilbert curve@phpclasses.org。

下面的php代码使用MySQL并找到离您的点最近的位置坐标

它创建一个坐标数组

// Prepare statements
$stmt = $dbh->prepare("SELECT  name, lat, lng,
           ( 3959 * acos( cos( radians(?) ) * cos( radians( lat ) )
           * cos( radians( lng ) - radians(?) ) + sin( radians(?) ) 
           * sin( radians( lat ) ) ) ) AS distance FROM table HAVING distance < ? 
           ORDER BY distance ASC LIMIT 0 , 20");
// Assign parameters
$stmt->bindParam(1,$center_lat);
$stmt->bindParam(2,$center_lng);
$stmt->bindParam(3,$center_lat);
$stmt->bindParam(4,$radius);
//Execute query
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
$rows = array();
while($row = $stmt->fetch()) {
 $rows[] = $row;
}
echo json_encode($rows);
exit;
//准备语句
$stmt=$dbh->prepare(“选择名称、纬度、液化天然气、,
(3959*acos(弧度(?)*cos(弧度(纬度))
*cos(弧度(lng)-弧度(?)+sin(弧度(?)
*sin(弧度(lat)))作为距离表的距离?
按距离订购ASC限值0,20“;
//指定参数
$stmt->bindParam(1$center\u lat);
$stmt->bindParam(2$center_lng);
$stmt->bindParam(3$center\u lat);
$stmt->bindParam(4$radius);
//执行查询
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
$rows=array();
而($row=$stmt->fetch()){
$rows[]=$row;
}
echo json_编码($rows);
出口
此标记是使用此查询生成的

是否“接近”准确?最简单的方法是从数据库位置中减去当前位置,并按最小差异排序,例如,
选择abs(纬度-$lat)作为lat,abs(经度-$lon)作为$log。。。按lat desc、lon desc下单
键入物品。没有复杂的数学,只是一些减法。