注意:在投影坐標系中不同的投影標准有不同的單位,如常用到的投影標准:3857以米為單位,4326以度為單位
目錄
一、Geometry數據類型有哪些?
1.Geometry介紹
- MySQL中支持的幾何數據類型包括Geometry(幾何)、Point(點)、LineString(線)、Polygon(面)
以及集合類型的MultiPoint(多點)、MultiLineString(多線)、MultiPolygon(多面)、GeometryCollection(混合數據類型) - 其中,Geometry可以表示其他任意類型的值,剩下的只能表示單個類型的值
2.Geometry類型
注意:數據中間不能有多余的空格
名稱 | 類型 | 例如 |
---|---|---|
Point | 點坐標 | POINT(103 35) |
LineString | 線坐標 | LINESTRING(103 35,103 36,104 36,105 37) |
Polygon | 面坐標 | POLYGON(103 35,104 35,104 36,103 36,103 35) |
MultiPoint | 多點 | MULTIPOINT(103 35, 104 34,105 35) |
MultiLineString | 多線 | MULTILINESTRING((103 35, 104 35), (105 36, 105 37)) |
MultiPolygon | 多面 | MULTIPOLYGON(((103 35,104 35,104 36,103 36,103 35)),((103 36,104 36,104 37,103 36))) |
GeometryCollection | 混合類型 | GEOMETRYCOLLECTION(POINT(103 35), LINESTRING(103 35, 103 37)) |
二、Geometry數據格式
- WKT(文本格式:在代碼中的格式)
- WKB(二進制格式:存儲在Geometry類型的表字段中)
三、Geometry的常用函數
1.構造函數
構造函數會獲取一種幾何類型或幾何的文本說明,然后創建一個幾何
ST_Point
:文本格式轉Point格式(例如存表的時候)ST_PointFromText
:Point格式轉文本格式(例如查詢的時候)ST_Polygon
:文本格式轉Polygon格式ST_PolygonFromText
:Polygon格式轉文本格式ST_PointFromWKB
:以熟知二進制 (WKB) 表示和空間參考 ID 作為輸入參數返回 ST_Point 類型的對象
2.存取器函數
函數都采用一個或多個幾何作為輸入,並返回關於幾何的特定信息
獲取線/面對象四至
:st_xmin(geometry)、st_ymin(geometry)、st_xmax(geometry)、st_ymax(geometry)ST_AsText
:獲取一個幾何類型,然后返回其可識別的文本表示ST_AsGeoJSON
:將Geometry格式轉為JSON格式ST_Centroid
:以面或多面為參數輸入,然后返回位於幾何的包絡矩形中心的點ST_Length
:用於返回線串或多線串的長度ST_MaxX
:以幾何為參數,返回最大的 X 坐標ST_SRID
:以幾何對象作為輸入參數,並返回其空間參考 IDST_X
:返回點坐標的 X 坐標ST_Y
:返回點坐標的 Y 坐標
3.關系函數
關系函數將幾何作為輸入並確定各幾何之間是否存在特定關系
ST_Contains
:判斷第一個幾何對象是否完全包含第二個幾何對象ST_Disjoint
:判斷兩個幾何對象無交集ST_Equals
:判斷兩個幾何對象是否完全相同
4.幾何函數
函數利用空間數據並對其執行分析,然后返回新的空間數據
ST_Buffer
:獲取幾何對象和距離,然后返回表示圍繞源對象的緩沖區的幾何對象(例如可以使用線坐標,構造一個線坐標50米之內的面)ST_Distance
:用於返回兩個幾何之間的距離。這一距離是兩個幾何的最近折點之間的距離ST_Difference
:獲取兩個幾何對象,然后返回表示兩個源對象之差的幾何對象(例如,計算兩個面積差)
更多相關函數可參考:ArcMap
四、使用實例
1.從Geometry字段獲得信息
- 通過點坐標 wzxx 字段、線坐標 sydwfw 字段,獲得不同類型的數據
select ST_AsText(wzxx) as geometry, ST_X(wzxx) as x, ST_Y(wzxx) as y,
ST_AsGeoJSON(wzxx) as wzxx, ST_AsText(sydwfw) as sydwfw
from tb_sydw

2.搜索指定范圍之內的數據
- 獲得點坐標(103,36)2000米之內的數據
select * from tb_sydw
where st_distance_sphere(ST_POINTFROMTEXT('POINT(103,36)'), wzxx) < 2000
3.搜索指定范圍之內的數據(Geohash算法提速)
- 通過Geohash算法,可先將范圍縮小,在進行精確查找,提高效率(注意邊緣問題和曲線突變問題)
GeoHash是一種地址編碼方法。他能夠把二維的空間經緯度數據編碼成一個字符串,然后通過編碼前多少位,直接進行匹配,從而快速的鎖定一個較小范圍
select * from tb_sydw
where st_geohash(wzxx,5) like concat(st_geohash(ST_POINTFROMTEXT('POINT(103,36)'),5),'%')
4.獲得路徑多大范圍內的面坐標
- 通過路徑坐標數據,獲得路徑多邊形(如需要查找路徑多少范圍內的數據時),需要注意單位是度還是米,其中
ST_Buffer_Strategy
為線構造面時,起始點及拐彎處,精度策略
具體可參考:ST_Buffer
SELECT ST_AsText(
ST_Buffer(
ST_GeomFromText('LINESTRING(103 35,103 36,104 36)'), 0.04,
ST_Buffer_Strategy('end_round',4),ST_Buffer_Strategy('join_round',4)
)
)
函數后兩個參數,影響箭頭處圓滑程度,精度越高,構造出來的面越圓滑,消耗也更大