好的,我有一个相当复杂的查询,它检查一个点变量是否包含一组纬度+经度坐标(我用-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语法中看不到任何明显的错误。想法?
答案 0 :(得分:0)
这里有两件事:
WKT定义中的顶点定义为(X,Y),与纬度/经度不同,后者定义为“X,Y”。你正在使用(lat lng)构建你的WKT POLYGON和POINT字符串,但是应该使用(lng lat)。由于你对此一致,这可以在这里工作,但在其他情况下可能会中断。
实际问题是您创建的POLYGON未关闭。当GeomFromText传递无效的WKT字符串时,MySQL会静默返回null,因此MBRContains找不到任何交叉点。要关闭POLYGON,需要将起点添加到多边形字符串的末尾。尝试将SQL更改为:
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)') )