sql >> Database teknologi >  >> RDS >> Mysql

Vælg alle geospatiale punkter inde i en afgrænsningsramme

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/



  1. udvidelse af PDO-klassen

  2. BOB Dynamic Query Building

  3. Mysqldump lanceret af cron og adgangskodesikkerhed

  4. Sqlplus login fejl ved brug af bash variabler:SP2-0306:Ugyldig indstilling