MariaDB ST_WITHIN() 函数的基础用法与实例

MariaDB ST_WITHIN() 函数用来判断一个几何形状是否完全落在另一个几何形状的内部。

发布于

MariaDB ST_WITHIN() 函数用来判断一个几何形状是否完全落在另一个几何形状的内部。如果第一个几何形状完全在第二个几何形状的内部,则返回 1;否则返回 0。该函数常用于地理空间数据分析和查询。

语法

MairaDB ST_WITHIN() 函数的语法如下:

ST_WITHIN(g1, g2)
  • g1 是第一个几何形状,可以是 POINT、LINESTRING、POLYGON 等类型。
  • g2 是第二个几何形状,同样可以是各种类型的几何对象。

函数返回一个 0 或 1,表示第一个几何形状是否完全落在第二个几何形状的内部。

实例

测试点是否在矩形内

DROP TABLE IF EXISTS points;
CREATE TABLE points (
    id INT PRIMARY KEY AUTO_INCREMENT,
    pt POINT NOT NULL
);

INSERT INTO points (pt) VALUES
    (ST_PointFromText('POINT(2 2)')),
    (ST_PointFromText('POINT(4 4)')),
    (ST_PointFromText('POINT(6 5)'));

SELECT id, ST_WITHIN(pt, ST_PolygonFromText('POLYGON((1 1, 5 1, 5 5, 1 5, 1 1))')) AS within_rect
FROM points;

以下是该语句的输出:

+----+-------------+
| id | within_rect |
+----+-------------+
|  1 |           1 |
|  2 |           1 |
|  3 |           0 |
+----+-------------+

结果显示第一个点 POINT(2 2) 和第二个点 POINT(4 4) 都在矩形内,第三个点 POINT(6 5) 在矩形外。

测试线是否在矩形内

DROP TABLE IF EXISTS lines_table;
CREATE TABLE lines_table (
    id INT PRIMARY KEY AUTO_INCREMENT,
    ln LINESTRING NOT NULL
);

INSERT INTO lines_table (ln) VALUES
    (ST_LineFromText('LINESTRING(2 2, 4 4)')),
    (ST_LineFromText('LINESTRING(6 2, 8 6)')),
    (ST_LineFromText('LINESTRING(1 1, 5 5)'));

SELECT id, ST_WITHIN(ln, ST_PolygonFromText('POLYGON((0 0, 6 0, 6 6, 0 6, 0 0))')) AS within_rect
FROM lines_table;

以下是该语句的输出:

+----+-------------+
| id | within_rect |
+----+-------------+
|  1 |           1 |
|  2 |           0 |
|  3 |           1 |
+----+-------------+

结果显示第一条线 LINESTRING(2 2, 4 4) 和第三条线 LINESTRING(1 1, 5 5) 都在矩形内,但第二条线 LINESTRING(6 2, 8 6) 不在矩形内。

测试多边形是否在多边形内

DROP TABLE IF EXISTS polygons;
CREATE TABLE polygons (
    id INT PRIMARY KEY AUTO_INCREMENT,
    poly POLYGON NOT NULL
);

INSERT INTO polygons (poly) VALUES
    (ST_PolygonFromText('POLYGON((2 2, 2 4, 4 4, 4 2, 2 2))')),
    (ST_PolygonFromText('POLYGON((6 6, 6 8, 8 8, 8 6, 6 6))')),
    (ST_PolygonFromText('POLYGON((1 1, 1 3, 3 3, 3 1, 1 1))'));

SELECT id, ST_WITHIN(poly, ST_PolygonFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))')) AS within_rect
FROM polygons;

以下是该语句的输出:

+----+-------------+
| id | within_rect |
+----+-------------+
|  1 |           1 |
|  2 |           0 |
|  3 |           1 |
+----+-------------+

结果显示第一个多边形和第三个多边形在大矩形内,但第二个多边形在大矩形外。

测试几何集合是否在多边形内

DROP TABLE IF EXISTS geoms;
CREATE TABLE geoms (
    id INT PRIMARY KEY AUTO_INCREMENT,
    g GEOMETRYCOLLECTION NOT NULL
);

INSERT INTO geoms (g) VALUES
    (ST_GeomFromText('GEOMETRYCOLLECTION(POINT(2 2), LINESTRING(2 3, 4 3))')),
    (ST_GeomFromText('GEOMETRYCOLLECTION(POINT(6 6), LINESTRING(6 7, 8 7))')),
    (ST_GeomFromText('GEOMETRYCOLLECTION(POLYGON((1 1, 1 2, 2 2, 2 1, 1 1)))'));

SELECT id, ST_WITHIN(g, ST_PolygonFromText('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))')) AS within_rect
FROM geoms;

以下是该语句的输出:

+----+-------------+
| id | within_rect |
+----+-------------+
|  1 |           1 |
|  2 |           0 |
|  3 |           1 |
+----+-------------+

结果显示第一个几何集合和第三个几何集合在矩形内,但第二个几何集合在矩形外。

测试几何对象是否在空间索引范围内

DROP TABLE IF EXISTS cities;
CREATE TABLE cities (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(35) NOT NULL,
    location POINT NOT NULL,
    SPATIAL INDEX(location)
) ENGINE=InnoDB;

INSERT INTO cities (name, location) VALUES
    ('Beijing', ST_PointFromText('POINT(116.395554 39.907772)', 4326)),
    ('New York', ST_PointFromText('POINT(-74.004363 40.710262)', 4326)),
    ('London', ST_PointFromText('POINT(-0.127810 51.507186)', 4326));

SET @bbox = ST_PolygonFromText('POLYGON((-10 35, 35 35, 35 60, -10 60, -10 35))', 4326);

SELECT name, ST_WITHIN(location, @bbox) AS within_bbox
FROM cities;

以下是该语句的输出:

+----------+-------------+
| name     | within_bbox |
+----------+-------------+
| Beijing  |           0 |
| New York |           0 |
| London   |           1 |
+----------+-------------+

结果显示伦敦位于给定的地理边界框内,而北京和纽约不在边界框内。

相关函数

以下是几个与 MairaDB ST_WITHIN() 相关的几个函数:

  • MariaDB ST_Contains() 函数用来判断一个几何形状是否包含另一个几何形状。
  • MariaDB ST_Crosses() 函数用来判断两个几何形状是否相交。
  • MariaDB ST_Disjoint() 函数用来判断两个几何形状是否不相交。
  • MariaDB ST_Intersects() 函数用来判断两个几何形状是否有交集。
  • MariaDB ST_Overlaps() 函数用来判断两个几何形状是否部分重叠。

结论

MariaDB ST_WITHIN() 函数是一个非常有用的空间函数,可以帮助我们快速判断一个几何形状是否完全包含在另一个几何形状中。通过本文提供的多个实例,相信您已经对该函数有了全面的了解。在处理地理空间数据时,ST_WITHIN() 函数无疑是一个强有力的工具。