0

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

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 语法中看不到任何明显的错误。想法?

4

1 回答 1

0

这里发生了两件事:

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

  2. 实际问题是您创建的 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)')
)
于 2013-08-24T15:39:14.237 回答