I am trying to select points within polygons using the GIS/spatial extensions for MySQL. I'm fairly new to this, so bear with me if this is an elementary question.
I have points defined as text within the database, and am trying to get a boolean value for whether a point falls within a certain defined polygon. Here are my queries, with a slow WHERE
statement to ensure that all should return TRUE
(note that these are LAT/LNG values, and the polygon is a square starting in the northwest corner, being defined clockwise):
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)
Checking that this query worked:
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)
Then the problematic statement:
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;
and the result:
+---------+---------------+----------------+------------------------------------+-----------------------------------+
| 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)
This query was designed based on this documentation: http://dev.mysql.com/doc/refman/5.6/en/spatial-relation-functions-mysql-specific.html#function_mbrcontains
I would expect the MBRWithin(GeomFromText(geo),@zone)
column to be TRUE
(or 1
) for every row, but they are NULL
– is my syntax wrong, or are my expectations?
Many thanks in advance.
Best Answer
I may be wrong, but I believe that
MBRWithin(GeomFromText(geo),@zone)
, should beMBRWithin(geo, @zone)
-no need to convert anything, it is stored already in spatial format.When functions like these get bad-type operands, they return null.