根据纬度和经度获取半径内的邮政编码
Get zipcodes within radius based on latitude and longitude
我正在尝试获取所提供的 latitude/longitude 坐标 160 公里半径范围内的邮政编码。我已经有一个邮政编码、纬度和经度的数据库,我的问题是计算半径。
我一直在查看如何执行此操作的示例,这就是我想出的。但显然出了点问题,因为根据 $dist 变量,我得到的距离约为 9000 公里。
public function getClose($latitude, $longitude) {
$latitudes = [floor($latitude)-2, ceil($latitude)+2];
$locations = Zipcode::whereBetween('latitude', $latitudes)->get();
foreach ($locations as $location) {
$venueLat = $location->latitude;
$venueLng = $location->longititude;
$latDistance = deg2rad($latitude - $venueLat);
$lngDistance = deg2rad($longitude - $venueLng);
$a = (sin($latDistance / 2) * sin($latDistance / 2)) + (cos(deg2rad($latitude))) * (cos(deg2rad($venueLat))) * (sin($lngDistance / 2)) * (sin($lngDistance / 2));
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
// Distance between 2 points in km. 6371 = Earths radius
$dist = 6371 * $c;
var_dump($dist); // This is the line saying it's about 9000km away
if ($dist < 160){
var_dump($location->zip);
}
}
}
该代码主要基于对相关问题的回答:
但是,显然有些地方没有翻译正确,或者我误解了什么。任何帮助将不胜感激!
这是我最终使用的有效代码。一些事情发生了变化,但最大的区别是公式。如您所见,它们有很大的不同。我不是很擅长数学,所以我真的不知道有什么区别,但我知道这个很管用。
public function getClose($latitude, $longitude) {
$latitudes = [floor($latitude)-2, ceil($latitude)+2];
$longitudes = [floor($longitude)-1, ceil($longitude)+1];
$locations = Zipcode::whereBetween('latitude', $latitudes)->whereBetween('longitude', $longitudes)->get();
$zips = [];
foreach ($locations as $location) {
$theta = $longitude - $location->longitude;
$dist = sin(deg2rad($latitude)) * sin(deg2rad($location->latitude)) + cos(deg2rad($latitude)) * cos(deg2rad($location->latitude)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
if ($miles <= 100){
$zips[] = $location->zip;
}
}
}
我正在尝试获取所提供的 latitude/longitude 坐标 160 公里半径范围内的邮政编码。我已经有一个邮政编码、纬度和经度的数据库,我的问题是计算半径。
我一直在查看如何执行此操作的示例,这就是我想出的。但显然出了点问题,因为根据 $dist 变量,我得到的距离约为 9000 公里。
public function getClose($latitude, $longitude) {
$latitudes = [floor($latitude)-2, ceil($latitude)+2];
$locations = Zipcode::whereBetween('latitude', $latitudes)->get();
foreach ($locations as $location) {
$venueLat = $location->latitude;
$venueLng = $location->longititude;
$latDistance = deg2rad($latitude - $venueLat);
$lngDistance = deg2rad($longitude - $venueLng);
$a = (sin($latDistance / 2) * sin($latDistance / 2)) + (cos(deg2rad($latitude))) * (cos(deg2rad($venueLat))) * (sin($lngDistance / 2)) * (sin($lngDistance / 2));
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
// Distance between 2 points in km. 6371 = Earths radius
$dist = 6371 * $c;
var_dump($dist); // This is the line saying it's about 9000km away
if ($dist < 160){
var_dump($location->zip);
}
}
}
该代码主要基于对相关问题的回答:
但是,显然有些地方没有翻译正确,或者我误解了什么。任何帮助将不胜感激!
这是我最终使用的有效代码。一些事情发生了变化,但最大的区别是公式。如您所见,它们有很大的不同。我不是很擅长数学,所以我真的不知道有什么区别,但我知道这个很管用。
public function getClose($latitude, $longitude) {
$latitudes = [floor($latitude)-2, ceil($latitude)+2];
$longitudes = [floor($longitude)-1, ceil($longitude)+1];
$locations = Zipcode::whereBetween('latitude', $latitudes)->whereBetween('longitude', $longitudes)->get();
$zips = [];
foreach ($locations as $location) {
$theta = $longitude - $location->longitude;
$dist = sin(deg2rad($latitude)) * sin(deg2rad($location->latitude)) + cos(deg2rad($latitude)) * cos(deg2rad($location->latitude)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
if ($miles <= 100){
$zips[] = $location->zip;
}
}
}