Mysql 空間查詢


 

原創地址:https://blog.csdn.net/xinlingjun2007/article/details/80457079

 

一、前言

MySQL實施了OGC建議的具有Geometry類型的SQL環境的一個子集。該術語指的是用一組集合類型擴展的環境。具有幾何值的SQL列是作為擁有集合類型的列實施的。該規范描述了SQL幾何類型集合,以及作用在這些類型上用於創建和分析幾何值的函數。關於MySQL空間存儲和查詢的概念介紹,可以參考這篇博客,寫的很詳細:
https://blog.csdn.net/zzq900503/article/details/17142621

二、數據格式

  • Point
    • 字段類型: point
    • 樣例: Point(1 1)
  • MultiPoint
    • 字段類型: multipoint
    • 樣例: MULTIPOINT (1 1,2 2,3 3)
      • 里面是多個point
  • LineString
    • 字段類型: linestring
    • 樣例: LINESTRING(1 1,2 2,3 3)
  • MultiLineString
    • 字段類型: multilinestring
    • 樣例: MULTILINESTRING ((1 1,2 2,3 3),(2 2,2 3,2 4))
  • Polygon
    • 字段類型: polygon
    • 樣例:
      • 單面 POLYGON((1 1,1 2,2 2,2 1,1 1))
      • 鏤空面 POLYGON((1 1,,,),(2 2,,,),(3 3,,,))
        • 會從第一個面中,去除后面的面
        • 使用ST_Area方法計算面積時,只會算出幾個面的面積,用第一個面減,如果后面的面有超過了第一個面范圍的部分,會將超出的數值一並減掉。單純的面積減面積。
    • 注意:首末點要相同,用於連接成一個閉合的面
  • MultiPolygon
    • 字段類型: multipolygon
    • 樣例: MULTIPOLYGON(((1 1,1 2,2 2,2 1,1 1)),((2 2,2 3,3 2,2 2)))
      • 里面是多個polygon

三、數據插入

INSERT into 表明(字段名) VALUES(ST_GeomFromText('上方列舉的數據格式'))
  • 1

以插入一個point為例:

INSERT into test(point) VALUES(ST_GeomFromText('Point(5 5)'))
  • 1

插入時使用ST_GeomFromText,也可使用GeomFromText,區別暫時沒有研究。該方法是返回源字符串的相應類型的幾何值

四、空間查詢方法

  • 空間查詢相關方法
    • 包含相關
      • MBRContains(A,B) –> A包含B
      • MBRWithin(A,B) –> A在B中
        • 注意:包含關系中,所要驗證的集合必須全部包含在指定的集合中。如果只有部分在其中,應該使用相交
    • 覆蓋相關
      • MBRCoveredBy(A,B) –> A被B覆蓋
      • MBRCovers(A,B) –> A覆蓋B
    • 相交相關
      • MBRDisjoint(A,B) –> A、B不相交
      • MBRIntersects(A,B) –> A、B相交
    • 接觸
      • MBRTouches(A,B) –> A、B接觸,接觸的概念類似於相切
    • 重疊
      • MBROverlaps(A,B) –> A、B重疊
    • 相同
      • MBREquals(A,B) –> A、B相同
  • 空間數據相關方法

    • 點獨有
      • 開始、結束點
        • ST_StartPoint(A)
        • ST_EndPoint(A)
      • 獲取x或y
        • ST_X(A)
        • ST_Y(A)
      • 凸包
        • ST_ConvexHull(A) –> 多點A的凸包面
      • 返回矩形
        • ST_MakeEnvelope(A,B) –> A、B為對角點
    • 線獨有
      • 線是否閉合
        • ST_IsClosed(A)
      • 線中點數量
        • ST_NumPoints
      • 線中第n個點
        • ST_PointN(A,n)
      • 線長度
        • ST_Length(A)
      • 生成矩形
        • ST_Envelope(A) –> A只有兩個點,且不是水平或豎直線
    • 面獨有
      • 面積
        • ST_Area(A)
      • 面的內外邊界
        • ST_ExteriorRing(A) –> 獲取A面外環邊界,返回值為LineString
        • ST_InteriorRingN(A,num) –> 獲取A面中第num個內環邊界,返回值為LineString。num從1開始。
          • ST_NumInteriorRings(A) –> 獲取A面內環數量(5.7.8后添加ST_NumInteriorRing,效果一樣)
    • 部分geo對象可用

      • 集合
        • 交集
          • ST_Intersection(A,B)
        • 異或
          • ST_SymDifference(A,B) –> A、B中獨有的
        • 並集
          • ST_Union(A,B)
      • 質心
        • ST_Centroid(A)
      • 距離
        • ST_Distance(A,B) –> A和B距離
        • ST_Distance_Sphere(A,B) –> A和B的球面距離
      • 不同
        • ST_Difference(A,B) –> 返回A中有B中沒有的
      • 抽稀
        • ST_Simplify(A,mix_distance) –> 將A抽稀,簡化A中兩點距離小於max的值(用起來有點迷。。待研究)
      • 緩沖區

        • ST_Buffer(A,length) –> 通過A幾何體,生成他周邊范圍為length距離的面

          • 5.7.7后可以添加策略影響緩沖區的計算,設置的語句是ST_Buffer_Strategy()

            • point策略
              • point_circle –> 點的緩沖區是一個圓(默認)
              • point_square –> 點的緩沖區是一個正方形,length是點到其中一邊的距離
            • join策略
              • join_round –> 連接處緩沖區邊界為圓弧(默認)
              • join_miter –> 連接處緩沖區邊界為尖角
            • end策略
              • end_round –> 在結束處緩沖區為圓弧(默認)
              • end_flat –> 在結束處緩沖區為平坦的直線
            • 舉例生成緩沖區

              ST_Buffer(point, 5, ST_Buffer_Strategy('point_square'))
              
              ST_Buffer(line, 5, ST_Buffer_Strategy('join_miter', 10), ST_Buffer_Strategy('end_flat'))
              • 1
              • 2
              • 3
    • 上部分中的空間查詢相關方法的判斷方法,返回值是是否
      • 相交
        • ST_Intersects(A,B) –> A和B是否相交
        • ST_Crosses(A,B) –> A和B是否相交(相交部分不等於A或B)
        • ST_Disjoint(A,B) –> A和B是否不相交
      • 重疊
        • ST_Overlaps(A,B)
      • 接觸
        • ST_Touches(A,B)
      • 包含
        • ST_Contains(A,B) –> A是否包含B
        • ST_Within(A,B) –> A是否在B中
  • ETC
    • 驗證數據是否合法
      • ST_IsValid(A)
      • ST_Validate(A)
    • geo對象返回格式
      • ST_AsText(字段名) –> 以文本形式返回
      • ST_AsBinary(字段名) –> 以二進制形式返回

包含、覆蓋、重疊三個方法不清楚具體的區別

注意:每個方法前的MBR、ST可要可不要,在mysql5.7.6之后,不帶MBR、ST的方法開始棄用

查詢樣例:
- 查詢在指定面中的點
sql
select * from test where MBRContains(ST_GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))'),point)

- 查詢所有point點的x坐標
sql
SELECT ST_X(point) FROM test


免責聲明!

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



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