2013-08-18 5 views
0

Хорошо, у меня есть достаточно сложный запрос, который проверяет, содержит ли точечная переменная, содержащая набор координат широты + долготы (который я заменил -41.000000 & 174.000000 для удобства чтения) содержится в многоугольнике, который создан из моего table squares (который содержит 2.25m строк координат, представляющих верхний левый угол квадрата, который затем экстраполирую, добавляя 0.5/60 к каждой координате, чтобы создать квадрат). Он проверяет, есть ли соответствие, используя функцию MySQL 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. Мысли?

+0

Можете ли вы предоставить Lat/LNG – lreeder

ответ

0

Две вещи здесь происходит:

  1. Вершины в определениях WKT определяются как (X, Y), в отличие от широты/долготы, которая определяется как "X, Y". Вы создаете свои строки WKT POLYGON и POINT, используя (lat lng), но должны использовать (lng lat). Поскольку вы согласны в этом, это будет работать здесь, но может нарушиться в других ситуациях.

  2. Настоящая проблема заключается в том, что созданный вами POLYGON не закрыт. MySQL спокойно возвращает null, когда GeomFromText передается недопустимой строкой WKT, поэтому 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)') 
)