【发布时间】:2017-06-05 07:47:49
【问题描述】:
我有纬度和经度值,想在 50 英里处找到另一个纬度值。怎么做?任何公式或自定义函数可以在 php 中得到它?
【问题讨论】:
-
一句话,没有。 PHP 没有针对这类事情的内置函数。
标签: php geolocation
我有纬度和经度值,想在 50 英里处找到另一个纬度值。怎么做?任何公式或自定义函数可以在 php 中得到它?
【问题讨论】:
标签: php geolocation
在 php 中,您可以通过获取记录并使用以下公式来实现。 但我希望你使用查询来解决这个问题。效率更高。
function getNearestUsers($givenLat,$givenLng)
{
$res = [];
$recs = getAllTheRecordsFromDb();
foreach($recs as $r)
{
$distance = sqrt(POW((69.1 * ($r['lat'] - $givenLat)),2) + POW((69.1 * ($givenLng - $r['lng']) * cos($r['lat'] / 57.3)),2));
if($distance<=50) //50 miles
{
//some code
}
}
}
假设您有一个包含用户 ID、纬度和经度的用户表。下面是 sql 查询,用于获取距离给定纬度和经度 50 英里 半径内的用户。
SELECT userId, latitude, longitude, SQRT(
POW(69.1 * (latitude - [givenLat]), 2) +
POW(69.1 * ([givenLng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 50 ORDER BY distance;
您可以通过参考以下链接获得更多答案: latitude/longitude find nearest latitude/longitude - complex sql or complex calculation
【讨论】:
此查询方法基于google map store locator api。
请参考这个网站:
假设你有一个 lat 和 lang 的变量 $纬度; $lng;
让我们假设这些变量有它的坐标。
在您的查询中执行以下操作:
SELECT id, lat, lng ( 3959 * acos( cos( 弧度($lat) ) * cos( 弧度( lat ) ) * cos( 弧度( lng ) - 弧度($lng) ) + sin(弧度($lat) ) * sin( 弧度( lat ) ) ) ) AS 距离标记 HAVING distance
结果将返回小于或等于 50 英里的 id、lat 和 lng 坐标。
P.S 3959 是返回里程的单位。
【讨论】: