Estou tentando selecionar pontos dentro de polígonos usando as extensões GIS/espaciais para MySQL. Eu sou relativamente novo nisso, então tenha paciência comigo se esta for uma questão elementar.
Eu tenho pontos definidos como texto no banco de dados e estou tentando obter um valor booleano para saber se um ponto está dentro de um determinado polígono definido. Aqui estão minhas consultas, com uma WHERE
instrução lenta para garantir que todos retornem TRUE
(observe que esses são valores LAT/LNG e o polígono é um quadrado começando no canto noroeste, sendo definido no sentido horário):
mysql> SET @zone = GeomFromText('Polygon((-73.9650952400 40.8072101100,-73.9531904800 40.8072101100,-73.9531904800 40.7982011000,-73.9650952400 40.7982011000,-73.9650952400 40.8072101100))');
Query OK, 0 rows affected (0.00 sec)
Verificando se esta consulta funcionou:
mysql> SELECT AsText(@zone);
+---------------------------------------------------------------------------------------------------------------------------------------+
| AsText(@zone) |
+---------------------------------------------------------------------------------------------------------------------------------------+
| POLYGON((-73.96509524 40.80721011,-73.95319048 40.80721011,-73.95319048 40.7982011,-73.96509524 40.7982011,-73.96509524 40.80721011)) |
+---------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Em seguida, a declaração problemática:
mysql> SELECT id,latitude,longitude, MBRWithin(GeomFromText(geo),@zone), AsText(geo)
FROM image_meta WHERE
(latitude BETWEEN 40.7982011 AND 40.80721011) AND
(longitude BETWEEN -73.96509524 AND -73.95319048)
LIMIT 10;
e o resultado:
+---------+---------------+----------------+------------------------------------+-----------------------------------+
| id | latitude | longitude | MBRWithin(GeomFromText(geo),@zone) | AsText(geo) |
+---------+---------------+----------------+------------------------------------+-----------------------------------+
| 2598514 | 40.7982018590 | -73.9636609250 | NULL | POINT(-73.963660925 40.798201859) |
| 2490688 | 40.7982019370 | -73.9624817730 | NULL | POINT(-73.962481773 40.798201937) |
| 1325723 | 40.7982019940 | -73.9649998380 | NULL | POINT(-73.964999838 40.798201994) |
| 2466868 | 40.7982025000 | -73.9537353330 | NULL | POINT(-73.953735333 40.7982025) |
| 442505 | 40.7982033330 | -73.9584200000 | NULL | POINT(-73.95842 40.798203333) |
| 9517611 | 40.7982033330 | -73.9635783330 | NULL | POINT(-73.963578333 40.798203333) |
| 2681112 | 40.7982033580 | -73.9649211860 | NULL | POINT(-73.964921186 40.798203358) |
| 2681113 | 40.7982033580 | -73.9649211860 | NULL | POINT(-73.964921186 40.798203358) |
| 338950 | 40.7982050000 | -73.9649306570 | NULL | POINT(-73.964930657 40.798205) |
| 1204589 | 40.7982052380 | -73.9649509480 | NULL | POINT(-73.964950948 40.798205238) |
+---------+---------------+----------------+------------------------------------+-----------------------------------+
10 rows in set (0.00 sec)
Esta consulta foi projetada com base nesta documentação: http://dev.mysql.com/doc/refman/5.6/en/spatial-relation-functions-mysql-specific.html#function_mbrcontains
Eu esperaria que a MBRWithin(GeomFromText(geo),@zone)
coluna fosse TRUE
(ou 1
) para cada linha, mas eles são NULL
- minha sintaxe está errada ou são minhas expectativas?
Muito obrigado antecipadamente.
Posso estar errado, mas acredito que
MBRWithin(GeomFromText(geo),@zone)
deve ser - nãoMBRWithin(geo, @zone)
precisa converter nada, já está armazenado em formato espacial.Quando funções como essas obtêm operandos de tipo inválido, elas retornam null.