【问题标题】:MySQL: get record within polygonMySQL:获取多边形内的记录
【发布时间】:2016-11-20 15:10:13
【问题描述】:

我在数据库中有一个带有纬度和经度属性的表

CREATE TABLE `companies` (
  `ID` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `latitude` decimal(12,8) NOT NULL,
  `longitude` decimal(12,8) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


INSERT INTO `companies` (`ID`, `title`, `latitude`, `longitude`) VALUES 
(NULL, 'John and SOns', '25.29064622', '55.368462502'), 
(NULL, 'Evas', '25.28862850', '55.40107816');

在谷歌地图上,我有一个折线功能,用户可以在其中绘制折线,因此我们可以显示该多边形内的所有公司。

这是地图图片

Google 可能会给出一个经纬度数组

如何查询以从位于绘制多边形内的数据库中获取所有记录?

【问题讨论】:

  • 如果您乐于使用(投影到)欧几里得几何,那么从 MySQL v5.7.5 ST_Contains() 将完全符合您的要求;早期版本的 MySQL 只能使用MBRContains() 对指定多边形的最小边界矩形进行测试。
  • 我使用的是 MySQL v5.6.28,由于谷歌地图 bounds.getCenter() 函数给出了多边形中心的纬度和经度,所以有什么方法可以获取多边形半径,以便可以通过数据库中的距离进行查询。
  • 如果您对这种近似感到满意,MBRContains() 有什么问题?
  • 对于 MBRContains() 比较我应该将 lat long 存储在同一列吗?
  • 最好将 Lat 和 Long 存储在单个 POINT 类型列中,因为这样您就可以在其上构建空间 R-Tree 索引(这极大地有助于跨 2 执行有界搜索尺寸,如您所愿)。

标签: mysql sql google-maps polygon spatial


【解决方案1】:

如果您将查询编写为:

select ID,title from companies where st_within(point(companies.longitude,companies.latitude),  ST_GeomFromText('Polygon((75.80278873443604 26.863847231536703, 75.79540729522705 26.85136594544373, 75.81798076629639 26.851595674802315,75.80278873443604 26.863847231536703))'));

那么应该可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2013-10-03
    • 2020-06-17
    • 2017-05-23
    相关资源
    最近更新 更多