mysql中g(shù)eometry類型的簡單使用

創(chuàng)建表格腳本

CREATE TABLE `z_gis` (
  `id` varchar(45) NOT NULL,
  `name` varchar(10) NOT NULL COMMENT '姓名',
  `gis` geometry NOT NULL COMMENT '空間位置信息',
  `geohash` varchar(20) GENERATED ALWAYS AS (st_geohash(`gis`,8)) VIRTUAL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  SPATIAL KEY `idx_gis` (`gis`),
  KEY `idx_geohash` (`geohash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='空間位置信息'

這里我創(chuàng)建了一張位置信息表,每個人對應(yīng)的經(jīng)緯度都會以geometry類型存在表中,geohash字段是把坐標(biāo)系分成很多小方格,然后將經(jīng)緯度轉(zhuǎn)化成字符串,其原理可自行百度,在這里就不多說了。
哦,對了,geometry類型好像不能為null,所以建表時必須為not null。

插入表數(shù)據(jù)

insert into z_gis(id,name,gis) values
(replace(uuid(),'-',''),'張三',geomfromtext('point(108.9498710632 34.2588125935)')),
(replace(uuid(),'-',''),'李四',geomfromtext('point(108.9465236664 34.2598766768)')),
(replace(uuid(),'-',''),'王五',geomfromtext('point(108.9477252960 34.2590342786)')),
(replace(uuid(),'-',''),'趙六',geomfromtext('point(108.9437770844 34.2553719653)')),
(replace(uuid(),'-',''),'小七',geomfromtext('point(108.9443349838 34.2595663206)')),
(replace(uuid(),'-',''),'孫八',geomfromtext('point(108.9473497868 34.2643456798)')),
(replace(uuid(),'-',''),'十九',geomfromtext('point(108.9530360699 34.2599476152)'));

geomfromtext()函數(shù)是將字符串格式的點(diǎn)坐標(biāo),轉(zhuǎn)化成geometry類型,還有個字段geohash是根據(jù)gis字段的值自動生成的,可以仔細(xì)看看建表腳本。

查詢

1. 查詢張三的經(jīng)緯度信息

select name, astext(gis) gis from z_gis where name = '張三';

astext()函數(shù)是將geometry類型轉(zhuǎn)化為字符串

2. 修改張三的位置信息

update z_gis set gis = geomfromtext('point(108.9465236664 34.2598766768)') where name = '張三';

3. 查詢張三和李四之間的距離

select floor(st_distance_sphere(
    (select gis from z_gis where name= '張三'),
    gis
)) distance from z_gis where name= '李四';

sql執(zhí)行結(jié)果

4. 查詢距離張三500米內(nèi)的所有人

SELECT 
    name,
    FLOOR(ST_DISTANCE_SPHERE((SELECT 
                            gis
                        FROM
                            z_gis
                        WHERE
                            name = '張三'),
                    gis)) distance,
                    astext(gis) point
FROM
    z_gis
WHERE
    ST_DISTANCE_SPHERE((SELECT 
                    gis
                FROM
                    z_gis
                WHERE
                    name = '張三'),
            gis) < 500
        AND name != '張三';

sql執(zhí)行結(jié)果

name distance point
李四 329 POINT(108.9465236664 34.2598766768)
王五 198 POINT(108.947725296 34.2590342786)
十九 317 POINT(108.9530360699 34.2599476152)
如果表中數(shù)據(jù)非常多時,這樣查效率會非常低,這時就會用到geohash字段查詢

SELECT 
    name,
    floor(ST_DISTANCE_SPHERE((SELECT 
                    gis
                FROM
                    z_gis
                WHERE
                    name = '張三'),
            gis)) distance,
            astext(gis) point
FROM
    z_gis
WHERE
    geohash like concat(left((select geohash from z_gis where name = '張三'),6),'%')
          AND ST_DISTANCE_SPHERE((SELECT 
                    gis
                FROM
                    z_gis
                WHERE
                    name = '張三'),
            gis) < 500
        AND name != '張三';  
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.場景 隨著智能手機(jī)和傳感器技術(shù)的發(fā)展,LBS(Location based service)類的應(yīng)用也逐漸多了...
    Daniel_adu閱讀 11,696評論 3 13
  • 手動不易,轉(zhuǎn)發(fā)請注明出處 --Trance 數(shù)據(jù)庫系統(tǒng)命令: (1).查看存儲過程狀態(tài):show pro...
    Trance_b54c閱讀 1,830評論 0 8
  • 什么是正則表達(dá)式 正則表達(dá)式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符,及這些特定的組合,組成一...
    海人為記閱讀 476評論 0 0
  • 每次到杭州都會為她的美折服。她的綠色不似柳州那樣扎眼,充滿活力而又溫潤如玉。用歲月靜好來形容我眼中的杭州之美,最為...
    古道青峰閱讀 267評論 0 2
  • 5月13日 晴 周日 今天是母親節(jié),老寶練字寫了一個"愛"字...
    夏威夷果子閱讀 177評論 0 0

友情鏈接更多精彩內(nèi)容