Hlavní navigace

Randonautica v GNU R: vydejte se na výlet na náhodné neznámé místo

18. 2. 2021
Doba čtení: 4 minuty

Sdílet

 Autor: Depositphotos
V GNU R si implementujeme náhodné generování blízkých míst, na které se potom ve skutečnosti vypravíme na výlet. Nemusíme přitom používat žádnou specializovanou aplikaci, stačí nám na to existující nástroje.

O aplikaci Randonautica jsem se poprvé dozvěděl, když jsem na Youtube sledoval jeden z mých oblíbených pořadů o bizarních, temných a znepokojivých kuriozitách Nexpo. V epizodě Investigating Mysterious Encounters from Randonautica se dozvíme, že v červnu 2020 v Seattlu skupina teenagerů použila aplikaci Randonautica. Randonautica údajně náhodně generuje místa v blízkosti několika kilometrů, aby je člověk rekreačně navštívil. Skupina šla na vygenerované místo a našla tam kufr se dvěma lidskými mrtvolami.

Pořad spekuluje, že bizarní objevy na místech generovaných aplikací Randonautica se podezřele množí.


Bill Bertram (Pixel8) 2007–08, CC BY-SA 3.0, via Wikimedia Commons

Odtud se počítá zeměpisná délka.

Idea chození na náhodná místa mě zaujala, tak jsem Randonauticu stáhnul a po pár minutách zase smazal. Jak je bohužel zvykem u moderních aplikací, nepřiměřeně mě obtěžuje s registracemi, placenými omezeními a reklamami. Kromě toho aplikace píše dle mého názoru pavědecké řeči o kvantové interakci mysli s hmotou, která se má prý v náhodnosti zvolených míst projevovat.

Moje vysvětlení: Člověk se normálně pohybuje po místech nenáhodných – v blízkosti dopravních tras, ulic, obchodů, městských center apod. Už geograficky náhodná volba místa je dostatečná k tomu, aby místo bylo neotřelé, méně obvyklé v porovnání se zaběhlými kolejemi každodenního života a konvenčních odpočinkových míst. Zbytek vysvětluje náhoda a pozornost, kterou média věnují šokujícím nálezům. Nikdo asi nebude šířit, že na místě našel trávu, štěrk, písek, a suché větvičky.

Nechci se registrovat jen proto, abych si vygeneroval náhodné souřadnice. Hodí se na to GNU R.

Nalezení vlastních číselných souřadnic GPS

Google Maps nám pozici normálně ukážou jako modrý puntík na mapě, ne v číselné formě. Čísla se z nich ale dají dostat:


V aplikaci Google Maps na iPhone jsem dlouze stiskl na svou modrou pozici a objevila se červená značka. Dole se objevilo roletové menu. Menu jsem vytáhl a na 5.-7. řádku jsou souřadnice ve formátu úhlových stupňů a jejich desetin.

První číslo je šířka od rovníku na sever (-90…+90). Druhé je délka od Greenwiche na východ (-180…+180). Příklad:

(50.0917174, 14.4055056)

Vložení GPS souřadnic do Google Maps a Openstreetmap

Souřadnice včetně závorek vložíme do vyhledávacího řádku aplikace Google Maps. Google Maps to už pochopí a zobrazí na daném místě červenou značku. Použijeme-li menší počet desetinných míst než standardních 7, Google Maps to někdy nepochopí jako souřadnice a zobrazí zcela jiné místo na mapě.

Pro webové Google Maps použijeme URL ve formě https://www.google.com/maps/search/?api=1&query=šířka,délka

Příklad: https://www.google.com/map­s/search/?api=1&query=50.0917174,14­.4055056 zobrazí na daném místě červenou značku.

Pro Openstreetmap použijeme URL ve formě https://openstreetmap.org/?mlat=šířka&mlon=délka

Příklad: https://openstreetmap.org/?mlat=50­.0917174&mlon=14.4055056 zo­brazí na daném místě modrou značku.

Primitivní přístup: perturbace úhlových souřadnic

První řešení, co vás asi napadne, je vygenerovat náhodné číslo s normálním (Gaussovým) rozdělením a přičíst ho k souřadnícím. Problém: čím blíže jsme pólům, tím spláclejší bude vzniklý obláček bodů ve směru západ-východ a protáhlejší od severu k jihu. Na rovníku bude kruhový.

Pokud primitivní algoritmus použijeme k virtuálnímu cestování na měřítku kontinentů nebo celé planety, projeví se další problém. Můžeme dostávat zeměpisnou šířku v absolutní hodnotě větší než 90 stupňů a body budou nahuštěné v polárních oblastech.

Do souboru randonaut.R vložíme tento R program:

home=c(50.0917174, 14.4055056)
som=1000
spread_deg=som/40075017*360
shift=rnorm(2, 0, spread_deg)
target=home+shift
sprintf("(%.7f, %.7f)" , target[1], target[2])
sprintf("https://www.google.com/maps/search/?api=1&query=%.7f,%.7f" , target[1], target[2])
sprintf("https://openstreetmap.org/?mlat=%.7f&mlon=%.7f" , target[1], target[2])
  • home: Zde si upravíme souřadnice našeho domova.
  • som: směrodatná odchylka v metrech. Jak daleko chceme, aby se body rozptylovaly od bydliště.
  • 40075017 metrů je obvod rovníku
  • funkce rnorm je náhodný generátor s normálním rozdělením, v příkladu ji použije jiný článek roota o GNU R

Spustíme v terminálu příkazem:

R --no-save < randonaut.R

Ukázkové výstupy, první je vstup pro Google Maps aplikaci, druhé Google Maps URL, třetí klikací URL pro Openstreetmap:

[1] "(50.0955254, 14.4206328)"
[1] https://www.google.com/maps/search/?api=1&query=50.0955254,14.4206328
[1] https://openstreetmap.org/?mlat=50.0955254&mlon=14.4206328

[1] "(50.0821490, 14.4135649)"
[1] https://www.google.com/maps/search/?api=1&query=50.0821490,14.4135649
[1] https://openstreetmap.org/?mlat=50.0821490&mlon=14.4135649

Kulově symetrická 3D metoda


2D normální rozdělení. Směrodatná odchylka je 1 km, stupnice jsou v km. 3D normální rozdělení vypadá na obrazovce zcela identicky. Je to neostrý kulovitý 3D obláček, jehož průmět do 2D je 2D normální rozdělení. Graf jsem vykreslil R příkazem  plot(rnorm(4000),rnorm(4000),pch=20)

Mnohem elegantnější mi přijde úhlové souřadnice na povrchu koule převést na kartézské (pravoúhlé) souřadnice v prostoru. Pak k nim přičteme náhodný posuv s 3D normálním rozdělením. To se snadno vyrobí ze 3 nezávislých 1D normálních rozložení – využijeme tzv. vlastnost separability. Pravoúhlé souřadnice převedeme zpět do kulových. Pravděpodobně se stane, že vygenerované místo bude pod zemí nebo ve vzduchu. Nebudeme nasazovat čelovku ani startovat helikoptéru, ale 1 ze 3 kulových souřadnic – vzdálenost od středu Země – budeme ignorovat. Mapové aplikace s ní stejně nepracují. Tím se místo promítne kolmo na povrch Země.

Root tip obecný

Projekce 3D gaussovského obláčku do 2D neporuší vlastnost gaussovského tvaru – opět díky vlastnosti separability.

Primitivní metoda nám vygenerovala nesymetrické pole bodů – v severojižním směru se nacestujeme více než v západovýchodním. V příštím díle si naprogramujeme kulově symetrickou 3D metodu, která nám bude dávat kvalitní symetrický výstup.

Autor článku

Karel Kulhavý vystudoval operační systémy, sítě a překladače na MFF UK a je autorem optického pojítka Twibright Ronja a spoluautorem textového a grafického webového prohlížeče Twibright Links.