sql >> Databáze >  >> RDS >> Mysql

Vyberte všechny geoprostorové body uvnitř ohraničovacího rámečku

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/



  1. Změna portu serveru postgres kontejnerů v Docker Compose

  2. Jak vrátit výsledky dotazu jako seznam oddělený čárkami v MySQL

  3. Refaktorujte funkci PL/pgSQL, abyste vrátili výstup různých SELECT dotazů

  4. Jak zachovat VELKÉ BLOBy (>100 MB) v Oracle pomocí Hibernate