gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:41:32 25 4
gpt4 key购买 nike

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

所以这是一个简单的前提:php 文件接收到两个包含 lat 和 lng 的 get 变量。找到 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 索引,查询应该相对较快。但是,关于该做什么的答案之间存在一些争论。一些用户设置了计算 haversine 距离的函数。有些人在查询中做 haversine,它看起来非常困惑。有些偷工减料取决于您想要答案的准确程度。大多数 haversine 答案似乎假设开发人员将 lat/lng 存储为 double ,我不确定最好将此数学与点索引一起使用。我已经查看了空间扩展的文档,但无法将其拼凑在一起。所以问题是,该怎么做。说明查询及其具有的准确性级别以及显示您预定义的任何 sql 函数会很有帮助。这个问题假设我们寻找最接近特定经纬度的点,而不是搜索特定距离内的点(例如 20 公里内)。我特别希望在 n 100 到 500 之间给出接近 100% 正确性的答案。

最佳答案

好的,所以我最终使用了半正弦函数。它实际上非常快,将它用作获取积分的 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 米,请添加“HAVING distance < 10”。

关于PHP和MySQL使用SPATIAL扩展获取n个最近点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21213770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com