最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PHP中經(jīng)緯度坐標(biāo)相關(guān)計算方法小結(jié)

 更新時間:2024年04月20日 09:33:48   作者:超酷的站長  
這篇文章主要為大家詳細介紹了PHP中經(jīng)緯度坐標(biāo)相關(guān)計算方法的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

1. 前言

想要測試本文提供的幾個功能函數(shù),可以使用下面這個數(shù)據(jù)表結(jié)構(gòu)及其數(shù)據(jù)

CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用戶id',
`name` varchar(60) DEFAULT NULL COMMENT '昵稱',
`longitude` varchar(64) DEFAULT NULL COMMENT '經(jīng)度',
`latitude` varchar(64) DEFAULT NULL COMMENT '緯度',
`remark` varchar(50) DEFAULT NULL COMMENT '備注',
`distance` varchar(20) DEFAULT NULL COMMENT '距離',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='用戶表';
INSERT INTO `user` (`name`, `longitude`, `latitude`, `remark`, `distance`) VALUES ('中海九號公館', '113.899529', '22.60063', '深圳市寶安區(qū)中海九號公館', '3.66km');
INSERT INTO `user` (`name`, `longitude`, `latitude`, `remark`, `distance`) VALUES ('平巒山公園', '113.876462', '22.608322', '深圳市寶安區(qū)平巒山公園', '2.88km');
INSERT INTO `user` (`name`, `longitude`, `latitude`, `remark`, `distance`) VALUES ('鐵仔山公園', '113.86359', '22.592355', '深圳市寶安區(qū)鐵仔山公園', '1.16km');
INSERT INTO `user` (`name`, `longitude`, `latitude`, `remark`, `distance`) VALUES ('寶安公園', '113.902671', '22.58621', '深圳市寶安區(qū)寶安公園', '3.45km');

本文內(nèi)容測試各個功能函數(shù)時,使用的當(dāng)前位置坐標(biāo)均為:

// 深圳市寶安區(qū)西鄉(xiāng)街道九方廣場
$longitude = '113.869205';//經(jīng)度
$latitude = '22.583286';//緯度

2. 計算經(jīng)緯度坐標(biāo)間的距離

計算經(jīng)緯度坐標(biāo)間的距離 功能函數(shù) (前四個參數(shù)為兩組經(jīng)緯度坐標(biāo))

/**
* 計算經(jīng)緯度坐標(biāo)間的距離
* @param $lng1 經(jīng)度
* @param $lat1 緯度
* @param $lng2 經(jīng)度
* @param $lat2 緯度
* @param $lang 語言
*/
function get_distance($lng1, $lat1, $lng2, $lat2, $lang = 'en')
{
// 地球的近似半徑(單位:米)
$earthRadius = 6367000;
// 將這些度數(shù)轉(zhuǎn)換為弧度以使用公式
$lat1 = ($lat1 * pi()) / 180;
$lng1 = ($lng1 * pi()) / 180;
$lat2 = ($lat2 * pi()) / 180;
$lng2 = ($lng2 * pi()) / 180;
// 使用 Haversine 公示計算距離
// http://en.wikipedia.org/wiki/Haversine_formula
$calcLongitude = $lng2 - $lng1;
$calcLatitude = $lat2 - $lat1;
$stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
$stepTwo = 2 * asin(min(1, sqrt($stepOne)));
// 兩個經(jīng)緯度坐標(biāo)的距離(單位: 米)
$calculatedDistance = round($earthRadius * $stepTwo);
// 距離單位
$language = [
'en' => ['m' => 'm', 'km' => 'km'],
'cn' => ['m' => '米', 'km' => '公里'],
];
if (!isset($language[$lang])) throw new \Exception('不支持的語言:' . $lang);
foreach ($language[$lang] as $key => $value) $$key = $value;
// 兩個坐標(biāo)間的距離,單位:米
$distance = round($calculatedDistance);
// 距離單位轉(zhuǎn)換:超出 1000m 時單位轉(zhuǎn)為km
if ($distance < 1000) {
$distance .= $m;
} else {
$distance = floatval(number_format($distance / 1000, 2)) . $km;
}
return $distance; // 返回單位轉(zhuǎn)換后的距離
}

使用示例:

我在 九方廣場,手機上的高德地圖導(dǎo)航至 中海九號公館 顯示的距離為 3.6公里,計算結(jié)果還是很準(zhǔn)確的

// 深圳市寶安區(qū)西鄉(xiāng)街道九方廣場: 113.869205, 22.583286
// 深圳市寶安區(qū)西鄉(xiāng)街道中海九號公館: 113.899529, 22.60063
$distance = get_distance(113.869205, 22.583286, 113.899529, 22.60063);
echo $distance; //3.66km

3. 根據(jù)經(jīng)緯度坐標(biāo)距離排序

項目中經(jīng)常有距離顯示數(shù)據(jù)的場景,根據(jù)距離排序,越近越靠前顯示;比如: 店鋪地址、房源信息等。代碼示例:

// 當(dāng)前坐標(biāo)
$longitude = '113.869205';
$latitude = '22.583286';
// 數(shù)據(jù)庫中經(jīng)緯度字段分別為:longitude、latitude
$field = '*,( 2 * 6378.137 * ASIN( SQRT( POW( SIN( PI() * (' . $longitude . ' - longitude) / 360 ), 2 ) + COS(PI() * ' . $latitude . ' / 180) * COS(latitude * PI() / 180) * POW( SIN( PI() * (' . $latitude . ' - latitude) / 360 ), 2 ) ) ) ) AS juli';
// 根據(jù)距離升序查詢(越近越靠前)
$order = 'juli asc,id desc';
// 查詢數(shù)據(jù)
Db::name('user')->field($field)->order($order)->select();

4. 經(jīng)緯度范圍查詢

經(jīng)緯度范圍計算 功能函數(shù)

/**
* 經(jīng)緯度范圍計算
* @param $longitude 經(jīng)度
* @param $latitude 緯度
* @param $radius 半徑(米)
* @return array
*/
function get_around($longitude, $latitude, $radius)
{
$PI = 3.14159265;
$degree = (24901 * 1609) / 360.0;
$dpmLat = 1 / $degree;
$radiusLat = $dpmLat * $radius;
$minLat = $latitude - $radiusLat;
$maxLat = $latitude + $radiusLat;
$mpdLng = $degree * cos($latitude * ($PI / 180));
$dpmLng = 1 / $mpdLng;
$radiusLng = $dpmLng * $radius;
$minLng = $longitude - $radiusLng;
$maxLng = $longitude + $radiusLng;
return compact('minLat', 'maxLat', 'minLng', 'maxLng');
}

使用示例

查詢 3 公里內(nèi)的數(shù)據(jù)。首先,根據(jù)當(dāng)前位置獲取 3 公里內(nèi)的經(jīng)緯度范圍,然后帶上查詢條件查詢數(shù)據(jù)庫即可

$longitude = 113.869205; //經(jīng)度
$latitude = 22.583286; //緯度
$radius = 3000; //單位:米
// 經(jīng)緯度范圍
$around = get_around($longitude, $latitude, $radius);
// 構(gòu)造查詢條件
// 數(shù)據(jù)庫經(jīng)緯度字段分別為:longitude,latitude
$where = [
['longitude', '>=', $around['minLng']],
['longitude', '<=', $around['maxLng']],
['latitude', '>=', $around['minLat']],
['latitude', '<=', $around['maxLat']],
];
// 按照經(jīng)緯度范圍查詢數(shù)據(jù)
// 建議使用 where 的閉包查詢(TP6.0)
// 因為閉包可以生成以下SQL,標(biāo)明這幾個查詢條件是一個整體,便于后期維護
// SQL語句示例: SELECT * FROM `user` WHERE ( 經(jīng)緯度查詢條件 ) and 其他條件
$data = Db::name('user')
->where(function ($query) use ($where) {
$query->where($where);
})
->select();

到此這篇關(guān)于PHP中經(jīng)緯度坐標(biāo)相關(guān)計算方法小結(jié)的文章就介紹到這了,更多相關(guān)PHP經(jīng)緯度坐標(biāo)計算內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PHP微信發(fā)送推送消息亂碼的解決方法

    PHP微信發(fā)送推送消息亂碼的解決方法

    今天小編就為大家分享一篇關(guān)于PHP微信發(fā)送推送消息亂碼的解決方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • PHP+MySQL5.0中文亂碼解決方法

    PHP+MySQL5.0中文亂碼解決方法

    PHP+MySQL5.0中文亂碼解決方法...
    2006-11-11
  • PHP日志LOG類定義與用法示例

    PHP日志LOG類定義與用法示例

    這篇文章主要介紹了PHP日志LOG類定義與用法,結(jié)合實例形式分析了日志log的具體定義及使用方法,涉及php文件讀寫、日期時間及字符串等相關(guān)操作技巧,需要的朋友可以參考下
    2018-09-09
  • 使用PHPExcel導(dǎo)出Excel表

    使用PHPExcel導(dǎo)出Excel表

    這篇文章主要為大家詳細介紹了使用PHPExcel導(dǎo)出Excel表,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • 自制PHP框架之路由與控制器

    自制PHP框架之路由與控制器

    本文給大家介紹的是自制php框架的第一步,學(xué)會使用路由和控制器,非常的詳細,有需要的小伙伴可以參考下
    2017-05-05
  • PHP函數(shù)參數(shù)傳遞的方式整理

    PHP函數(shù)參數(shù)傳遞的方式整理

    在本篇文章里小編給大家整理的是關(guān)于PHP函數(shù)參數(shù)傳遞的方式整理內(nèi)容,需要的朋友們可以參考下。
    2020-03-03
  • 給初學(xué)者的30條PHP最佳實踐(荒野無燈)

    給初學(xué)者的30條PHP最佳實踐(荒野無燈)

    給初學(xué)者的30條PHP最佳實踐,需要的朋友可以參考下。
    2011-08-08
  • 簡單談?wù)刦avicon

    簡單談?wù)刦avicon

    瀏覽器調(diào)用Favicon的原則是首先在網(wǎng)頁所在的目錄下尋找Favicon.ico文件,如果沒有,便到網(wǎng)站的根目錄下尋找。那么我們可以自定義favicon的位置嗎?今天我們就來探討下
    2015-06-06
  • PHP+shell實現(xiàn)多線程的方法

    PHP+shell實現(xiàn)多線程的方法

    這篇文章主要介紹了PHP+shell實現(xiàn)多線程的方法,實例分析了php實現(xiàn)多線程的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • 由php中字符offset特征造成的繞過漏洞詳解

    由php中字符offset特征造成的繞過漏洞詳解

    這篇文章主要給大家介紹了關(guān)于由php中字符offset特征造成的繞過漏洞的相關(guān)資料,文中不僅詳細介紹了該漏洞的形成,更重要的是介紹了修復(fù)方式,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-07-07

最新評論

汶上县| 广水市| 九龙县| 江都市| 双牌县| 潼南县| 黄平县| 天祝| 阳城县| 磐石市| 新巴尔虎左旗| 吴川市| 昌邑市| 邳州市| 通榆县| 吉林省| 和平区| 仁布县| 康定县| 登封市| 辽源市| 城固县| 遵义县| 通城县| 泽州县| 石渠县| 东丰县| 昆明市| 老河口市| 宜兴市| 客服| 达孜县| 广安市| 永济市| 蒲江县| 左云县| 西平县| 永康市| 沙坪坝区| 长乐市| 吴忠市|