Pravděpodobně položky x a y v datech POINT ve vaší geometry
sloupec je ve stupních zeměpisné šířky a délky.
Chcete-li provést toto vyhledávání efektivně v MySQL, budete potřebovat několik věcí.
- Tabulka MyISAM (nebo MySQL verze 5.7 a novější a buď InnoDB nebo MyISAM)
- NENÍ NULL kvalifikace ve sloupci geometrie
- Prostorový index
ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
- Kód pro vytvoření textové reprezentace obdélníku, který chcete prohledávat
- Použití funkcí GeomFromText a MBRContains / MBRWithin v příkazu SELECT.
Předpokládejme, že vaše pole šířky/délky je obdélník o rozsahu jednoho stupně se středem kolem Winchesterská katedrála (51.0606, -1.3131) . Kolem tohoto bodu potřebujete ohraničující rámeček. Tento dotaz MySQL vygeneruje LINESTRING (text) pro čáru procházející diagonálně přes tento ohraničovací rámeček.
SELECT
CONCAT('LINESTRING(',
latitude-0.5,' ',longitude-0.5,
',',
latitude+0.5 ,' ',longitude +0.5,
')') AS box
FROM (
SELECT 51.0606 AS latitude, -1.3131 AS longitude
) AS coord
Dotaz vám poskytne toto:
LINESTRING(50.5606 -1.8131,51.5606 -0.8131)
K vytvoření podobného typu textového řetězce můžete také použít zpracování řetězců v hostitelském jazyce. Formát, který potřebujete, je tento.
LINESTRING(lat1 long1, lat2 long2)
Poté jej můžete použít k prohledávání prostorové tabulky následovně:
SELECT whatever, whatever
FROM flags
WHERE MBRContains(
GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
flags.coordinates)
To využije prostorový index a najde každý řádek flags
jehož souřadnice leží v ohraničujícím rámečku této diagonální čáry.
Zde je nějaká dokumentace .
Pokud vaše flags
tabulka obsahuje méně než několik set tisíc řádků, možná zjistíte, že běžná tabulka (nikoli prostorová tabulka) se sloupci zeměpisné šířky a délky (datové typy FLOAT, indexované) funguje také a snáze se vyvíjí a ladí.
Napsal jsem tutoriál o této technice. http://www.plumislandmedia.net/mysql/haversine-mysql- nejbližší-lok/