MySQL Geometry的使用 —— 地理空間類型Geometry


注意:在投影坐標系中不同的投影標准有不同的單位,如常用到的投影標准: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:以幾何對象作為輸入參數,並返回其空間參考 ID
  • ST_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)
         )
       )

函數后兩個參數,影響箭頭處圓滑程度,精度越高,構造出來的面越圓滑,消耗也更大


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM