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

MySQL空間函數(shù)及記錄經(jīng)緯度并進行計算詳解

 更新時間:2026年01月24日 09:57:44   作者:禿了也弱了。  
這篇文章主要介紹了MySQL空間函數(shù)及記錄經(jīng)緯度并進行計算的相關(guān)資料,MySQL中的point用于表示GIS中的地理坐標,在GIS中廣泛使用,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、空間數(shù)據(jù)類型

在 MySQL 空間數(shù)據(jù)類型中,GEOMETRY 是所有空間類型的“基類”,其余(POINT、LINESTRING 等)都是 GEOMETRY 的具體子類,用于存儲不同形態(tài)的地理/幾何信息(如單個點、線、區(qū)域、多個點集合等)。這些類型的核心作用是結(jié)構(gòu)化存儲空間數(shù)據(jù),配合空間函數(shù)(如距離計算、范圍判斷)和空間索引,實現(xiàn)高效的地理/幾何運算。

1、GEOMETRY:核心基類

作用:

所有空間數(shù)據(jù)類型的父類型(抽象基類),本身不直接存儲具體的空間形態(tài),而是用于:

1.兼容所有子類(如 POINT、POLYGON 都可賦值給 GEOMETRY 類型字段);

2.統(tǒng)一處理混合類型的空間數(shù)據(jù)(如查詢時返回任意類型的空間結(jié)果)。

關(guān)鍵特點:

不能直接用 INSERT 插入數(shù)據(jù)(無具體形態(tài)),需通過子類的 WKT/函數(shù)生成后賦值;

支持所有空間函數(shù)(如 ST_SRID()ST_AsText()),可接收任意子類的空間對象。

適用場景:

需存儲“不確定形態(tài)”的空間數(shù)據(jù)(如同時存儲點、線、面);

通用化的空間數(shù)據(jù)接口(如函數(shù)參數(shù)、存儲過程返回值)。

-- 定義 GEOMETRY 類型字段(兼容所有空間類型)
CREATE TABLE spatial_data (
  id INT PRIMARY KEY AUTO_INCREMENT,
  geom GEOMETRY NOT NULL SRID 4326 COMMENT '兼容任意空間類型'
);

-- 插入 POINT 類型數(shù)據(jù)(自動兼容 GEOMETRY 字段)
INSERT INTO spatial_data (geom) VALUES (ST_MakePoint(116.4, 39.9));

-- 插入 POLYGON 類型數(shù)據(jù)(同樣兼容)
INSERT INTO spatial_data (geom) VALUES (
  ST_GeomFromText('POLYGON((116.3 39.8, 116.5 39.8, 116.5 40.0, 116.3 40.0, 116.3 39.8))', 4326)
);

2、POINT:單個點(重要)

作用:

存儲二維平面/地球表面的單個坐標點(核心用于經(jīng)緯度、具體位置)。

關(guān)鍵特點:

由一對坐標 (X, Y) 組成(地理場景:X=經(jīng)度,Y=緯度);

必須指定 SRID(如 4326 對應(yīng) WGS84 經(jīng)緯度);

是經(jīng)緯度存儲的最優(yōu)類型(之前對話重點講過)。

實際場景:

存儲 POI 坐標(如商場、景點、地址);

設(shè)備定位點(如手機GPS、車輛定位)。

-- WKT 格式:POINT(X Y)(經(jīng)度在前,緯度在后  貌似我的版本正好是反過來的?很奇怪)
ST_GeomFromText('POINT(116.4042 39.9153)', 4326)

-- 簡化函數(shù)(MySQL 8.0.12+):ST_MakePoint(X, Y)(自動繼承字段 SRID)
ST_MakePoint(116.4042, 39.9153)

3、LINESTRING:線串(折線)

作用:

存儲由多個有序點連接而成的連續(xù)線段(可理解為“折線”,非曲線)。

關(guān)鍵特點:

由 2 個及以上 POINT 組成(點的順序決定線的走向);

點之間是直線連接,可自交(但通常用于無自交的連續(xù)線);

坐標單位與 SRID 一致(4326 為度,3857 為米)。

實際場景:

道路、鐵路、航線(如公交路線、飛機航線);

河流、管道、邊界線(如省界的一段);

軌跡(如跑步路線、車輛行駛軌跡)。

-- WKT 格式:LINESTRING(點1 點2 點3 ...)(點之間用空格分隔)
-- 示例:北京到天津的航線(簡化為3個途經(jīng)點)
ST_GeomFromText('LINESTRING(116.4042 39.9153, 116.8 39.95, 117.2 39.13)', 4326)

4、POLYGON:多邊形(閉合區(qū)域)

作用:

存儲由閉合線串圍成的區(qū)域(可包含“孔洞”),用于表示“面狀”地理范圍。

關(guān)鍵特點:

核心是“閉合線串”:外邊界的首尾點必須完全相同(否則 MySQL 會自動補全,但不推薦);

支持“孔洞”:可包含多個線串,第一個是外邊界,后續(xù)是內(nèi)邊界(孔洞,如區(qū)域內(nèi)的湖泊);

點的順序:外邊界按“順時針”或“逆時針”排列,內(nèi)邊界(孔洞)順序相反(避免交叉)。

實際場景:

行政區(qū)域(如城市、區(qū)縣、省份范圍);

地塊、園區(qū)(如工業(yè)園區(qū)、校園范圍);

地理圍欄(如“電子圍欄內(nèi)的設(shè)備報警”)。

-- 1. 簡單多邊形(無孔洞):北京市東城區(qū)范圍(簡化)
ST_GeomFromText('POLYGON((116.35 39.88, 116.45 39.88, 116.45 39.95, 116.35 39.95, 116.35 39.88))', 4326)

-- 2. 帶孔洞的多邊形(區(qū)域內(nèi)有湖泊)
ST_GeomFromText('POLYGON(
  (116.35 39.88, 116.45 39.88, 116.45 39.95, 116.35 39.95, 116.35 39.88),  -- 外邊界
  (116.38 39.90, 116.42 39.90, 116.42 39.93, 116.38 39.93, 116.38 39.90)   -- 內(nèi)邊界(孔洞)
)', 4326)

5、復(fù)合類型(MULTI 開頭):多個同類型幾何對象

用于存儲多個結(jié)構(gòu)相同的空間對象(如多個點、多條線、多個多邊形),且這些對象之間相互獨立、不重疊(邏輯上是“集合”)。

6、MULTIPOINT:多點集合

作用:

存儲多個獨立的 POINT(無關(guān)聯(lián),不連接)。

關(guān)鍵特點:

多個點之間無順序要求,互不連接;

適合存儲“一組離散的點”(無需每條記錄存一個 POINT)。

實際場景:

多個POI集合(如同一品牌的所有門店坐標);

傳感器部署點、監(jiān)測點(如多個空氣質(zhì)量監(jiān)測站)。

-- 示例:某城市的多個公交站點坐標
ST_GeomFromText('MULTIPOINT((116.40 39.91), (116.41 39.92), (116.42 39.90), (116.39 39.93))', 4326)

7、MULTILINESTRING:多線集合

作用:

存儲多條獨立的 LINESTRING(互不連接,無順序要求)。

關(guān)鍵特點:

每條線串都是獨立的(如多條不相交的道路);

避免重復(fù)創(chuàng)建多條 LINESTRING 記錄,簡化數(shù)據(jù)管理。

實際場景:

多條道路、水系(如一個區(qū)域內(nèi)的所有河流);

多條航線、軌跡(如某航空公司的多條航線)。

-- 示例:某城市的3條主要道路
ST_GeomFromText('MULTILINESTRING(
  (116.35 39.88, 116.45 39.88),  -- 道路1(東西向)
  (116.40 39.88, 116.40 39.95),  -- 道路2(南北向)
  (116.38 39.90, 116.42 39.93)   -- 道路3(斜向)
)', 4326)

8、MULTIPOLYGON:多面集合

作用:

存儲多個獨立的 POLYGON(互不重疊、不相交)。

關(guān)鍵特點:

每個多邊形都是獨立的(如多個城市、多個地塊);

適合存儲“一組區(qū)域”(如省份包含的所有區(qū)縣)。

實際場景:

行政區(qū)域集合(如省份、國家包含的所有下級區(qū)域);

多個地塊、園區(qū)(如一個開發(fā)區(qū)內(nèi)的多個工廠地塊)。

-- 示例:京津冀地區(qū)的3個主要城市范圍(簡化)
ST_GeomFromText('MULTIPOLYGON(
  -- 北京
  ((116.3 39.8, 116.6 39.8, 116.6 40.1, 116.3 40.1, 116.3 39.8)),
  -- 天津
  ((117.1 39.0, 117.4 39.0, 117.4 39.3, 117.1 39.3, 117.1 39.0)),
  -- 石家莊
  ((114.2 38.0, 114.6 38.0, 114.6 38.4, 114.2 38.4, 114.2 38.0))
)', 4326)

9、混合集合:GEOMETRYCOLLECTION

作用:

存儲多種不同類型的空間對象(如 POINT + LINESTRING + POLYGON),是最靈活的空間類型(但使用頻率較低)。

關(guān)鍵特點:

可包含任意空間類型(單個或復(fù)合類型),如“一個點 + 一條線 + 一個多邊形”;

無類型限制,但可讀性和查詢效率較低(不推薦頻繁使用);

需確保所有對象的 SRID 一致(否則空間函數(shù)會報錯)。

實際場景:

復(fù)雜地理數(shù)據(jù)集(如一個區(qū)域內(nèi)的所有地理要素:點、線、面);

臨時數(shù)據(jù)存儲(如批量導(dǎo)入的混合類型空間數(shù)據(jù))。

-- 示例:某區(qū)域的“景點(點)+ 游覽路線(線)+ 景區(qū)范圍(面)”
ST_GeomFromText('GEOMETRYCOLLECTION(
  POINT(116.4042 39.9153),  -- 天安門(點)
  LINESTRING(116.40 39.91, 116.41 39.92),  -- 游覽路線(線)
  POLYGON((116.39 39.90, 116.42 39.90, 116.42 39.93, 116.39 39.93, 116.39 39.90))  -- 景區(qū)范圍(面)
)', 4326)

二、使用

1、POINT相關(guān)

(1)建表與索引

CREATE TABLE `poi` (
  `id` INT PRIMARY KEY AUTO_INCREMENT COMMENT '主鍵ID',
  `name` VARCHAR(100) NOT NULL COMMENT '地點名稱',
  `location` POINT SRID 4326 NOT NULL COMMENT '經(jīng)緯度(POINT類型,WGS84坐標系)',
  `address` VARCHAR(255) COMMENT '詳細地址',
  -- 創(chuàng)建空間索引(加速空間查詢)
  SPATIAL INDEX `idx_spatial_location` (`location`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='POI地點表';

(2)ST_PointFromText():從 WKT 構(gòu)造點(推薦,顯式指定 SRID)

-- 語法:ST_PointFromText('POINT(緯度 經(jīng)度)', SRID)
INSERT INTO poi (name, location, address)
VALUES (
  '天安門',
  ST_PointFromText('POINT(39.914885 116.403874)', 4326), -- 經(jīng)度116.403874,緯度39.914885
  '北京市東城區(qū)東長安街'
), (
  '上海外灘',
  ST_PointFromText('POINT(31.235924 121.490171)', 4326), -- 經(jīng)度121.490171,緯度31.235924
  '上海市黃浦區(qū)中山東一路'
);

(3)ST_GeomFromText():通用幾何對象創(chuàng)建函數(shù)

INSERT INTO poi (name, location, address)
VALUES (
  '廣州塔',
  ST_GeomFromText('POINT(23.113500 113.330430)', 4326),
  '廣州市海珠區(qū)閱江西路222號'
);

(4)ST_SRID():通過對象創(chuàng)建

INSERT INTO poi (name, location, address)
VALUES (
  '深圳市民中心',
  ST_SRID(Point(114.057865, 22.543096), 4326), -- Point(經(jīng)度, 緯度)
  '深圳市福田區(qū)福中三路'
);

(5)ST_X、ST_Y查詢x、y坐標(不適用經(jīng)緯度)

mysql> SELECT ST_X(Point(56.7, 53.34));
+--------------------------+
| ST_X(Point(56.7, 53.34)) |
+--------------------------+
|                     56.7 |
+--------------------------+
mysql> SELECT ST_Y(Point(56.7, 53.34));
+--------------------------+
| ST_Y(Point(56.7, 53.34)) |
+--------------------------+
|                    53.34 |
+--------------------------+

(6)ST_AsText(), ST_AsWKT():轉(zhuǎn)換為字符串、WKT格式

mysql> SET @g = 'LineString(1 1,2 2,3 3)';
mysql> SELECT ST_AsText(ST_GeomFromText(@g));
+--------------------------------+
| ST_AsText(ST_GeomFromText(@g)) |
+--------------------------------+
| LINESTRING(1 1,2 2,3 3)        |
+--------------------------------+

(7)ST_Longitude()、ST_Latitude():查詢經(jīng)緯度

SELECT
  id,
  name,
  ST_Longitude(location) AS longitude, -- 提取經(jīng)度
  ST_Latitude(location) AS latitude,  -- 提取緯度
  address
FROM poi;

(8)ST_Distance():點的平面距離(不適用經(jīng)緯度)

mysql> SET @g1 = ST_GeomFromText('POINT(1 1)');
mysql> SET @g2 = ST_GeomFromText('POINT(2 2)');
mysql> SELECT ST_Distance(@g1, @g2);
+-----------------------+
| ST_Distance(@g1, @g2) |
+-----------------------+
|    1.4142135623730951 |
+-----------------------+

mysql> SET @g1 = ST_GeomFromText('POINT(1 1)', 4326);
mysql> SET @g2 = ST_GeomFromText('POINT(2 2)', 4326);
mysql> SELECT ST_Distance(@g1, @g2);
+-----------------------+
| ST_Distance(@g1, @g2) |
+-----------------------+
|     156874.3859490455 |
+-----------------------+
mysql> SELECT ST_Distance(@g1, @g2, 'metre');
+--------------------------------+
| ST_Distance(@g1, @g2, 'metre') |
+--------------------------------+
|              156874.3859490455 |
+--------------------------------+
mysql> SELECT ST_Distance(@g1, @g2, 'foot');
+-------------------------------+
| ST_Distance(@g1, @g2, 'foot') |
+-------------------------------+
|             514679.7439273146 |
+-------------------------------+

(9)ST_Distance_Sphere():基于球體(地球)計算兩點直線距離

SELECT
  ST_Distance_Sphere ( ST_PointFromText ( 'POINT(39.914885 116.403874)', 4326 ), ST_PointFromText ( 'POINT(31.235924 121.490171)', 4326 ) ) AS distance_m;

2、實戰(zhàn)

(1)查詢范圍內(nèi)的點

-- 步驟1:構(gòu)造目標點(天安門經(jīng)緯度)
-- 步驟2:計算每個POI到目標點的距離(米)
-- 步驟3:篩選距離≤5000米的結(jié)果,按距離升序排序
SELECT
  id,
  name,
  address,
  ST_Longitude(location) AS longitude,
  ST_Latitude(location) AS latitude,
  -- 計算距離(米),保留2位小數(shù)
  ROUND(ST_Distance_Sphere(
    location,
    ST_PointFromText('POINT(39.914883 116.403873)', 4326) -- 目標點:天安門
  ), 2) AS distance_m
FROM poi
WHERE
  -- 先通過經(jīng)緯度范圍粗篩(減少計算量,優(yōu)化性能)
  ST_Longitude(location) BETWEEN 116.403872 - 0.05 AND 116.403874 + 0.05 -- 經(jīng)度范圍(≈5.5公里)
  AND ST_Latitude(location) BETWEEN 39.914883 - 0.05 AND 39.914885 + 0.05 -- 緯度范圍(≈5.5公里)
  -- 再精確篩選5公里內(nèi)
  AND ST_Distance_Sphere(
    location,
    ST_PointFromText('POINT(39.914885 116.403874)', 4326)
  ) < 5000
ORDER BY distance_m ASC; -- 按距離從近到遠排序

參考資料

https://dev.mysql.com/doc/refman/8.0/en/spatial-types.html
https://dev.mysql.com/doc/refman/8.0/en/spatial-function-reference.html

到此這篇關(guān)于MySQL空間函數(shù)及記錄經(jīng)緯度并進行計算的文章就介紹到這了,更多相關(guān)MySQL空間函數(shù)記錄經(jīng)緯度內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MYSQL中DML與DDL常用語句小結(jié)

    MYSQL中DML與DDL常用語句小結(jié)

    DML是一類用于查詢和操作數(shù)據(jù)的 SQL 語句,DDL是一類用于定義和管理數(shù)據(jù)庫結(jié)構(gòu)及對象的 SQL 語句,本文為大家整理了一些DML與DDL的常用語句,希望對大家有所幫助
    2023-12-12
  • Linux環(huán)境mysql5.7.12安裝教程

    Linux環(huán)境mysql5.7.12安裝教程

    這篇文章主要為大家詳細介紹了Linux環(huán)境Mysql5.7.12安裝教程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 新手必備之MySQL msi版本下載安裝圖文詳細教程

    新手必備之MySQL msi版本下載安裝圖文詳細教程

    今天教大家怎么下載安裝MySQL msi版本,文中有非常詳細的圖文解說,對不會下載安裝mysql的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • MySQL?配置主從復(fù)制實踐分享

    MySQL?配置主從復(fù)制實踐分享

    這篇文章主要介紹了MySQL?配置主從復(fù)制實踐分享,通過檢測通信展開詳情,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • mysql中l(wèi)imit用法詳解及注意事項總結(jié)

    mysql中l(wèi)imit用法詳解及注意事項總結(jié)

    mysql數(shù)據(jù)庫中l(wèi)imit子句可以被用于強制select語句返回指定的記錄數(shù),這篇文章主要介紹了mysql中l(wèi)imit用法詳解及注意事項的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-01-01
  • PHP使用mysqli擴展連接MySQL數(shù)據(jù)庫

    PHP使用mysqli擴展連接MySQL數(shù)據(jù)庫

    這篇文章主要介紹了PHP使用mysqli擴展連接MySQL數(shù)據(jù)庫,需要的朋友可以參考下
    2014-08-08
  • MySQL 5.6 & 5.7最優(yōu)配置文件模板(my.ini)

    MySQL 5.6 & 5.7最優(yōu)配置文件模板(my.ini)

    這篇文章主要介紹了MySQL 5.6 & 5.7最優(yōu)配置文件模板(my.ini),需要的朋友可以參考下
    2016-07-07
  • MySQL的的數(shù)據(jù)一致性保障與延遲問題處理

    MySQL的的數(shù)據(jù)一致性保障與延遲問題處理

    在分布式數(shù)據(jù)庫和高并發(fā)應(yīng)用場景下,數(shù)據(jù)一致性 和 數(shù)據(jù)延遲 是兩個不可忽視的問題,MySQL 作為廣泛使用的關(guān)系型數(shù)據(jù)庫,提供了多種機制來保障數(shù)據(jù)一致性,本文將深入探討 MySQL 如何保障數(shù)據(jù)一致性 以及 應(yīng)對數(shù)據(jù)延遲的策略,需要的朋友可以參考下
    2025-03-03
  • MySQL中表的幾種連接方式

    MySQL中表的幾種連接方式

    這篇文章主要給大家介紹了關(guān)于MySQL中表的幾種連接方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • MySQL索引失效的幾種情況小結(jié)

    MySQL索引失效的幾種情況小結(jié)

    本文主要介紹了MySQL索引失效的幾種情況小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評論

东莞市| 清水河县| 盐津县| 梨树县| 昆明市| 花莲县| 商南县| 饶阳县| 堆龙德庆县| 叙永县| 汝南县| 会宁县| 沾益县| 宁明县| 汝州市| 新田县| 朝阳区| 普定县| 赤峰市| 武城县| 尼勒克县| 龙门县| 盐城市| 崇信县| 虎林市| 宝兴县| 桃园市| 锡林郭勒盟| 宜阳县| 舒兰市| 明水县| 吉林省| 平武县| 万盛区| 民和| 孝昌县| 陵川县| 阜康市| 五华县| 公主岭市| 延津县|