Vermoedelijk de x- en y-items in uw POINT-gegevens in uw geometry
kolom is in breedte- en lengtegraden.
Om deze zoekopdracht efficiënt uit te voeren in MySQL, heb je een paar dingen nodig.
- Een MyISAM-tabel (of MySQL versie 5.7 en hoger en ofwel InnoDB of MyISAM)
- EEN NIET NULL-kwalificatie op uw geometriekolom
- Een ruimtelijke index
ALTER TABLE flags ADD SPATIAL INDEX (coordinates)
- Code om een tekstuele weergave te maken van de rechthoek waarin u wilt zoeken
- Gebruik van de functies GeomFromText en MBRContains / MBRWithin in uw SELECT-instructie.
Stel dat uw lat/long box een rechthoek is van één graad in omvang, gecentreerd rond Kathedraal van Winchester (51.0606, -1.3131) . Rond dat punt heb je een begrenzingsvak nodig. Deze MySQL-query genereert een LINESTRING (tekst) voor een lijn die diagonaal over dat selectiekader loopt.
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
De zoekopdracht levert je dit op:
LINESTRING(50.5606 -1.8131,51.5606 -0.8131)
Je kunt ook stringverwerking in een hosttaal gebruiken om een soortgelijk soort tekststring te bedenken. Het formaat dat je nodig hebt is dit.
LINESTRING(lat1 long1, lat2 long2)
Vervolgens kunt u het gebruiken om als volgt in uw ruimtelijke tabel te zoeken:
SELECT whatever, whatever
FROM flags
WHERE MBRContains(
GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
flags.coordinates)
Dit maakt gebruik van de ruimtelijke index en vindt elke rij flags
waarvan de coördinaten binnen het begrenzingsvak van die diagonale lijn liggen.
Hier is wat documentatie .
Als uw flags
tabel minder dan een paar honderdduizend rijen bevat, kan het zijn dat een gewone tabel (geen ruimtelijke tabel) met kolommen voor breedtegraad en lengtegraad (FLOAT-gegevenstypes, geïndexeerd) ook goed presteert en gemakkelijker te ontwikkelen en te debuggen is.
Ik heb een tutorial over die techniek geschreven. http://www.plumislandmedia.net/mysql/haversine-mysql- dichtstbijzijnde-loc/