sql >> Database >  >> RDS >> Mysql

Selecteer alle georuimtelijke punten in een selectiekader

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/



  1. PHP meerdere object functie-aanroepen

  2. TRIM() Functie in Oracle

  3. Meerdere COUNT() voor meerdere voorwaarden in één query (MySQL)

  4. In tsql is een Insert met een Select-statement veilig in termen van gelijktijdigheid?