【问题标题】:PHP - calculate latitude & longitude which is nearer than 50 kmPHP - 计算接近 50 公里的经纬度
【发布时间】:2016-10-01 09:22:23
【问题描述】:

我有这些数据:

纬度:50.223137

经度:18.679558

现在我想在 PHP 中创建一个特殊函数,它能够计算小于 50 公里的最小纬度和经度以及最大纬度和经度。最后我想得到 4 个参数,我想在简单的 SQL 查询中使用这些参数:SELECT * FROM table WHERE lat >= [min_lat] AND lng >= [min_lng] AND lat <= [max_lat] AND lng <= [max_lng];

我知道,我只使用一个 sql 查询就可以做到这一点:latitude/longitude find nearest latitude/longitude - complex sql or complex calculation 但我的数据库中现在有 20.000.000 条记录,而且它还在增长。我还必须在我的 sql 数据库中搜索其他内容,所以我想基于 PHP 计算所有内容,然后以这种方式在 sql 中搜索:SELECT * FROM table WHERE lat >= [min_lat] AND lng >= [min_lng] AND lat <= [max_lat] AND lng <= [max_lng];,因为我认为 - 这是更快的方式。

我还发现了这个函数:https://www.geodatasource.com/developers/php,这很好,但我想以其他方式创建该函数 - 我想声明为参数:lat、lng 和距离(例如:50 公里)。最后我想得到 4 个参数 - min_lat, min_lng, max_lat, max_lng。

谁能帮我创建这个函数?

谢谢。

【问题讨论】:

  • 您需要距离您的位置精确的 50 公里半径吗?
  • 这就是例子。它可以是 50 公里、20 公里、10 公里、80 公里等。我想声明该参数(以及关于起点的纬度和经度)。
  • 您知道 1 度在 99% 的精度下大约是 55 公里,因此您可以通过将您的公里数除以 55 来添加和减去所产生的度数,以获得您所在位置的最大和最小纬度和经度跨度>
  • 55 公里 ?? @Jim Lewis 说,这是 110.5 公里:stackoverflow.com/questions/1253499/…
  • 你说得对,110km 大约是 1 度,抱歉....

标签: php google-maps


【解决方案1】:

您可以尝试使用此代码。做一些基准测试。

<?php

$lat = 50.223137; //latitude
$lon = 18.679558; //longitude
$distance = 50; //your distance in KM
$R = 6371; //constant earth radius. You can add precision here if you wish

$maxLat = $lat + rad2deg($distance/$R);
$minLat = $lat - rad2deg($distance/$R);
$maxLon = $lon + rad2deg(asin($distance/$R) / cos(deg2rad($lat)));
$minLon = $lon - rad2deg(asin($distance/$R) / cos(deg2rad($lat)));

echo $maxLat, "<br>", $minLat, "<br>", $maxLon, "<br>", $minLon;

输出:

50.672797802959
49.773476197041
19.382380506501
17.976735493499

【讨论】:

  • 解决方案很棒。有一个注释。如果$distance 大于$R,您将在minLng 和maxLng 时得到NaN,这会导致将来使用失败。你可以在进入计算之前用一个简单的 if 语句来解决这个问题:$distance = $distance &gt;= $R ? $R : $distance
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多