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

mysql使用Haversine 公式和ST_Distance_Sphere 函數(shù)實(shí)現(xiàn)附近的人功能

 更新時(shí)間:2023年08月25日 10:00:47   作者:水滴技術(shù)  
使用 MySQL 來(lái)實(shí)現(xiàn)“附近的人”功能,可以通過(guò)Haversine 公式和ST_Distance_Sphere 函數(shù)兩種方式來(lái)實(shí)現(xiàn),這篇文章主要介紹了mysql實(shí)現(xiàn)附近的人功能,需要的朋友可以參考下

對(duì)于“附近的人”功能,在生活中是比較常用的,像外賣(mài)app附近的美食,共享單車(chē)app里附近的車(chē)輛等等。我們之前使用 ElasticSearch 實(shí)現(xiàn)過(guò)該功能,本篇文章我們介紹如何通過(guò) MySQL 來(lái)實(shí)現(xiàn)“附近的人”功能。

在這里插入圖片描述

ST_Distance_Sphere 函數(shù)

在 MySQL 中,ST_Distance_Sphere 函數(shù)是一個(gè)地理空間函數(shù),用于計(jì)算兩個(gè)地理位置之間的球面距離。它基于球體模型進(jìn)行計(jì)算,并返回兩個(gè)點(diǎn)之間的距離結(jié)果。

ST_Distance_Sphere 函數(shù)的語(yǔ)法如下:

ST_Distance_Sphere(point1, point2)

其中,point1point2 是表示地理位置的 POINT 類(lèi)型的參數(shù)。

示例一:計(jì)算北京站到北京西站的距離

以下是一個(gè)使用 ST_Distance_Sphere 函數(shù)計(jì)算球面距離的示例:

-- 北京站 116.427322,39.902822    北京西站  116.322083,39.8949
SELECT ST_Distance_Sphere(
          POINT(116.427322,39.902822), 
          POINT(116.322083,39.8949)
       ) AS distance;

在上述示例中,我們使用 POINT 類(lèi)型的參數(shù)表示兩個(gè)地理位置點(diǎn),分別是北京站(經(jīng)度 116.427322,緯度 39.902822)和北京西站(經(jīng)度 116.322083,緯度 39.8949)。然后,我們調(diào)用 ST_Distance_Sphere 函數(shù)來(lái)計(jì)算這兩個(gè)點(diǎn)之間的球面距離,并將結(jié)果命名為 distance。

返回結(jié)果:

distance
-----------------------
9020.641566063772

ST_Distance_Sphere 函數(shù)的返回值是以米為單位的球面距離,可以根據(jù)需要將結(jié)果轉(zhuǎn)換為千米。上面示例中可以看出,北京站到北京西站的距離約為9公里。

需要注意的是,使用 ST_Distance_Sphere 函數(shù)進(jìn)行球面距離計(jì)算需要 MySQL 版本 8.0.17 或更高版本,并且需要在數(shù)據(jù)庫(kù)中啟用地理空間功能。

示例二:查詢(xún)“附近的人”

要實(shí)現(xiàn)"附近的人"功能,可以使用MySQL的ST_Distance_Sphere 函數(shù)和索引來(lái)處理地理位置數(shù)據(jù)。下面是一個(gè)基本的實(shí)現(xiàn)步驟:

(1)創(chuàng)建GEO測(cè)試表:其中包括id 主鍵、location地理位置信息。地理位置信息可以使用POINT類(lèi)型來(lái)表示。

CREATE TABLE `test_geo` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `location` point DEFAULT NULL,
  PRIMARY KEY (`id`)
);

(2)添加地理位置數(shù)據(jù):向表中插入地理位置數(shù)據(jù)。

INSERT INTO `test_geo`(`id`, `location`) 
VALUES 
  (1, POINT(116.39775,39.92029)),
  (2, POINT(116.395947,39.916208),
  (3, POINT(116.410624,39.91871)),
  (4, POINT(116.397235,39.909823)),
  (5, POINT(116.385304,39.917591)),
  (6, POINT(116.396548,39.92832))
;

(3)創(chuàng)建地理索引:為該表的地理位置字段創(chuàng)建索引,以便進(jìn)行空間查詢(xún)。

CREATE SPATIAL INDEX idx_location ON test_geo (location);

(4)查詢(xún)附近的人:使用地理空間函數(shù)進(jìn)行附近的人查詢(xún)。

  SELECT
    *,
    ST_Distance_Sphere ( POINT ( 116.410539, 39.912983 ), location ) AS distance -- 返回距離,單位M
  FROM
    test_geo 
  WHERE
    ST_Distance_Sphere ( POINT ( 116.410539, 39.912983 ), location ) <= 2000 -- 兩公里內(nèi)
  ORDER BY
    distance -- 由近及遠(yuǎn)排序
  ; 

上述查詢(xún)使用了ST_Distance_Sphere函數(shù)來(lái)計(jì)算兩個(gè)地理位置之間的球面距離,POINT ( 116.410539, 39.912983 ) 是你的坐標(biāo),2000是查詢(xún)半徑。這個(gè)查詢(xún)將返回在給定半徑范圍內(nèi)的數(shù)據(jù)。

查詢(xún)結(jié)果:

在這里插入圖片描述

Haversine 公式

ST_Distance_Sphere 函數(shù)要求MySQL 的版本為 8.0.17 或更高,對(duì)于低版本的 MySQL 該怎么辦呢?我們可以使用 Haversine 公式來(lái)實(shí)現(xiàn)。

Haversine 是一種常用的球面三角函數(shù),用于計(jì)算兩個(gè)球面位置之間的球面距離。它是根據(jù)地球的球體模型進(jìn)行計(jì)算的,可以用于近似計(jì)算兩個(gè)經(jīng)緯度坐標(biāo)之間的球面距離。

Haversine 公式基于球面三角學(xué)和經(jīng)緯度之間的關(guān)系。它的公式如下:

a = sin2(Δlat/2) + cos(lat1) * cos(lat2) * sin2(Δlon/2)
c = 2 * atan2(√a, √(1-a))
d = R * c

其中:

  • lat1lat2 是兩個(gè)點(diǎn)的緯度(以弧度表示)。
  • lon1lon2 是兩個(gè)點(diǎn)的經(jīng)度(以弧度表示)。
  • Δlat 是緯度之差,即 lat2 - lat1。
  • Δlon 是經(jīng)度之差,即 lon2 - lon1。
  • R 是地球的半徑,常用的單位是千米或英里。

通過(guò)應(yīng)用 Haversine 公式,可以近似計(jì)算出兩個(gè)經(jīng)緯度坐標(biāo)之間的球面距離。這個(gè)公式考慮了球體的曲率,因此對(duì)于較短距離的計(jì)算具有較高的精度。然而,對(duì)于較長(zhǎng)距離,特別是跨越大片陸地或海洋的距離,Haversine 公式可能會(huì)引入一定的誤差。

在使用 Haversine 公式進(jìn)行計(jì)算時(shí),需要注意輸入的經(jīng)緯度必須使用弧度表示。如果經(jīng)緯度是以度數(shù)表示,需要將其轉(zhuǎn)換為弧度形式進(jìn)行計(jì)算。

示例一:計(jì)算北京站到北京西站的距離

以下是一個(gè)使用Haversine公式計(jì)算球面距離的示例:

-- 北京站 116.427322,39.902822    北京西站  116.322083,39.8949
select (2 * 6371 * ASIN(SQRT(
        POWER(SIN((RADIANS(39.902822) - RADIANS(39.8949)) / 2), 2) +
        COS(RADIANS(39.902822)) * COS(RADIANS(39.8949)) * POWER(SIN((RADIANS(116.427322) - RADIANS(116.322083)) / 2), 2)
    ))) AS distance

在上述示例中,我們分別將北京站(經(jīng)度 116.427322,緯度 39.902822)和北京西站(經(jīng)度 116.322083,緯度 39.8949)的經(jīng)緯度數(shù)據(jù)帶入Haversine公式中,然后就可以計(jì)算出這兩個(gè)點(diǎn)之間的球面距離,并將結(jié)果命名為 distance

返回結(jié)果:

distance
-----------------------
9.020661388581411

Haversine公式的返回值是以千米為單位的球面距離。

示例二:查詢(xún)“附近的人”

我們可以使用Haversine公式來(lái)實(shí)現(xiàn)"附近的人"功能,下面是一個(gè)基本的實(shí)現(xiàn)步驟:

(1)創(chuàng)建GEO測(cè)試表:其中包括id 主鍵、地理位置信息。地理位置信息可以使用lng表示經(jīng)度,lat表示緯度。

CREATE TABLE `test_geo` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `lng` double DEFAULT NULL,
  `lat` double DEFAULT NULL,
  PRIMARY KEY (`id`)
);

(2)添加地理位置數(shù)據(jù):向表中插入地理位置數(shù)據(jù)。

INSERT INTO `test_geo`(`id`, `lng`, `lat`) 
VALUES 
  (1, 116.39775, 39.92029),
  (2, 116.395947, 39.916208),
  (3, 116.410624, 39.91871),
  (4, 116.397235, 39.909823),
  (5, 116.385304, 39.917591),
  (6, 116.396548, 39.92832)
;

(3)查詢(xún)附近的人:使用Haversine公式進(jìn)行附近的人查詢(xún)。

 SELECT
  *,
  (2 * 6371 * ASIN(
      SQRT(
        POWER( SIN(( RADIANS( 39.912983 ) - RADIANS( lat )) / 2 ), 2 ) + COS(
          RADIANS( 39.912983 )) * COS(
        RADIANS( lat )) * POWER( SIN(( RADIANS( 116.410539 ) - RADIANS( lng )) / 2 ), 2 ) 
      ))) AS distance  -- 返回距離,單位KM
FROM
  test_geo 
WHERE
  (2 * 6371 * ASIN(
      SQRT(
        POWER( SIN(( RADIANS( 39.912983 ) - RADIANS( lat )) / 2 ), 2 ) + COS(
          RADIANS( 39.912983 )) * COS(
        RADIANS( lat )) * POWER( SIN(( RADIANS( 116.410539 ) - RADIANS( lng )) / 2 ), 2 ) 
      ))) <= 2  -- 兩公里內(nèi)
ORDER BY
  distance -- 由近及遠(yuǎn)排序
;

上述查詢(xún)使用了Haversine公式來(lái)計(jì)算兩個(gè)地理位置之間的球面距離,116.410539, 39.912983 是你的坐標(biāo),2是查詢(xún)半徑。這個(gè)查詢(xún)將返回在給定半徑范圍內(nèi)的數(shù)據(jù)。

查詢(xún)結(jié)果:

在這里插入圖片描述

總結(jié)

使用 MySQL 來(lái)實(shí)現(xiàn)“附近的人”功能,可以通過(guò)Haversine 公式和ST_Distance_Sphere 函數(shù)兩種方式來(lái)實(shí)現(xiàn)。對(duì)于低版本的 MySQL 只能使用Haversine 公式,但我們還是推薦升級(jí)你的 MySQL(8.0.17版本或更新),因?yàn)槭褂?code>ST_Distance_Sphere 函數(shù)不僅使用簡(jiǎn)單,而且它還支持空間索引,使得查詢(xún)速度更快。

到此這篇關(guān)于mysql實(shí)現(xiàn)附近的人功能的文章就介紹到這了,更多相關(guān)mysql附近的人內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql 8.0.14 安裝配置方法圖文教程

    mysql 8.0.14 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.14 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • mysql觸發(fā)器(Trigger)簡(jiǎn)明總結(jié)和使用實(shí)例

    mysql觸發(fā)器(Trigger)簡(jiǎn)明總結(jié)和使用實(shí)例

    這篇文章主要介紹了mysql觸發(fā)器(Trigger)簡(jiǎn)明總結(jié)和使用實(shí)例,需要的朋友可以參考下
    2014-04-04
  • mysql日志滾動(dòng)

    mysql日志滾動(dòng)

    日志滾動(dòng)解決日志文件過(guò)大問(wèn)題,比如我開(kāi)啟了general_log,這個(gè)日志呢是記錄mysql服務(wù)器上面所運(yùn)行的所有sql語(yǔ)句;比如我開(kāi)啟了mysql的慢查詢(xún)
    2014-01-01
  • MySQL對(duì)標(biāo)準(zhǔn)SQL的擴(kuò)展方式

    MySQL對(duì)標(biāo)準(zhǔn)SQL的擴(kuò)展方式

    MySQL對(duì)標(biāo)準(zhǔn)SQL的擴(kuò)展包括磁盤(pán)上的數(shù)據(jù)組織方式、通用語(yǔ)言語(yǔ)法、SQL語(yǔ)句語(yǔ)法、數(shù)據(jù)類(lèi)型、函數(shù)和運(yùn)算符等,這些擴(kuò)展使得MySQL在某些方面與其他SQL數(shù)據(jù)庫(kù)管理系統(tǒng)不同
    2025-02-02
  • Linux環(huán)境下安裝MySQL8.0的完整步驟

    Linux環(huán)境下安裝MySQL8.0的完整步驟

    數(shù)據(jù)庫(kù)想必大家都很熟悉,但是要在服務(wù)器上自己來(lái)安裝數(shù)據(jù)庫(kù),還是會(huì)出現(xiàn)不少的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于在Linux環(huán)境下安裝MySQL8.0的完整步驟,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • MySQL時(shí)間類(lèi)型和模式詳情

    MySQL時(shí)間類(lèi)型和模式詳情

    這篇文章主要介紹MySQL時(shí)間類(lèi)型和模式 MySQL會(huì)在存儲(chǔ)時(shí)將數(shù)據(jù)值轉(zhuǎn)換為UTC標(biāo)準(zhǔn)時(shí)間來(lái)存儲(chǔ),讀取時(shí)再轉(zhuǎn)為當(dāng)前時(shí)間。如果你的時(shí)區(qū)沒(méi)有發(fā)生改變,則該值就是你存儲(chǔ)的值,如果你改變了時(shí)區(qū),讀取到的值就會(huì)發(fā)生變化。這個(gè)特性不會(huì)對(duì)DATETIME生效,需要的朋友可以參考一下
    2021-09-09
  • 基于sqlalchemy對(duì)mysql實(shí)現(xiàn)增刪改查操作

    基于sqlalchemy對(duì)mysql實(shí)現(xiàn)增刪改查操作

    這篇文章主要介紹了基于sqlalchemy對(duì)mysql實(shí)現(xiàn)增刪改查操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • MySQL單表多關(guān)鍵字模糊查詢(xún)的實(shí)現(xiàn)方法

    MySQL單表多關(guān)鍵字模糊查詢(xún)的實(shí)現(xiàn)方法

    MySQL單表多關(guān)鍵字模糊查詢(xún)實(shí)現(xiàn)方法是很多人都非常想知道的一個(gè)問(wèn)題,那么,究竟采用什么方法,才能實(shí)現(xiàn)MySQL單表多關(guān)鍵字模糊查詢(xún)呢?
    2011-03-03
  • mysql 5.6.23 winx64.zip安裝詳細(xì)教程

    mysql 5.6.23 winx64.zip安裝詳細(xì)教程

    這篇文章主要介紹了mysql 5.6.23 winx64.zip安裝詳細(xì)教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • Linux(Ubuntu)下mysql5.7.17安裝配置方法圖文教程

    Linux(Ubuntu)下mysql5.7.17安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Linux下mysql5.7.17安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評(píng)論

桑植县| 延吉市| 陆丰市| 广昌县| 门头沟区| 平和县| 普宁市| 黔南| 丰台区| 视频| 南召县| 株洲市| 九龙县| 汾西县| 安龙县| 舞阳县| 芮城县| 阳西县| 肥乡县| 新野县| 贵德县| 青海省| 许昌县| 墨玉县| 分宜县| 德阳市| 乌恰县| 南宁市| 雷山县| 阜阳市| 天台县| 浦江县| 沙洋县| 海阳市| 泽普县| 鞍山市| 共和县| 邛崃市| 巴彦县| 治县。| 扎囊县|