地理空間資料Geometry在MySQL中使用

2022-09-19 09:03:11 字數 3076 閱讀 9542

建表指令碼

create

table

`z_gis` (

`id`

bigint(20) not

null

, `name`

varchar(100) character

set utf8mb4 collate utf8mb4_0900_ai_ci not

null comment '姓名'

, `gis` geometry

notnull comment '

空間位置資訊',

`geohash`

varchar(20) generated always as (st_geohash(`gis`,8

)) virtual,

`item_id`

bigint(20) default

null,

primary

key(`id`),

unique

key`id` (`id`),

spatial

key`idx_gis` (`gis`),

key`name` (`name`),

key`idx_geohash` (`geohash`)

) engine

=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci comment=

'空間位置資訊

';

geometry型別好像不能為null,所以建表時必須為not null。

插入表資料

insert

into z_gis(id,name,gis,item_id) values

(880000,'

張三',st_geomfromtext('

point(108.9498710632 34.2588125935)

'), 100),(

890000,'

李四',st_geomfromtext('

point(108.9465236664 34.2598766768)

'), 101);

1. 查詢張三的經緯度資訊

#496 張三 point(108.9465236664

34.2598766768

)select id, name, st_astext(gis) gis from z_gis where name ='張三

';

注:st_astext()函式是將geometry型別轉化為字串

2. 修改張三的位置資訊

update z_gis set gis = st_geomfromtext('

point(108.9465236664 34.2598766768)

') where name ='張三

';

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

注:st_distance_sphere()函式是計算兩點之間距離,所以傳兩個引數,都是geometry型別的,floor()函式是把計算出的距離取整,以公尺為單位。

--

計算廈門到安溪的距離,單位公尺

select

floor

(st_distance_sphere(

point(

118.03394,24.48405), --

廈門經緯度

point(118.18685,25.05544) --

安溪經緯度

)) distance

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

select

floor

(st_distance_sphere(

(select gis from z_gis where name='張三

'),gis

)) distance

from z_gis where name='李四

';

4. 查詢距離張三500公尺內的所有人

張三資料資訊:(id, name, gis, geohash)(183    張三    point(120.259718

30.138463) wtme2wd3 53)--

point(120.259718,30.138463) 張三的經緯度

--wtme2w 張三的geohash值

--183 張三的主鍵id

select

name,

--推薦用經緯度傳入,不要子查詢

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

floor(st_distance_sphere(point(120.259718,30.138463

), gis)) distance,

st_astext(gis) point

from

z_gis

where

geohash

like

'wtme2w%

'and

st_distance_sphere(point(

120.259718,30.138463), gis) <

5000

andid

<>

183;

前面說過geohash是把經緯度轉成字串,建表的時候我定義讓它轉成8位字元,當兩個點離得越近時,它生成的geohash字串前面相同的位數越多,所以我在這裡先用left()擷取前6位字元,前6位相同的誤差在±600公尺左右,然後模糊查詢,查出大概符合條件的資料,最後再精確比較,下面是geohash官方文件對geohash長度和距離誤差的說明:

注意:用geohash 查詢會有邊界問題,所以查詢出來的結果又可能不準確,可以用程式(例如j**a**)先查出當前點周圍8個範圍的geohash值,然後再匹配這9個範圍的所有資料,這樣就解決了geohash 的邊界問題。

orical空間資料型別GEOMETRY使用乾貨

最近專案應用到了根據geometry型別資料範圍內查詢更新資料的操作,對於此種資料型別的小白,在這兩天惡補了一些相關知識,做一些簡單的分享。geometry資料型別簡介 可以參考這篇文章和以上了解基本資料格式和內容,下面直接上應用乾貨。在專案應用中多為構建多邊形與位置資料,或通過位置資訊對資料進行操...

地理空間資料庫

地理空間資料庫 課程介紹地理空間資料庫的空間資料型別 空間分析操作和空間索引,幫助學生理解ogc的簡單要素訪問規範 空間資料庫的基本概念和基本設計方法,通過幾何物件模型和空間網路模型在postgresql postgis pgrouting上的應用實踐,掌握地理資訊資料建庫 空間關聯分析 最短路徑查...

地理空間資料免費獲取(一)

2.地理空間資料雲 主要模組包括 1.映象資料 引進的國際原始資料資源比如modis landsat srtm等 2.資料產品 在映象資料及科學資料中心存檔資料的基礎上,利用國內外權威的資料處理方法或科學資料中心自行研發的資料處理方法加工生產的高質量資料產品 3.國家綜合地球觀測資料共享平台 國家綜...