Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.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和MySQL使用空间扩展获取n个最近点_Php_Mysql_Sql_Google Maps_Geospatial - Fatal编程技术网

PHP和MySQL使用空间扩展获取n个最近点

PHP和MySQL使用空间扩展获取n个最近点,php,mysql,sql,google-maps,geospatial,Php,Mysql,Sql,Google Maps,Geospatial,我意识到这个问题已经被问了很多次了,但我看到的每个答案似乎都非常局限于OP想要实现的目标。这就是为什么我要寻找一个简单的答案,即使用-90到90之间的纬度值,以及使用-180到180之间的经度 这里有一个简单的前提:php文件接收到两个get变量,其中包含lat和lng。按从最近到最远的顺序查找n个最近点 让我们设置一个简单的表,它有一个称为location的索引点 CREATE TABLE `trees` ( `TREEID` int(11) unsigned NOT NULL AUTO

我意识到这个问题已经被问了很多次了,但我看到的每个答案似乎都非常局限于OP想要实现的目标。这就是为什么我要寻找一个简单的答案,即使用-90到90之间的纬度值,以及使用-180到180之间的经度

这里有一个简单的前提:php文件接收到两个get变量,其中包含lat和lng。按从最近到最远的顺序查找n个最近点

让我们设置一个简单的表,它有一个称为location的索引点

CREATE TABLE `trees` 
(
  `TREEID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `location` point NOT NULL,
  PRIMARY KEY (`TREEID`),
  SPATIAL KEY `location` (`location`)
) ENGINE=MyISAM;
现在我们想使用php

<?php

//Setup variables
$lat = trim(mysql_prep($_GET['lat'])); 
$lng = trim(mysql_prep($_GET['lng'])); 
$n   = 100;

//Make sure they are valid lat and lng
if (!is_numeric($lat) || floatval($lat) < -90  || floatval($lat) > 90 || 
    !is_numeric($lng) || floatval($lng) < -180 || floatval($lng) > 180  )
{
        die("Invalid lng and lat coordinates.");
}
else
{
        //Lets find the n closest points to our $lat, $lng
        $get_trees = "Select * FROM trees WHERE _____?______ Order by _?_ ASC";
        $result = mysql_query($get_trees , SQL_Connection());   
}   


?>


现在,根据我的理解,通过对位置进行空间mysql索引,查询应该相对较快。然而,对于如何做,答案之间存在一些争论。一些用户设置了计算哈弗线距离的函数。有些人确实在查询中找到了正确的答案,看起来非常混乱。一些捷径取决于你想要答案的准确程度。大多数哈弗森回答似乎假设开发商将lat/lng存储为双倍,我不确定最好将此数学与点指数一起使用。我已经查阅了文档中关于空间扩展的内容,但还没有把它们拼凑起来。所以问题是,该怎么办。说明查询及其准确性级别,以及显示预定义的任何sql函数都会很有帮助。该问题假设我们寻找距离特定lat lng最近的点,而不是搜索特定距离内的点(例如20公里内)。我特别想找到一个能给出100%正确率的答案,对于介于100和500之间的n。

好的,所以我最终使用了哈弗森。它实际上相当快,将其作为ajax请求来获取积分是一个好主意

$get_trees = "Select TREEID,  X(location) as lat, Y(location) as lng,
(6371000 * 
        acos( 
          cos( radians($lat) )
        * cos( radians( X(location) ) ) 
        * cos( radians( Y(location) ) - radians($lng) )
        + sin( radians($lat) ) 
        * sin( radians( X(location) ) ) ) ) AS distance 


FROM trees ORDER BY distance ASC LIMIT 0 , $n;";

$result = mysql_query($get_trees , SQL_Connection());   

while ($record = mysql_fetch_assoc ($result))
{
    $tree_identity = $record['TREEID'];
    $distance_in_meters = $record['distance'];
    $tree_lat = $record['lat'];
    $tree_lng = $record['lng'];
}
由于公式假设地球是一个球体(恒定半径),因此可以使用以下半径值:

对于仪表,使用6371000

对于英里数,使用3959

对于公里数,使用6371


我希望有人会觉得这很有帮助,或者至少会让你知道如何解决这个问题。如果您希望点位于特定距离内,如10米,请添加“距离<10”

更简单的选择可在