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

Dotazovací body v rámci daného okruhu v MySQL

Pro MySQL 5.7+

Vzhledem k tomu, že máme následující jednoduchou tabulku,

vytvoření příkladu tabulky ( id bigint není null primární klíč auto_increment, bod lnglat není null);vytvoření prostorového indexu example_lnglat na příkladu (lnglat); 

S následujícími jednoduchými údaji,

vložit do příkladu (lnglat) hodnoty(bod(-2,990435, 53,409246)),(bod(-2,990037, 53,409471)),(bod(-2,989736, 53,409676)),(975754,09 )),(bod(-2,989350, 53,409906)),(bod(-2,989178, 53,410085)),(bod(-2,988739, 53,410309)),(bod (-2,985874, 27,509906), 57,52941 )); 

Body v daném rozsahu jiného bodu (poznámka:musíme hledat uvnitř polygonu) byste získali pomocí následující kombinace funkcí st:

set @px =-2,990497;set @py =53,410943;set @range =150; --meterset @rangeKm =@range / 1000;set @search_area =st_makeEnvelope ( point((@px + @rangeKm / 111), (@py + @rangeKm / 111)), point((@px - @rangeKm / 111) ), (@py - @rangeKm / 111)));vyberte id, st_x(lnglat) lng, st_y(lnglat) lat, st_distance_sphere(point(@px, @py), lnglat) jako vzdálenost od příkladu, kde st_contains(@ oblast hledání, lnglat); 

Ve výsledku byste měli vidět něco takového:

3 -2,989736 53.409676 149.640842527762774 -2,989554 53,409797 141.932327146540253636275402536362754025340999999159534733999991553409999959155340999995915953333309999915 53,40999906399155347330990639159533309906.

Pro referenci na vzdálenost, pokud odstraníme omezení, výsledek pro testovací bod vypadá takto:

1 -2.990435 53.409246 188.74211814575562 -2.990037 53.409471 166.494065091601583 -2.989736 53.409676 149.640842527762774 -2.989554 53.409797 141.932327146618125 -2.98935 53.409906 138.115162754025336 -2.989178 53.410085 129.402892895274737 -2.988739 53.410309 136.18755404982028 -2.985874 53.412656 360.785327320139639 -2.758019 53.635928 29360.27797292756 

Poznámka 1 :pole se nazývá lnglat, protože to je správné pořadí, pokud body považujete za (x, y) a je to také pořadí, ve kterém většina funkcí (jako bod) přijímá parametr

Poznámka 2 :pokud byste použili kruhy, nemůžete ve skutečnosti využít prostorové indexy; také si všimněte, že bodové pole lze nastavit tak, aby přijímalo hodnotu null, ale prostorové indexy jej nemohou indexovat, pokud lze hodnotu null použít (všechna pole v indexu musí být bez hodnoty null).

Poznámka 3 :st_buffer je považován (dokumentací) za špatný pro tento případ použití

Poznámka 4 :výše uvedené funkce (zejména st_distance_sphere) jsou zdokumentovány jako rychlé, ale ne nutně super přesné; pokud jsou na to vaše data velmi citlivá, přidejte do vyhledávání trochu prostoru pro pohyb a dolaďte sadu výsledků



  1. Jak uniknout čárce a dvojité uvozovce současně pro soubor CSV?

  2. Jak funguje TRY_CONVERT() na serveru SQL Server

  3. Třídění SQL se neřídí skupina po příkazu, vždy používá primární klíč

  4. Indexujte databázi MySQL pomocí Apache Lucene a udržujte je synchronizované