MySQL 查询在边界框内的地理位置点
在处理有关地理位置的数据时,查询某个地理位置点是否在一个边界框内是一个非常常见的需求。MySQL提供了一种方便快捷的方式来查询位于某个边界框内的地理位置点。
阅读更多:MySQL 教程
创建一个示例表
在本文中,我们将使用以下示例表 locations
,该表包含了多个地理位置点的经纬度信息:
CREATE TABLE `locations` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`lat` double NOT NULL,
`lng` double NOT NULL,
PRIMARY KEY (`id`),
SPATIAL KEY `lat_lng` (`lat`,`lng`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
在这个表中,我们使用了一个SPATIAL
索引 lat_lng
来设置两个地理坐标列 lat
和 lng
作为组合索引。SPATIAL
索引是一种 MySQL 特有的索引类型,它使用 R树数据结构来优化地理空间数据的查询。
插入地理位置点数据
为了使查询更加具有实际意义,让我们向上述示例表中插入一些地理位置点。
INSERT INTO `locations` (`name`, `lat`, `lng`)
VALUES
('Point A', 42.3529, -71.0646),
('Point B', 42.3573, -71.0603),
('Point C', 42.3611, -71.0672),
('Point D', 42.3644, -71.0616),
('Point E', 42.3580, -71.0525),
('Point F', 42.3588, -71.0628),
('Point G', 42.3492, -71.0604),
('Point H', 42.3506, -71.0746),
('Point I', 42.3555, -71.0700),
('Point J', 42.3555, -71.0628);
在本文接下来的内容中,我们将使用这些地理位置点的经度和纬度信息来演示如何查询边界框内的地理位置点。
边界框查询
假设我们要查询 locations
表中位于一个边界框内的地理位置点。我们只需使用 MySQL 提供的 ST_CONTAINS
函数。该函数用于确定是否包含一个几何对象的另一个几何对象。下面是一些示例查询:
查询在一个矩形区域内的所有地方
SELECT *
FROM `locations`
WHERE ST_CONTAINS(ST_MakeEnvelope(-71.07, 42.35, -71.04, 42.37, 4326), POINT(lat, lng));
上述查询将筛选出位于一个左下角坐标为 (-71.07,42.35)
,右上角坐标为 (-71.04,42.37)
的矩形内的所有地理位置点。
查询在一个圆形区域内的所有地方
SELECT * FROM `locations`
WHERE ST_CONTAINS(ST_Buffer(POINT(-71.054, 42.355), 1000), POINT(lat, lng));
上述查询将查询位于以经度 -71.054
和纬度 42.355
为圆心,半径为 1000
米(使用 WGS84 坐标系)的圆形区域内的所有地理位置点。
查询在多边形区域内的所有地方
SELECT *
FROM `locations`
WHERE ST_CONTAINS(ST_GeomFromText('POLYGON((-71.060 42.353,-71.055 42.353,-71.054 42.350,-71.056 42.349,-71.061 42.349,-71.064 42.351,-71.060 42.353,-71.060 42.353,-71.060 42.353))'), POINT(lat, lng));
上述查询将查询所有位于一个由多个坐标点组成的多边形区域内的地理位置点。
在上述查询中,定义多边形区域的坐标点形成了一个环形,即第一个和最后一个坐标点是相同的。这是为了让 MySQL 知道区域的形状并正确地计算多边形的面积。
总结
在 MySQL 中查询位于一个边界框内的地理位置点是很容易的。我们可以使用 ST_CONTAINS
函数来查询一个经纬度点是否位于一个多边形,圆形或矩形区域内。对于更大规模的地理位置数据集,使用 SPATIAL
索引可以提高查询效率。