Některá verze toho, co děláte, je správná, ale myslím, že pravděpodobně budete chtít použít skutečné typy geometrie, zvláště pokud používáte MyISAM a můžete vytvořit prostorový index R-Tree. Můžete mít sloupce s jakýmkoli podporovaným typem (tj. point
, polygon
), nebo geometry
typ:
mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)
Poté se dotazujte a aktualizujte syntaxí WKT:
mysql> insert into spatial_table values (1, GeomFromText('POINT(1 1)'), GeomFromText('POLYGON((1 1, 2 2, 0 2, 1 1))'));
Query OK, 1 row affected (0.00 sec)
mysql> insert into spatial_table values (1, GeomFromText('POINT(10 10)'), GeomFromText('POLYGON((10 10, 20 20, 0 20, 10 10))') );
Query OK, 1 row affected (0.00 sec)
Poté můžete provést svůj dotaz (tj. okolí) proti minimálnímu ohraničujícímu obdélníku čáry s koncovými body bod1 =zeměpisná délka - přírůstek, délka - přírůstek, y =zeměpisná délka + přírůstek, zeměpisná šířka + přírůstek, tj. zde s +- 1 :
mysql> select * from spatial_table where MBRContains(GeomFromText('LINESTRING(9 9, 11 11)'), my_spots);
+------+---------------------------+-----------------------------------------------------------------------------------+
| id | my_spots | my_polygons |
+------+---------------------------+-----------------------------------------------------------------------------------+
| 1 | [email protected] [email protected] | [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] |
+------+---------------------------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)
To bude fungovat mnohem lépe než aritmetika na hromadě plováků představujících zeměpisnou délku a šířku. BTW přibližně v místě San Francisca následující konstanty docela dobře fungují pro převod mezi km a stupni zeměpisné délky a šířky (tj. pokud chcete čisté čtvercové mapy Santa Cruz):
lonf 0.01132221938
latf 0.0090215040
To znamená, že (x +- 2*lonf, y +- 2*latf) vám dává relevantní $lat_floor
atd. hodnoty pro chlapce o šířce 2 km kolem vašeho bodu zájmu.