文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  空間運算子函式

14.16.8 空間運算子函式

OpenGIS 提出了一些可以產生幾何圖形的函式。它們的設計目的是實作空間運算子。這些函式支援所有引數類型組合,但根據 Open Geospatial Consortium 規格不適用的組合除外。

MySQL 也實作了一些 OpenGIS 的擴充函式,如函式說明中所述。此外,第 14.16.7 節「幾何屬性函式」討論了幾個從現有幾何圖形建構新幾何圖形的函式。請參閱該章節以了解這些函式的說明

除非另有說明,否則本節中的函式會以下列方式處理其幾何引數

  • 如果任何引數為 NULL,則傳回值為 NULL

  • 如果任何幾何引數不是語法上格式正確的幾何圖形,則會發生 ER_GIS_INVALID_DATA 錯誤。

  • 如果任何幾何引數是未定義空間參考系統 (SRS) 中語法上格式正確的幾何圖形,則會發生 ER_SRS_NOT_FOUND 錯誤。

  • 對於採用多個幾何引數的函式,如果這些引數不在相同的 SRS 中,則會發生 ER_GIS_DIFFERENT_SRIDS 錯誤。

  • 如果任何幾何引數的地理 SRS 具有 SRID 值,且函式不處理地理幾何圖形,則會發生 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 錯誤。

  • 對於地理 SRS 幾何引數,如果任何引數的經度或緯度超出範圍,則會發生錯誤

    顯示的範圍以度為單位。如果 SRS 使用其他單位,則範圍會使用其單位中的對應值。由於浮點算術,精確的範圍限制會略有偏差。

  • 否則,傳回值為非 NULL

這些空間運算子函式可用

  • ST_Buffer(g, d [, strategy1 [, strategy2 [, strategy3]]])

    傳回表示所有點的幾何圖形,這些點與幾何值 g 的距離小於或等於距離 d。結果與幾何引數的 SRS 相同。

    如果幾何引數為空,ST_Buffer() 會傳回空幾何圖形。

    如果距離為 0,ST_Buffer() 會傳回未變更的幾何引數

    mysql> SET @pt = ST_GeomFromText('POINT(0 0)');
    mysql> SELECT ST_AsText(ST_Buffer(@pt, 0));
    +------------------------------+
    | ST_AsText(ST_Buffer(@pt, 0)) |
    +------------------------------+
    | POINT(0 0)                   |
    +------------------------------+

    如果幾何引數位於笛卡爾 SRS 中

    • ST_Buffer() 支援 PolygonMultiPolygon 值,以及包含 PolygonMultiPolygon 值的幾何集合的負距離。

    • 如果結果縮減到消失,則結果為空幾何圖形。

    • 對於 PointMultiPointLineStringMultiLineString 值,以及不包含任何 PolygonMultiPolygon 值的幾何集合,使用負距離的 ST_Buffer() 會發生 ER_WRONG_ARGUMENTS 錯誤。

    允許地理 SRS 中的 Point 幾何圖形,但須符合下列條件

    • 如果距離不為負,且未指定任何策略,則函式會傳回 Point 在其 SRS 中的地理緩衝區。距離引數必須為 SRS 距離單位(目前始終為公尺)。

    • 如果距離為負值,或指定了任何策略(除了 NULL 以外),則會發生 ER_WRONG_ARGUMENTS 錯誤。

    對於非 Point 幾何圖形,會發生 ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS 錯誤。

    ST_Buffer() 允許在距離參數之後最多使用三個可選的策略參數。策略會影響緩衝區的計算。這些參數是由 ST_Buffer_Strategy() 函數產生的位元組字串值,用於點、連接和結束策略。

    每一種類型最多可以指定一個策略,並且可以按任何順序給定。

    如果緩衝區策略無效,則會發生 ER_WRONG_ARGUMENTS 錯誤。在以下任何情況下,策略均為無效:

    • 指定了給定類型的多個策略(點、連接或結束)。

    • 將非策略的值(例如任意二進制字串或數字)作為策略傳遞。

    • 傳遞了 Point 策略,但幾何圖形不包含 PointMultiPoint 值。

    • 傳遞了結束或連接策略,但幾何圖形不包含 LineStringPolygonMultiLinestringMultiPolygon 值。

    mysql> SET @pt = ST_GeomFromText('POINT(0 0)');
    mysql> SET @pt_strategy = ST_Buffer_Strategy('point_square');
    mysql> SELECT ST_AsText(ST_Buffer(@pt, 2, @pt_strategy));
    +--------------------------------------------+
    | ST_AsText(ST_Buffer(@pt, 2, @pt_strategy)) |
    +--------------------------------------------+
    | POLYGON((-2 -2,2 -2,2 2,-2 2,-2 -2))       |
    +--------------------------------------------+
    mysql> SET @ls = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SET @end_strategy = ST_Buffer_Strategy('end_flat');
    mysql> SET @join_strategy = ST_Buffer_Strategy('join_round', 10);
    mysql> SELECT ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy))
    +---------------------------------------------------------------+
    | ST_AsText(ST_Buffer(@ls, 5, @end_strategy, @join_strategy))   |
    +---------------------------------------------------------------+
    | POLYGON((5 5,5 10,0 10,-3.5355339059327373 8.535533905932738, |
    | -5 5,-5 0,0 0,5 0,5 5))                                       |
    +---------------------------------------------------------------+
  • ST_Buffer_Strategy(strategy [, points_per_circle])

    此函數會傳回用於 ST_Buffer() 的策略位元組字串,以影響緩衝區的計算。

    有關策略的資訊,請參閱 Boost.org

    第一個參數必須是一個字串,表示策略選項

    • 對於點策略,允許的值為 'point_circle''point_square'

    • 對於連接策略,允許的值為 'join_round''join_miter'

    • 對於結束策略,允許的值為 'end_round''end_flat'

    如果第一個參數為 'point_circle''join_round''join_miter''end_round',則必須將 points_per_circle 參數給定為正數值。 points_per_circle 的最大值是 max_points_in_geometry 系統變數的值。

    如需範例,請參閱 ST_Buffer() 的說明。

    ST_Buffer_Strategy() 會按照本節簡介中的說明處理其參數,但以下例外:

    • 如果任何參數無效,則會發生 ER_WRONG_ARGUMENTS 錯誤。

    • 如果第一個參數為 'point_square''end_flat',則不得給定 points_per_circle 參數,否則會發生 ER_WRONG_ARGUMENTS 錯誤。

  • ST_ConvexHull(g)

    傳回一個幾何圖形,表示幾何值 g 的凸包。

    此函數會先檢查幾何圖形的頂點是否共線,來計算其凸包。如果共線,則函數會傳回線性包;否則會傳回多邊形包。此函數會處理幾何圖形集合,方法是擷取集合中所有元件的所有頂點,從中建立 MultiPoint 值,然後計算其凸包。

    ST_ConvexHull() 會按照本節簡介中的說明處理其參數,但以下例外:

    • 對於參數為空幾何圖形集合的額外條件,傳回值為 NULL

    mysql> SET @g = 'MULTIPOINT(5 0,25 0,15 10,15 25)';
    mysql> SELECT ST_AsText(ST_ConvexHull(ST_GeomFromText(@g)));
    +-----------------------------------------------+
    | ST_AsText(ST_ConvexHull(ST_GeomFromText(@g))) |
    +-----------------------------------------------+
    | POLYGON((5 0,25 0,15 25,5 0))                 |
    +-----------------------------------------------+
  • ST_Difference(g1, g2)

    傳回一個幾何圖形,表示幾何值 g1g2 的點集合差。結果與幾何參數在相同的 SRS 中。

    ST_Difference() 允許笛卡爾或地理 SRS 中的參數,並按照本節簡介中的說明處理其參數。

    mysql> SET @g1 = Point(1,1), @g2 = Point(2,2);
    mysql> SELECT ST_AsText(ST_Difference(@g1, @g2));
    +------------------------------------+
    | ST_AsText(ST_Difference(@g1, @g2)) |
    +------------------------------------+
    | POINT(1 1)                         |
    +------------------------------------+
  • ST_Intersection(g1, g2)

    傳回一個幾何圖形,表示幾何值 g1g2 的點集合交集。結果與幾何參數在相同的 SRS 中。

    ST_Intersection() 允許笛卡爾或地理 SRS 中的參數,並按照本節簡介中的說明處理其參數。

    mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)');
    mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)');
    mysql> SELECT ST_AsText(ST_Intersection(@g1, @g2));
    +--------------------------------------+
    | ST_AsText(ST_Intersection(@g1, @g2)) |
    +--------------------------------------+
    | POINT(2 2)                           |
    +--------------------------------------+
  • ST_LineInterpolatePoint(ls, fractional_distance)

    此函數會採用 LineString 幾何圖形和範圍在 [0.0, 1.0] 內的距離分數,並傳回沿著 LineStringPoint,其位置為從起點到終點的距離的分數。它可用於回答諸如哪個 Point 位於幾何圖形參數所描述的道路中點的問題。

    此函數已針對所有空間參考系統(包括笛卡爾和地理系統)中的 LineString 幾何圖形實作。

    如果 fractional_distance 參數為 1.0,則由於近似值計算中的數值不準確性,結果可能不是 LineString 參數的最後一個點,而是接近它的點。

    相關函數 ST_LineInterpolatePoints() 採用類似的參數,但會傳回 MultiPoint,其由沿著 LineStringPoint 值組成,每個 Point 值的位置為從起點到終點的距離的分數。如需兩個函數的範例,請參閱 ST_LineInterpolatePoints() 的說明。

    ST_LineInterpolatePoint() 會按照本節簡介中的說明處理其參數,但以下例外:

    ST_LineInterpolatePoint() 是 MySQL 對 OpenGIS 的擴充功能。

  • ST_LineInterpolatePoints(ls, fractional_distance)

    此函數會採用 LineString 幾何圖形和範圍在 (0.0, 1.0] 內的距離分數,並傳回由 LineString 起點組成的 MultiPoint,加上沿著 LineStringPoint 值,每個 Point 值的位置為從起點到終點的距離的分數。它可用於回答諸如哪些 Point 值位於幾何圖形參數所描述的道路上每 10% 的位置的問題。

    此函數已針對所有空間參考系統(包括笛卡爾和地理系統)中的 LineString 幾何圖形實作。

    如果 fractional_distance 參數除以 1.0 的餘數為零,則由於近似值計算中的數值不準確性,結果可能不包含 LineString 參數的最後一個點,而是接近它的點。

    相關函數 ST_LineInterpolatePoint() 採用類似的參數,但會傳回沿著 LineStringPoint,其位置為從起點到終點的距離的分數。

    ST_LineInterpolatePoints() 會按照本節簡介中的說明處理其參數,但以下例外:

    mysql> SET @ls1 = ST_GeomFromText('LINESTRING(0 0,0 5,5 5)');
    mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .5));
    +----------------------------------------------+
    | ST_AsText(ST_LineInterpolatePoint(@ls1, .5)) |
    +----------------------------------------------+
    | POINT(0 5)                                   |
    +----------------------------------------------+
    mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, .75));
    +-----------------------------------------------+
    | ST_AsText(ST_LineInterpolatePoint(@ls1, .75)) |
    +-----------------------------------------------+
    | POINT(2.5 5)                                  |
    +-----------------------------------------------+
    mysql> SELECT ST_AsText(ST_LineInterpolatePoint(@ls1, 1));
    +---------------------------------------------+
    | ST_AsText(ST_LineInterpolatePoint(@ls1, 1)) |
    +---------------------------------------------+
    | POINT(5 5)                                  |
    +---------------------------------------------+
    mysql> SELECT ST_AsText(ST_LineInterpolatePoints(@ls1, .25));
    +------------------------------------------------+
    | ST_AsText(ST_LineInterpolatePoints(@ls1, .25)) |
    +------------------------------------------------+
    | MULTIPOINT((0 2.5),(0 5),(2.5 5),(5 5))        |
    +------------------------------------------------+

    ST_LineInterpolatePoints() 是 MySQL 對 OpenGIS 的擴充功能。

  • ST_PointAtDistance(ls, distance)

    此函數會採用 LineString 幾何圖形和範圍在 [0.0, ST_Length(ls)] 內的距離,距離以 LineString 的空間參考系統 (SRS) 單位測量,並傳回沿著 LineStringPoint,其位置為距離起點的距離。它可用於回答諸如哪個 Point 值距離幾何圖形參數所描述的道路起點 400 公尺的問題。

    此函數已針對所有空間參考系統(包括笛卡爾和地理系統)中的 LineString 幾何圖形實作。

    ST_PointAtDistance() 會按照本節簡介中的說明處理其參數,但以下例外:

    ST_PointAtDistance() 是 MySQL 對 OpenGIS 的擴充功能。

  • ST_SymDifference(g1, g2)

    傳回一個幾何圖形,表示幾何值 g1g2 的點集合對稱差,定義如下:

    g1 symdifference g2 := (g1 union g2) difference (g1 intersection g2)

    或者,使用函數呼叫表示法:

    ST_SymDifference(g1, g2) = ST_Difference(ST_Union(g1, g2), ST_Intersection(g1, g2))

    結果與幾何參數在相同的 SRS 中。

    ST_SymDifference() 允許笛卡爾或地理 SRS 中的參數,並按照本節簡介中的說明處理其參數。

    mysql> SET @g1 = ST_GeomFromText('MULTIPOINT(5 0,15 10,15 25)');
    mysql> SET @g2 = ST_GeomFromText('MULTIPOINT(1 1,15 10,15 25)');
    mysql> SELECT ST_AsText(ST_SymDifference(@g1, @g2));
    +---------------------------------------+
    | ST_AsText(ST_SymDifference(@g1, @g2)) |
    +---------------------------------------+
    | MULTIPOINT((1 1),(5 0))               |
    +---------------------------------------+
  • ST_Transform(g, target_srid)

    將幾何圖形從一個空間參考系統 (SRS) 轉換到另一個。傳回值是與輸入幾何圖形類型相同的幾何圖形,所有座標都已轉換為目標 SRID,target_srid。MySQL 支援 EPSG 定義的所有 SRS,但此處列出的除外:

    • EPSG 1042 Krovak Modified

    • EPSG 1043 Krovak Modified (North Orientated)

    • EPSG 9816 Tunisia Mining Grid

    • EPSG 9826 蘭伯特正角圓錐投影(西向)

    ST_Transform() 依照本節引言所述處理其參數,但有以下例外情況:

    ST_SRID(g, target_srid)ST_Transform(g, target_srid) 的差異如下:

    • ST_SRID() 會變更幾何圖形的 SRID 值,而不轉換其座標。

    • ST_Transform() 除了變更其 SRID 值之外,還會轉換幾何圖形的座標。

    mysql> SET @p = ST_GeomFromText('POINT(52.381389 13.064444)', 4326);
    mysql> SELECT ST_AsText(@p);
    +----------------------------+
    | ST_AsText(@p)              |
    +----------------------------+
    | POINT(52.381389 13.064444) |
    +----------------------------+
    mysql> SET @p = ST_Transform(@p, 4230);
    mysql> SELECT ST_AsText(@p);
    +---------------------------------------------+
    | ST_AsText(@p)                               |
    +---------------------------------------------+
    | POINT(52.38208611407426 13.065520672345304) |
    +---------------------------------------------+
  • ST_Union(g1, g2)

    傳回一個幾何圖形,表示幾何值 g1g2 的點集聯集。結果與幾何參數位於相同的 SRS 中。

    ST_Union() 允許使用笛卡爾或地理 SRS 中的參數,並按照本節引言所述處理其參數。

    mysql> SET @g1 = ST_GeomFromText('LineString(1 1, 3 3)');
    mysql> SET @g2 = ST_GeomFromText('LineString(1 3, 3 1)');
    mysql> SELECT ST_AsText(ST_Union(@g1, @g2));
    +--------------------------------------+
    | ST_AsText(ST_Union(@g1, @g2))        |
    +--------------------------------------+
    | MULTILINESTRING((1 1,3 3),(1 3,3 1)) |
    +--------------------------------------+