MySQL空间关系查询返回空结果集?

时间:2013-08-18 08:05:45

标签: mysql sql select geospatial

好的,我有一个相当复杂的查询,它检查一个点变量是否包含一组纬度+经度坐标(我用-41.000000& 174.000000代替以便于阅读)是包含在一个多边形中,该多边形是从我的表squares创建的(其中包含2.25m的坐标代表方形左上角的坐标行,然后我通过将0.5 / 60添加到每个坐标来推断出来创造一个正方形)。它使用MySQL MBRContains函数检查是否匹配。唯一的问题是,它根本不起作用,我只是得到这个消息:

MySQL returned an empty result set (i.e. zero rows).

以下是查询:

SELECT `square_id` FROM `squares` WHERE 

MBRContains(
    GeomFromText(
            CONCAT(
                    'POLYGON((',
                        `coord_lat`,' ',`coord_long`,',',
                        `coord_lat`,' ',(`coord_long` + (0.5 / 60)),',',
                        (`coord_lat` + (0.5 / 60)),' ',(`coord_long` + (0.5 / 60)),',',
                        (`coord_lat` + (0.5 / 60)),' ',`coord_long`,
                    '))'
                  )
               ),
   GeomFromText('POINT(-41.000000 174.000000)')
)

知道为什么会这样吗?肯定有一个正方形包含我的点对象中的坐标,我在SQL语法中看不到任何明显的错误。想法?

1 个答案:

答案 0 :(得分:0)

这里有两件事:

  1. WKT定义中的顶点定义为(X,Y),与纬度/经度不同,后者定义为“X,Y”。你正在使用(lat lng)构建你的WKT POLYGON和POINT字符串,但是应该使用(lng lat)。由于你对此一致,这可以在这里工作,但在其他情况下可能会中断。

  2. 实际问题是您创建的POLYGON未关闭。当GeomFromText传递无效的WKT字符串时,MySQL会静默返回null,因此MBRContains找不到任何交叉点。要关闭POLYGON,需要将起点添加到多边形字符串的末尾。尝试将SQL更改为:

  3. SELECT `square_id` FROM `squares` WHERE
    MBRContains(
      GeomFromText(
            CONCAT(
                    'POLYGON((',
                        `coord_lat`,' ',`coord_long`,',',
                        `coord_lat`,' ',(`coord_long` + (0.5 / 60)),',',
                        (`coord_lat` + (0.5 / 60)),' ',(`coord_long` + (0.5 / 60)),',',
                        (`coord_lat` + (0.5 / 60)),' ',`coord_long`,',',
                        `coord_lat`,' ',`coord_long`
                    '))'
                  )
               ),
      GeomFromText('POINT(-41.000000 174.000000)')
    )