Formentlig x- og y-elementerne i dine POINT-data i din geometry
kolonnen er i bredde- og længdegrader.
For at gøre dette opslag effektivt i MySQL skal du bruge et par ting.
- En MyISAM-tabel (eller MySQL version 5.7 og nyere og enten InnoDB eller MyISAM)
- EN IKKE NULL-kvalifikation på din geometrikolonne
- Et rumligt indeks
ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
- Kode for at skabe en tekstlig repræsentation af det rektangel, du vil søge efter
- Brug af funktionerne GeomFromText og MBRContains / MBRWithin i din SELECT-sætning.
Antag, at din bredde/lange boks er et rektangel på én grad i udstrækning centreret omkring Winchester Cathedral (51.0606, -1.3131) . Du skal bruge en afgrænsningsramme omkring det punkt. Denne MySQL-forespørgsel vil generere en LINESTRING (tekst) for en linje, der går diagonalt hen over det afgrænsningsfelt.
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
Forespørgslen giver dig dette:
LINESTRING(50.5606 -1.8131,51.5606 -0.8131)
Du kan også bruge strengbehandling på et værtssprog til at komme med en lignende slags tekststreng. Formatet du skal bruge er dette.
LINESTRING(lat1 long1, lat2 long2)
Så kan du bruge den til at søge i din rumlige tabel som følger:
SELECT whatever, whatever
FROM flags
WHERE MBRContains(
GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
flags.coordinates)
Dette vil udnytte det rumlige indeks og finde hver række af flags
hvis koordinater ligger inden for afgrænsningsrammen for den diagonale linje.
Her er noget dokumentation .
Hvis dit flags
tabel indeholder færre end et par hundrede tusinde rækker, kan du opleve, at en almindelig tabel (ikke en rumlig tabel) med bredde- og længdegradskolonner (FLOAT-datatyper, indekseret) fungerer lige så godt og er nemmere at udvikle og fejlsøge.
Jeg har skrevet en tutorial om den teknik. http://www.plumislandmedia.net/mysql/haversine-mysql- nærmeste-loc/