Citation
Chasing the Chasers

Material Information

Title:
Chasing the Chasers
Creator:
Elsner, Ian J
Place of Publication:
Gainesville, FL
Publisher:
College of Fine Arts; University of Florida
Publication Date:
Physical Description:
Project in lieu of thesis

Thesis/Dissertation Information

Degree:
Master's ( M.A.)
Degree Grantor:
University of Florida
Committee Chair:
Barmpoutis, Angelos
Committee Members:
Matyas, Corene
Suvajdzic, Marko

Subjects

Subjects / Keywords:
Databases ( jstor )
Datasets ( jstor )
Genetic mapping ( jstor )
Imports ( jstor )
Maps ( jstor )
Stamens ( jstor )
Storms ( jstor )
Tornado seasons ( jstor )
Touchdown ( jstor )
Weather ( jstor )

Notes

General Note:
Digital Arts and Sciences terminal project

Record Information

Source Institution:
University of Florida
Rights Management:
Copyright Ian Elsner. Permission granted to the University of Florida to digitize, archive and distribute this item for non-profit research and educational purposes. Any reuse of this item in excess of fair use or other copyright exemptions requires permission of the copyright holder.
Resource Identifier:
1022120781 ( OCLC )

Downloads

This item is only available as the following downloads:


Full Text
xml version 1.0 encoding UTF-8
REPORT xmlns http:www.fcla.edudlsmddaitss xmlns:xsi http:www.w3.org2001XMLSchema-instance xsi:schemaLocation http:www.fcla.edudlsmddaitssdaitssReport.xsd
INGEST IEID EFDLKSUVZ_F8JASK INGEST_TIME 2016-04-19T22:43:13Z PACKAGE AA00025542_00001
AGREEMENT_INFO ACCOUNT UF PROJECT UFDC
FILES



PAGE 1

CHASING THE CHASERS ! ! ! ! ! ! B y IAN ELSNER SUPERVISORY COMMITTEE: Angelos Barmpoutis, Chair Corene Matyas, Member Marko Suvajdzic, Member A PROJECT IN LIEU OF THESIS P RESENTED TO THE COLLEGE OF FINE ARTS OF THE UNIVERSITY OF FLORIDA I N PARTIAL FULFILLMENT OF THE REQUIREMENTS FOR THE DEGREE OF MASTER OF ARTS UNIVERSITY OF FLORDIA 2014

PAGE 2

2014 IAN ELSNER

PAGE 3

chasingthechasers3 Contents Introduction 4 ResearchStatement 4 Organization 4 SoftwareUsed 5 SoftwareMethods 5 ChaserData 6 TornadoData 6 Application 7 ToolsForAnalysis 9 DensityofChasers 10 CumulativeDensity 12 MedoidofChasers 15 Conclusion 18 FurtherResearch 18 GeographicPrism 18 DebrisTracking 19 AppendixA:RecordingData 20 AppendixB:Application 20 AppendixC:Maps 31 Reference 42

PAGE 4

ChasingTheChasers 1 1 Committee:AngelosBarmpoutis, CoreneMatyas&MarkoSuvajdzic IanElsner April 17 2014 Since 1990 ,therehasbeenanincreasedawarenessoftornados 2 2 C.A.Doswelletall.Stormspotting andpublicawarenesssincetherst tornadoforecastsof 1948 Weatherand Forecasting 14 : 544 557 1999 Thishasbeencoupledwithariseintornadochasers.Thesechasers gatherdataabouttornadoesintheformofsurveysandvideos.Until now,however,nobodyhasgathereddataonthechasersthemselves. Thisprojectusesnovelchaserlocationdatagatheredduringthe 2013 seasontoshowhowanalyticscanbeusedtounderstandchaser behavior. Thisanalysiswillbeusefulforchaserstryingtondthebestsetuppositionduringatornadochase.Itwillbeusefulfortornado researcherswhousepositionsofchasersasareferencepointforthe photosandvideoscollectedfromanevent.Iconsiderthisdataan essentialpartofthehistoricalrecordoftornados. Introduction ResearchStatement Recentresearchhasshownadecreasingpopulationbiasintornado reportsoverthepastfourdecades 3 .Tornadoreportsinthemiddle 3 Elsneretall.Thedecreasingpopulationbiasintornadoreportsacross thecentralplains. Wea.ClimateSoc 5 : 221 232 2013 ofthe 20 thcenturytendedtowardspopulationcentersbutnowthe reportsaremorerandomlydistributed.Theresearcherssuggestthat theincreasednumberofstormchasersinthecentralPlainsmight beresponsible.Thedecreasingpopulationbiasindicatesthatstorm chaserlocationhasarelationshiptotornadolocation.Thispaper presentsanoveldatasetoftornadochasersduringthe 2013 season. Usingthisdataset,thispaperdevelopsmodelsthatquantifyrelationshipbetweenchasersfortornadoresearchersandthegeneralpublic. Organization Thispaperisorganizedasfollows.Therstpart(Introduction)concernstheprogramsanddatathatIusedtomakethisproject.The secondpart(Application)presentsthedataasanapplicationthat allowsuserstoaccessayearofchaserdata.Theapplicationfollows ahistoryofinteractivedatadesign,drawingonthedesignprinciples ofAdamGrossmanandEdwardTufte.Thissecondpartmakesup theDigitalArtsandSciencesportionofthisproject.Thethirdpart (ToolsforAnalysis)presentsdifferentanalyticalmethodsofdescribingchaserevents.Thesemethodsrelyongeographictechniques.The

PAGE 5

chasingthechasers5 methodsaredensityofchasers,cumulativedensity,andmodoidof chasers.Eachmethodispresentedasaproof-of-conceptforafew particularexamples.Therelativeadvantagesanddisadvantagesof eacharediscussed.Iendwithmynalstatements(Conclusion)and afewpossiblefutureusesfortheproject(FutureResearch). SoftwareUsed Thisprojectisalsosplitacrosstwodifferentprogramingenvironments.IusetheProcessingdevelopmentenvironmenttomakethe standaloneapplicationandgeographicprismmethod.Processingis aprograminglanguagethatfocusesonthevisualarts 4 .Itfeaturesa 4 DanielShiffman. LearningProcessing:A Beginner'sGuidetoProgrammingImages, Animation,andInteraction .Morgan KaufmannPub, 2008 straightforwarddrawfunctionandalibraryofextensions.Myapplicationmakesuseofbothfeatures. IusetheUnfoldinglibraryforProcessingtohandlethegeographic projection.TheUnfoldinglibrarywasdevelopedbyTillNagelas ageographicvisualizerforProcessing.WhileUnfoldingmanages theprojectionandtheinterfacewithProcessing,itdoesnotprovide anymapimages.Forthat,Iturntoa 3 rdpartymaptillingservice, Cloudmade.TheCloudmadeAPIallowsmetobringrasterimagesof theUSAintomyapplicationatanyscale. IusetheRprojectforstatisticalcomputingtodoanalysisofthe chaserevents(densityofchasers,cumulativedensity,andmodoid ofchasers).Risanopensourcelanguewithbuilt-inmechanismsfor organizing,graphing,andpresentingdata 5 .Ralsoservestheaim 5 EdzerPebesmaRogerBivand,Virgilio G—mez-Rubio. AppliedSpatialData AnalysiswithR .Springer, 2013 ofanopen,reproducibleproject.AllthemapsthatIpresentcanbe easilyrecreatedthankstoR. IusePostgreSQL,anopensourcedatabase,tostoreandaccess mycollectedtornadodata.Thedatabaserunsonmyproduction machineviapostgress.app.IusepgAdmintointerfacewiththe PostgreSQLdatabase.IuseProcessingtoloadthedataintomyPostgreSQLdatabaseandProcessingtoloadthemout. SoftwareMethods TheChasingtheChasersApplicationrespectsalonglineofweather interfacedesignprinciples.Mostimportantly,theApplicationis inuencedbyDonaldNorman'scentralthesis 6 thatsimplication 6 DonaldA.Norman. Livingwith Complexity .TheMITPress, 2010 istoosimpleagoal.Instead,heargues,humansdobestincomplex environmentsanddesignersshouldaccountforthatintheirdesigns. TheworksofTuftearealsocrucialinthedesignsense 7 .Thelayout 7 EdwardR.Tufte. EnvisioningInformation .GraphicsPress,Cheshire, Connecticut, 1990 .ISBN 0 9613921 1 8 ofthispageisalmostidenticaltothelayoutofTufte'sbooks:amass oftextwithaconstant,thicksidebar.Tufte'sthoughtsontypesetting, particularlyhisjusticationthatsanseriffontsaremoredifcultto read,inuencedthefontsoftheApplication.Tufte'sapproachto

PAGE 6

chasingthechasers6 colorisfaithfullyimitatedinthisproject,withcoloronlybeingused tohighlightanddifferentiate. TheApplicationfollowsanimportantprincipallaidoutinJef Raskin'swork 8 .Hearguesthatinterfacesshouldbeinstantlyre8 JefRaskin. TheHumaneInterface: NewDirectionsforDesigningInteractive Systems .Addison-WesleyProfessional, 2000 sponsive,eveniftheresponsivenessdoesnotnecessarilyaddtothe informationconveyed.Theusershouldfeelikeanymotion,even scrollingacrossascreen,changessomethingtofeelmorecomfortable withtheinterfaceasawhole. ChaserData IrecordmydatafromSpotterNetwork.SpotterNetworkisanonprotcorporationthataggregateschaserpositionandmeteorological data.ChaserssubmittheirpositionstoSpotterNetworktowatch theirpositioninrelationtootherchasers.SpotterNetwork'sscope islimitedtothecurrentpositionsofchasers:itsproductisaGoogle Mapthatdisplaysthecurrentpositionsofallchasersinthenetwork (Figure 1 ).Oncethesystemissetup,thesubmissionprocesshappensautomaticallyatregularintervals.Thisautomaticreportingis importantforthetypeofdataIamcollecting. Figure 1 :ThehomepageofSpotterNetwork (http://www.spotternetwork.org/) showcasingitsmainfeature:amap ofthecurrentlocationsofSpotter Networkmembers. Myinnovationistorecordthiscurrentdataandstoreitforlater use.Forthe 2013 tornadoseason,Iwroteascripttoparseandstore allcurrentdatafromSpotterNetwork.Theresultingdatabaseincludesabout 500 000 entriesforeachday,representingabout 2000 chasers(Figure 2 ).Thisdatabaseincludesalmostallstormsof 2013 includingtheMoore,OKtornadoofMay 20 thandIllinoistornado outbreakofNovember 17 th. ManychaserssubmittheirpositiontoSpotterNetwork.Thereis nowaytoknowexactlyhowmany,butthelocationsofotherchasers provetotobeusefulwhilechasing. Figure 2 :Aselectionoftherawdata capturedoverthecourseofseveral months.Notetheanonymisedchaser positionsasgeographiccoordinates. TornadoData Attimeofpublication,theNationalWeatherServicehasnotreleasednaltornadodatafromthe 2013 season.TheStormPrediction Center,whichispartoftheNationalWeatherService,uploadspreliminarychasepaths,collectedpictures,andsurveyinformationof particularlyintensestormsorstormswithoneormorecasualties. Iusethispreliminarydatafromtwostormsforthisproject:the Rozel,KStornadoofMay 18 thandtheMoore,OKtornadoofMay 20 th.Ichoosethesestormsbecausetheyaresignicantstormsof the 2013 season,theyhaveavailabletrackdata,andtheyhavemany chaserintercepts.Irefertothesetornadosinthisdocumentbythe citiesnearesttothem.

PAGE 7

chasingthechasers7 Application Ipresentthecurrentpositionsoftornadochasersonaninteractive map.Inordertodoso,IconvertedthecollectedXMLchaserdata intoentriesinapostgreSQLdatabase.WhileboththeXMLchaser dataandthepostgreSQLdatabasecontainthesamedata,thepostgreSQLdatabaseallowsmetoaskmoreintelligentqueries.These include,"howmanychaserswheremovingbetween 12 : 00 and 12 : 30 ?" and"whatarethepositionsofchaserIanElsner?" IusetheProcessingdevelopmentenvironmenttocreateanapplicationthatplotsthemotrecentpositionofeverychaserinthe database. PostgreSQL Spotter Network XML Database Processing Unfolding Library Cloudmade Tiles Display Class Chaser Class Tornado Class Figure 3 :Schematicofthevisualization.Chaserdatawasdownloaded fromSpotterNetworkandstoredina PostgreSQLdatabase.TheProcessing applicationinteractswithPostgreSQL databaseintheformofqueries.ProcessingusestheUnfoldinglibrary andtheCloudmadeAPItohandle geographicprojectionsandmaptiles respectively. Whilethemapisdensewhenviewingtheentirecontinental UnitedStates,userscanzoominonanypartofthecountrytosee thepositionsatascalethatmakessense.Userscanalsosearchfora particularchaserbyusingthesearchfunctionatthetoprightcorner oftheapplication. Iusetimestampstotrackthepositionsofchasersthroughtime.I codedamethodofinterpolationtodeterminethepositionofchaser bythesecond.Ifthetimethattheuserwantsisbetweentwotime codes,thenthesystemwilldisplayapositionbetweentwolocations associatedwiththetimecodes.Thisinterpolationcreatessmooth animationsofevents.

PAGE 8

chasingthechasers8 Figure 4 :ChaserlocationsonUTC 23 : 18 : 00 onMay 18 2013 ,asseeninthe ChasingtheChasersapp.Hereweare zoomedouttoseetheentirecontinental US. Figure 5 :ChaserlocationsonMay 18 2013 ,manuallyzoomedintocentral Kansas,showingtheprimaryinterface element:aredbarthatrepresentstime ofday.

PAGE 9

chasingthechasers9 IalsousedtornadodatacapturedprovidedbytheNational WeatherService.Insomecases,thedataisavailableasdamagepath shapeles,inothercases,asGoogleEarthlocationles,inother casesasstartandendpoints.Usingthisdata,Idisplaythetornado positionsalongwiththechaserlocations.Thetornadopositionsupdateatthecurrenttime.Notethatonlyafractionofthetornado pathsfromthe 2013 seasonareavailable. Tocreateanapplicationthatisintuitivetotheuser,Iusearedbar atthebottomofthescreenthatfollowstheuser'scurser.Astheuser slidesbackandforth,thetimechangesinasixhourperiod,with thetornadotouchdownoccurringattheverymiddle.Threehours occurbeforethetornadotouchdownandthreehoursoccurafterthe tornadotouchdown. ThismaininterfaceisinspiredbyAdamGrossman'sworkonDark Sky,aniOSappthatshowspastandfutureweatherconditions.Dark Skyusesascrubberbarthatextendsaboutthethirdofthewayup thescreen(Figure 6 ).Thescrubberbarbothcontrolsthetimeand indicatesthetime. Figure 6 :Themaininterfaceelement ofmyapplicationwasinspiredbythis verticalgreenlineinAdamGrossman's DarkSkyapp. TheinterfacealsotakescuesfromEdwardTufte'sredesignofa supercellanimationashepresentsitinVisualExplanations 9 .Ide9 EdwardR.Tufte. VisualExplanations GraphicsPress,Cheshire,Connecticut, 1997 .ISBN 0 9613921 2 6 signedmytimebartomatchthestyleandpositionofTufte'sgure. Thetimebarthatmapsthetimeoutlinearlyovera 2 Dmapofthe landscape.Tuftearguesthatlabelsshouldbepartofachartitself asoftenaspossible.Itakehisadvicebyindicatingchasernameas partofthedotthatrepresentstheposition.Theperiodoftimeduringwhichthetornadoisonthegroundisshownonthebarasared highlight(Figure 8 ).ThelimitedcolorpalletfollowsTufte'scolor theory,whereinstrongcolorsareonlyusedsparingly 10 10 EdwardR.Tufte. EnvisioningInformation .GraphicsPress,Cheshire, Connecticut, 1990 .ISBN 0 9613921 1 8 TheApplicationpresentsthenoveldatasetinasimple,intuitive way.Withit,Imaketheframeworkforaprogramaimedatthegeneralpublic. ToolsForAnalysis HereIpresentasuiteofanalyticaltoolsfordescribingchaserpositions.Iseethesetoolsbeingusedforchasersintheeldinterestedin interceptingatornadoandfortornadoresearchersinterestedincombiningthepositionsofchaserswithotherobservations.Themethods Iusearedensityofchasers,cumulativedensityofchasers,medoidof chasers. IexportthelocationdatafromProcessingandimportitintoR.I exportthelocationdatafromProcessingbecausethepositionsofthe chasersareinterpolated;Icancallupthelocationofallchasersat anyarbitrarytime.

PAGE 10

chasingthechasers10 Figure 7 :Thethunderstormanimation designedbyTufteandpresentedin VisualExplanations. Figure 8 :ThetimelineofmyApplication,showingtheredhighlightduring thetimethetornadoisontheground. DensityofChasers Withthecurrentchaserinformation,wecancreateadensitymap thathighlightsareasofthecentralPlainswherethereareaconcentrationofchasers.Isubsetthedatatoonlyshowapartofthegreat Plains. IconsiderchaserlocationswithinaregioncenteredonRussell, KS.Themapdomainisboundedby 36 10 and 41 57 Nlatitudesand 102 37 and 95 34 WlongitudesandencompassesthethecentralPlains fromnorthernTexastocentralNebraska. Weshowthedensitybydividingthemapupintoa 32 by 32 grid andcountingthenumberofchasersineachsquare.Eachsquare contains 0 17 Nand 0 21 W.

PAGE 11

chasingthechasers11 37 38 39 40 41 102 100 98 96 Longitude [ o E] Latitude [ o N] 0 5 10 13 Chasers per square Figure 9 :Chaserdensity[numberof chaserspersquare]atUTC 23 : 18 : 00 on May 18 2013

PAGE 12

chasingthechasers12 Scaleisimportant.Weseethedifferenceinthedensityatadifferentscalebecauseeachboxcontainsalargerorsmallersectionof land.Forexample,thisisthesmallerscaleacrossamuchlargersectionofthecontinentalUS.Themapdomainisboundedby 26 31 and 48 37 Nlatitudesand 113 44 and 85 31 Wlongitudesandencompasses theentirecentralthirdofthecountry.Weusethesame 32 by 32 grid asabove,butnoweachsquarecontains 0 68 Nand 0 87 W. 30 35 40 45 110 105 100 95 90 Longitude [ o E] Latitude [ o N] 0 10 20 30 Chasers per square Figure 10 :Chaserdensity[numberof chaserspersquare]atUTC 23 : 18 : 00 on May 18 2013 .Notethesmallerscale. CumulativeDensity ThismethodbuildsontheDensityofChasersmethod.Wenowuse thestoreddatatomeasurethedifferenceindensityduringaset periodoftime.Forthisgraph,weshowthedifferenceindensities

PAGE 13

chasingthechasers13 throughthe 60 minutesbeforetheRozeltornadotouchesdown.This methodaddsthetotalnumberofchasersinthecurrentminuteto thesumofallpreviousminutes.Weoutputeachoftheminutesasa separateframetocreateacumulativedensitymapanimation. 37 38 39 40 41 102 100 98 96 Longitude [ o E] Latitude [ o N] 0 600 1200 1800 2400 Chaser Minutes Per Square Figure 11 :Cumulativechaserdensity [chaserminutespersquare]duringone hourbeforetheRozeltouchdownon May 18 2013 .Thismethodmakesit easytodetectthehotspots.Theblack dotrepresentsthetouchdownlocation oftheRozeltornado. Oneminutebeforethetouchdownofthetornado,itisclearwhich squareshadthemostchaseractivity.Asquarewithahighintensity iscalledahotspot. WealsotaketheexampleofMooretornadousingtheexactsame cumulativetechnique.Here,thehotspotisclear,butitisnotclose tothetouchdownlocationoftheMooretornado.Thisisanexample ofwhenthechasercommunitymisjudgedthelocationofthetornadoandwerecaughtunawares.NationalGeographicreportsthat

PAGE 14

chasingthechasers14 awell-fundedchaseteam"misjudgedtheweatherpatternsand,like numerousotherchasers,followedastormdowntoDuncan,Oklahoma-therebymissingthetornadothatleveledmuchofthetown ofMoore. 11 "Thisexampleshowstheadvantagesofthecumulative 11 NationalGeographic.Lastdaysofa stormchaser. NationalGeographic 2013 densityapproach. 33 34 35 36 37 38 100 98 96 94 Longitude [ o E] Latitude [ o N] 0 1200 2400 3600 Chaser Minutes Per Square Figure 12 :Cumulativechaserdensity [chaserminutespersquare]during onehourbeforetheMooretouchdown onMay 20 th, 2013 .Theblackdot representsthetouchdownlocationof theMooretornado. Anotherwaytodisplaythechangeinchaserpositionsistomeasuresquaresbywhetherornotatleastonechaserhasenteredover thepastminute.Wedonotaccountforsquaresthathaveaddedno newchasersorlostchasersinthepastminute.Weadduptheminutesduringwhichasquareaddedatleastoncechaseranddisplayit inFigure 13 .Comparedwiththecumulativedensitymapofthesame timeperiod(Figure 11 ),therearemoredistincthotspots,notablyina

PAGE 15

chasingthechasers15 patchnorthofthetouchdownlocation.Therewasanaccumulationof chasersinthisarea,thoughtheywerenotasmanyasneartheactual touchdownpoint.Thisisbecausethemodelaccountsforonly atleast onechaserenteringasquareanddoesnotfurtherrewardsquares thathaveadditionalchasers. 36 37 38 39 40 102 100 98 96 Longitude [ o E] Latitude [ o N] 0 4 8 12 16 Minutes square added at least one chaser Figure 13 :Cumulativemeasureof eachsquarethataddedchasersona minute-by-minutebasisoveranhour longperiodbeginningatUTC 23 : 18 : 00 onMay 18 2013 .Theblackdotisthe touchdownlocationoftheRozel,KS tornado. MedoidofChasers Iusemedoidstosummarizethechaserpositions.Amedoidisthe memberofthedatasetwherethedifferencewithallothermembers ofthedatasetisminimal.Ifadatasetshowsmultipleclusters,thenit hasmultiplemedoids.Amedoidiseffectedbythescaleofthemap.

PAGE 16

chasingthechasers16 Hereweusethesameboundariesasthedensitymap.Weusethe exibleproceduresforclustering(fpc)packageinRforgenerating theclusteringandthemedoidlocations. Idisplayeachoftheclustersinourboundariesasadifferentcolor. Thismethodisusefulforobservingclustersofchasers.Tornado chaserscanusethismethodwhilechasingtoclassifywhichchasers arepartofalargergroupandwhichonesaremoreisolated. Figure 14 :Chaserclusters(ascolored dots)andchasermedoids(asblack dots)atUTC 23 : 18 : 00 onMay 18 2013 Theclusteringisheavilydependentonscale.Irecommendchasers intheeldusethismethodataboutastatewidescale,likeFigure 14 becausethisrepresentsadrivablescaleanditshowsdivisionsby supercells. IfIuseasmallerscale,thentheclustersgrouptogetherchasers aimingfordifferenttargets.Themedoidsthatsitatopmajorcities suchasWhiataw,KansasCity,andOklahomaCitymakesense.They representtheclusterofchaserswholiveinthosecitesandperhaps havenotchosentochase. IalsoapplythismethodtotheMooretornadoattheUTC 18 : 58 : 00 May 20 2013 ,exactlyonehourbeforetouchdown.Here,thecluster nearOklahomaCityspreadssouthpastthetouchdownlocation. Ialsotrackthemedoidsthroughtime.Weconstructananimation

PAGE 17

chasingthechasers17 Figure 15 :Chaserclusters(ascolored dots)andchasermedoids(aslarge blackdots)atUTC 23 : 18 : 00 onMay 18 2013 Figure 16 :Chaserclusters(ascolored dots)andchasermedoids(aslarge blackdots)atUTC 18 : 58 : 00 onMay 20 2013 ,onehourbeforetheMoore tornadotouchdown.

PAGE 18

chasingthechasers18 thatrecalculatestheclustersandmedoidpointseveryframe.During thisanimation,theclustersofchasersarecontinuallyresortedand,as aresult,themedoidschangepositions. Conclusion Inthisproject,variousmethodswereusedtoshowthevalueofusing anewchaserlocationdatasetaspartofawideranalysis.First,this paperpresentedanoveldatasetoftornadochasersduringthe 2013 season.Thisdatawascollectedduringthe 2013 seasonusingSpotter Network,awidelyusedwebsitethataggregateschaserpositions.All thedatawereorganizedintoanPostgreSQLdatabaseandpresented asastandaloneApplicationusingProcessing.TheApplicationused designtechniquesfrompreviousattemptstovisualizeweatherdata. Then,usingthedataset,thispaperdevelopedmodelsthatquantify therelationshipbetweentornadochasersfortornadoresearchers andthegeneralpublic.Thesemodelsarechaserdensity,cumulative chaserdensity,andchasermedoid.Therelativeadvantagesofeach methodwerepresentedfordifferentaudiences.Thispapermakes thepersuasivecasethatchaserdatashouldbeincludedaspartofthe widerhistoricalrecordoftornados. FurtherResearch Iseetwoimmediateusecasesforthisproject:helpingchasersbetter visualizethepositionsofotherchaserstomakebetterdecisionsand helpingresearcherscombinevarioustypesoftornadodata.Ipresent twoexamplesasways GeographicPrism Ageographicprismdescribesa"bubble"inspaceandtime.Wecan useittofurtherdenethegravitational"pull"towardstheplace wherethetornadowillbeinthehourbeforethetornadotouchdown. Allchasersareeitherwithinthisboundaryornot.Thosechasers thatentertheboundaryrsthavecorrectly"bet"onthatsetupposition.WeusetheapplicationthatwebuiltinProcessingasabasisfor implementingthisprism(Figure 17 ). Figure 17 :Aproof-of-conceptofusing ageographicprismtorankindividual chasers. ForthisexampleoftheRozeltouchdown,theredcircleisthegeographicprism.Wekeeptrackofeachchaserwhoenterstheprism. Wecreatealeaderboardtoshowwhointheprismisclosesttothe touchdownlocation.

PAGE 19

chasingthechasers19 DebrisTracking TheEnhancedFujitaScale(orEFScale)estimatestornadointensity onacategoricalscale.Itwasoriginallydevelopedinthe 1970 sby TimFujita,astructuralengineerwhodeterminedthatthedamage causedtoabuildingwasindicativeoftheintensityoftheevent.In thecontextofthetime,itmadesensetousethisindirectmethod ofmeasuringtornados:stormchasingwasinitsinfancyandmany tornadoseventsoccurredwithoutdirectobservation. Todeterminethevelocityoftornadodebrisoncamerafootageof anevent,oneneedstoknowtheexactlocationofthecameraandthe exactlocationofthetornado.WithmethodsliketheoneIpresent, suchaconclusionmightbepossible. Figure 18 :Thistornadoisanideal candidatetomeasurethedebrisdirectly becauseofthechaser'sproximitytothe event. Iperformedaproofofconcepttodemonstratethepotentialuses forthistypeofdatawiththeRago,KansastornadoofMay 19 2012 TheNationalWeatherServicereleasedthedamagepath,documentingthelocationofthetornadothroughtime.Thelocationofthe cameraisknown. Usingthe 3 DsoftwarepackageBlender,wetrackapieceofdebris. Thistrackingworksbylookingforsimilarimagepattensineach successiveframe.ItcreatesamarkerinBlender'sinternalcoordinate system.Becauseweknowthedistancebetweenthecameraandthe debris,wecancalculatethespeedthatthedebrisistravelingata selectionoftime.Inthiscase,ourestimateforthespeedofthedebris is 80 mph,whichiswithintheEFScaleforthisparticulartornado. Figure 19 :Thedebristrackingaspartof theBlender 3 Dsoftware.

PAGE 20

chasingthechasers20 AppendixA:RecordingData cd~/Desktop/;whiletrue;dofilename=$(date+%s);curl http://www.spotternetwork.org/feeds/rss positions.xml> ${filename}.xml;echo${filename}.xml;sleep 180 ;done; AppendixB:Application import processing.opengl. ; import controlP 5 ; import codeanticode.glgraphics.GLConstants; import codeanticode.glgraphics. ; import de.fhpotsdam.unfolding. ; import de.fhpotsdam.unfolding.geo. ; import de.fhpotsdam.unfolding.utils. ; import de.fhpotsdam.unfolding.providers. ; import de.fhpotsdam.unfolding.marker. ; import de.fhpotsdam.unfolding.data. ; import java.text. ; int currentclockhours; Stringtornadoname=""; int currentdate; int tornadoindex= 1 ; Stringnamevalue=""; StringtextValue=""; ControlP 5 cp 5 ; RadioButtonr; ArrayListlist 1 ; ArrayListlist 2 ; int counter= 0 ; String[]currenttorn= new String[ 1 ]; import java.applet. ; import java.awt.Dimension; import java.awt.Frame; import java.awt.event.MouseEvent; import java.awt.event.KeyEvent; import java.awt.event.FocusEvent; import java.awt.Image; import java.io. ; import java.net. ; import java.text. ;

PAGE 21

chasingthechasers21 import java.util. ; import java.util.zip. ; import java.util.regex. ; //Tabletable=loadTable("data/data.txt"); import de.bezier.data.sql. ; String[]datachasers; //String[]sa 1 ={"OH","NY","CA"}; //String[]datachasers 1 ; //StringListinventory; //StringListballs; float previoustime; float nexttime; StringchaserName; int numberofchaserdots; float lastpointsecondsintheday; float pointsecondsinthedaymoore; float firstpointsecondsinthedaymoore; float lastpointsecondsinthedaymoore; float firsthours; float firstminutes; float firstseconds; int numberofchasers 1 ; int numberofchasers 2 ; boolean torandovisable= false ; float previousTornPositionx; float previousTornPositiony; float nextTornPositionx; float nextTornPositiony; ScreenPositionpreviousCarPosition; ScreenPositionpreviousTornPos; ScreenPositionnextCarPosition; PFontfont; PFontfont 2 ; PFonttickfont; PFonttickfontbig; liveTornLocationtornLive;

PAGE 22

chasingthechasers22 UnfoldingMapmap; PostgreSQLpgsql; float s= 2 ; float secondsintheday; float firstpointsecondsintheday; int animationindex= 80000 ; float positionnextx; float positionnexty; float positionx; float positiony; LocationprevCarPosFinal= new Location( 0 0 ); LocationprevTornPosFinal= new Location( 0 0 ); individualTornadosmooreOK; individualTornados 2 mooreOK 2 ; individualChasers[]dots; individualChasers[]dots 2 ; String[]chaserInfo= new String[ 481 ]; String[]chaserInfo 2 = new String[ 1422 ]; void setup(){ size( 1400 750 ,GLConstants.GLGRAPHICS); map= new UnfoldingMap( this new OpenStreetMap. CloudmadeProvider(" 322 cdfb 6 aad 64546 bf 5557627 e 0 efff 4 ", 1930 )); // 1714 // 77922 MapUtils.createDefaultEventDispatcher( this ,map); LocationusaLocation= new Location( 38 2 99 46 ); map.zoomAndPanTo(usaLocation, 10 ); //balls=newArrayList(); datachasers= new String[ 1 ]; cp 5 = new ControlP 5 ( this ); cp 5 .addTextfield("") .setPosition(width 300 15 ) .setSize( 280 30 ) .setFont(createFont("Palatino Roman", 16 )) .setAutoClear( false ) .setColorForeground(color( 0 0 0 100 )) .setColorBackground(color( 240 240 240 )) .setColorValueLabel(color( 0 )) ; r=cp 5 .addRadioButton("radioButton") .setPosition( 20 60 ) .setSize( 40 20 ) .setColorForeground(color( 100 )) .setColorActive(color( 255 )) .setColorLabel(color( 0 ))

PAGE 23

chasingthechasers23 .setItemsPerRow( 1 ) .setSpacingColumn( 100 ) .addItem("Rozel", 1 ) .addItem("Moore", 2 ) ; for (Togglet:r.getItems()){ t.captionLabel().setColorBackground(color( 255 80 )); t.captionLabel().style().moveMargin( 7 0 0 3 ); t.captionLabel().style().movePadding( 7 0 0 3 ); t.captionLabel().style().backgroundWidth= 45 ; t.captionLabel().style().backgroundHeight= 13 ; } //inventory=newStringList(); //inventory.append("coffee"); //inventory.append("flour"); //inventory.append("tea"); //println(inventory); / Listtornadoes=GeoJSONReader.loadData(this," extractDamagePolys_old.json"); ListtornadoMarkers=MapUtils.createSimpleMarkers( tornadoes); colorc=color( 255 204 0 ); //tornadoMarkers.setColor(color( 255 0 0 )); map.addMarkers(tornadoMarkers); / font=loadFont("TwCenMT Bold 80 .vlw"); textFont(font, 40 ); font 2 =loadFont("TwCenMT Bold 80 .vlw"); textFont(font, 20 ); tickfont=loadFont("Palatino Roman 16 .vlw"); tickfontbig=loadFont("Palatino Roman 60 .vlw"); mooreOK= new individualTornados(); mooreOK 2 = new individualTornados 2 (); Stringuser="ianelsner"; Stringpass=""; //nameofthedatabasetouse // Stringdatabase="ianelsner"; pgsql= new PostgreSQL( this ,"localhost",database,user, pass); if (pgsql.connect()){ int i= 0 ;

PAGE 24

chasingthechasers24 pgsql.query("SELECT COUNT (DISTINCT \"Chaser_ID\") FROM moore"); while (pgsql.next()){ //println("NumberofItems:"+pgsql.getInt( 1 )); numberofchasers 1 =pgsql.getInt( 1 ); //println(numberofchasers 1 ); //datachasers=newString[numberofchasers 1 ]; dots= new individualChasers[numberofchasers 1 ]; String[]chaserInfo= new String[numberofchasers 1 ]; } pgsql.query("SELECT DISTINCT \"Chaser_ID\" FROM moore") ; while (pgsql.next()) { chaserInfo[i]=pgsql.getString("Chaser_ID"); //println(chaserInfo[i]); i++; } for ( int k= 0 ;k
PAGE 25

chasingthechasers25 map.draw(); stroke( 255 0 0 100 ); strokeWeight( 2 ); line(mouseX,height 100 ,mouseX,height); list 1 = new ArrayList(); list 2 = new ArrayList(); //s=map.getZoom()/ 10 ; textFont(font, 20 ); if (tornadoindex== 1 ){ mooreOK.paint(); for ( int j= 0 ;j
PAGE 26

chasingthechasers26 String[]actuallist= new String[list 1 .size()]; for ( int i= 0 ;i
PAGE 27

chasingthechasers27 currentdate= 18 +clockhours/ 24 ; currentclockhours=clockhours% 24 ; text(tornadoname+" "+currentdate+" May 2013 "+ currentclockhours+":"+clockminutes+":"+clockseconds, 20 40 ); textAlign(CENTER); fill( 0 ); stroke( 0 ); strokeWeight( 2 ); line( 0 ,height 27 0 ,height 33 ); textFont(tickfont, 16 ); text(" 3 ", 8 ,height 10 ); line( int (map(firstpointsecondsintheday 7200 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 27 int (map(firstpointsecondsintheday 7200 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 33 ); text(" 2 hours", int (map(firstpointsecondsintheday 7200 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 10 ); line( int (map(firstpointsecondsintheday 3600 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 27 int (map(firstpointsecondsintheday 3600 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 33 ) ; text(" 1 hour", int (map(firstpointsecondsintheday 3600 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 10 ); line( int (map(firstpointsecondsintheday+ 3600 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 27 int (map(firstpointsecondsintheday+ 3600 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 33 ) ; text(" 1 hour", int (map(firstpointsecondsintheday+ 3600 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 10 ); line( int (map(firstpointsecondsintheday+ 7200 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height

PAGE 28

chasingthechasers28 27 int (map(firstpointsecondsintheday+ 7200 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 33 ); text(" 2 hours", int (map(firstpointsecondsintheday+ 7200 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 10 ); text("Touchdown",width/ 2 ,height 10 ); line( int (map(firstpointsecondsintheday, firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 27 int (map(firstpointsecondsintheday, firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 33 ); if (tornadoindex== 1 ){ stroke( 255 0 0 ); strokeWeight( 5 ); line( int (map(lastpointsecondsintheday, firstpointsecondsintheday 10800 ,firstpointsecondsintheday + 10800 0 ,width)),height 30 int (map( firstpointsecondsintheday,firstpointsecondsintheday 10800 ,firstpointsecondsintheday+ 10800 0 ,width)), height 30 ); animationindex= int (map(mouseX, 0 ,width, firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 )); line( int (map(firstpointsecondsintheday+ 10800 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 27 int (map(firstpointsecondsintheday+ 10800 firstpointsecondsintheday 10800 firstpointsecondsintheday+ 10800 0 ,width)),height 33 ); } if (tornadoindex== 2 ){ stroke( 255 0 0 ); strokeWeight( 5 ); line( int (map(lastpointsecondsinthedaymoore, firstpointsecondsinthedaymoore 10800 firstpointsecondsinthedaymoore+ 10800 0 ,width)),height 30 int (map(firstpointsecondsinthedaymoore, firstpointsecondsinthedaymoore 10800 firstpointsecondsinthedaymoore+ 10800 0 ,width)),height 30 ); //println(firstpointsecondsinthedaymoore);

PAGE 29

chasingthechasers29 //println(animationindex); animationindex= int (map(mouseX, 0 ,width, firstpointsecondsinthedaymoore 10800 firstpointsecondsinthedaymoore+ 10800 )); line( int (map(firstpointsecondsinthedaymoore+ 10800 firstpointsecondsinthedaymoore 10800 firstpointsecondsinthedaymoore+ 10800 0 ,width)),height 27 int (map(firstpointsecondsinthedaymoore+ 10800 firstpointsecondsinthedaymoore 10800 firstpointsecondsinthedaymoore+ 10800 0 ,width)),height 33 ); } text(" 3 ",width 8 ,height 10 ); } void controlEvent(ControlEventtheEvent){ if (theEvent.isFrom(r)){ print("got an event from "+theEvent.getName()+"\t"); for ( int i= 0 ;i
PAGE 30

chasingthechasers30 +theEvent.getName()+"': +theEvent.getStringValue() ); namevalue=theEvent.getStringValue(); } } void keyPressed(){ if (key==ENTER){ tornadoindex= 2 ; println("Enter"); } if (key==TAB){ tornadoindex= 1 ; println("Tab"); } } publicvoid Rozel( int theValue){ println("a button event from Rozel, KS: "+theValue); tornadoindex= 1 ; } publicvoid Moore( int theValue){ println("a button event from Rozel, KS: "+theValue); tornadoindex= 2 ; }

PAGE 31

chasingthechasers31 AppendixC:Maps ChasingtheChasers ======================================================== {rreadChaserData} May 18 = read csv (" ~/ Dropbox / Tornado Ian / test.csv") {r packages } setwd (" ~/ Dropbox / Tornado Ian") library (ggplot 2 ) library (ggmap) library (plyr) library (rgeos) library (lubridate) library (sp) require (ggplot 2 ) require (spatstat) require (maptools) require (rgdal) require (raster) require (cluster) require (fpc) {rRozelKS} library (ggmap) ourlocation=geocode("Russel KS") RozelMap= get_ map(location= unlist (ourlocation), maptype="toner",zoom= 7 source ="stamen") ##ggmap(RozelMap,extent="device") lla= attr (RozelMap,"bb") $ ll.lat llo= attr (RozelMap,"bb") $ ll.lon ula= attr (RozelMap,"bb") $ ur.lat ulo= attr (RozelMap,"bb") $ ur.lon r=raster( ncol = 32 nrow = 32 xmn=llo,xmx=ulo, ymn=lla,ymx=ula) DensityofChasers {r density } fn= paste ("LocationsByTime / ", 50 ,".txt",sep="") df = read csv (fn,header=FALSE) names ( df )= c ("lat","lon") df = df [ !is na ( df$ lat),] xy = cbind (x= df$ lon,y= df$ lat) r 2 =rasterize( xy ,r,fun= function (x,...) length (x), background= 0 ) r 2 p=rasterToPoints(r 2 ) r 2 p. df = data frame (r 2 p) colfunc < colorRampPalette( c ("white","orange","red"))

PAGE 32

chasingthechasers32 p=ggmap(RozelMap,extent="device")+ geom tile(aes(x=x,y=y,fill=layer), data =r 2 p. df ,alpha=. 5 )+ ylab( expression ( paste ("Latitude [",{}^o,"N]")))+ xlab( expression ( paste ("Longitude [",{}^o,"E]")))+ coord _equal ()+ scale_ fill gradientn("Chasers per square",limits= c ( 0 13 ), breaks= c ( 0 5 10 13 ), colours =colfunc( 14 ))+ theme bw()+theme( axis title .x=element _text (size= 8 ), axis title .y=element _text (size= 8 ))+geom point(aes(x= 99 4655 ,y= 38 14493 ),color="black",size= 2 ) p {rdensity 2 } library (ggmap) ourlocation=geocode("Rozel KS") RozelMap= get_ map(location= unlist (ourlocation), maptype="toner",zoom= 5 source ="stamen") #ggmap(RozelMap,extent="device") lla= attr (RozelMap,"bb") $ ll.lat llo= attr (RozelMap,"bb") $ ll.lon ula= attr (RozelMap,"bb") $ ur.lat ulo= attr (RozelMap,"bb") $ ur.lon r=raster( ncol = 32 nrow = 32 xmn=llo,xmx=ulo, ymn=lla,ymx=ula) fn= paste ("LocationsByTime / ", 0 ,".txt",sep="") tornfn= paste ("TornadoLocationsByTime / ","torando", 0 ,".txt", sep="") df = read csv ("LocationsByTime / 0 .txt",header=FALSE) colfunc < colorRampPalette( c ("white","orange","red")) names ( df )= c ("lat","lon") df = df [ !is na ( df$ lat),] xy = cbind (x= df$ lon,y= df$ lat) r 2 =rasterize( xy ,r,fun= function (x,...) length (x), background= 0 ) r 2 p=rasterToPoints(r 2 ) r 2 p. df = data frame (r 2 p) p=ggmap(RozelMap,extent="device")+ geom tile(aes(x=x,y=y,fill=layer), data =r 2 p. df ,alpha=. 5 )+ ylab( expression ( paste ("Latitude [",{}^o,"N]")))+ xlab( expression ( paste ("Longitude [",{}^o,"E]")))+ scale_ fill gradientn("Chasers per square",limits= c ( 0 30 ), colours =colfunc( 30 ))+ theme bw()+theme( axis title .x=element _text (size= 8 ), axis title .y=element _text (size= 8 ))

PAGE 33

chasingthechasers33 p CumulativeDensity {rdensityovertimeRozel} ourlocation=geocode("Russel KS") RozelMap= get_ map(location= unlist (ourlocation), maptype="toner",zoom= 7 source ="stamen") lla= attr (RozelMap,"bb") $ ll.lat llo= attr (RozelMap,"bb") $ ll.lon ula= attr (RozelMap,"bb") $ ur.lat ulo= attr (RozelMap,"bb") $ ur.lon r=raster( ncol = 32 nrow = 32 xmn=llo,xmx=ulo, ymn=lla,ymx=ula) df 0 = read csv ("LocationsByTime / 0 .txt",header=FALSE) names (df 0 )= c ("lat","lon") df 0 =df 0 [ !is na ( df$ lat),] xy 0 = cbind (x=df 0 $ lon,y=df 0 $ lat) r 20 =rasterize(xy 0 ,r,fun= function (x,...) length (x), background= 0 ) rDif=r 20 rDif 2 = 0 rDif 3 = 0 colfunc < colorRampPalette( c ("white","orange","red")) nframes= 59 j= 1 :nframes fn= paste ("LocationsByTime / ",j,".txt",sep="") for (iin 1 :nframes){ if (i< 10 ){out= paste ('PlotsByTimeDif 1 / 000 ', i,'plot.png',sep="")} if (i< 100 && i>= 10 ){out= paste ('PlotsByTimeDif 1 / 00 ', i,'plot.png', sep="")} df = read csv (fn[i],header=FALSE) names ( df )= c ("lat","lon") df = df [ !is na ( df$ lat),] xy = cbind (x= df$ lon,y= df$ lat) r 2 =rasterize( xy ,r,fun= function (x,...) length (x), background= 0 ) rDif=r 2 +r 20 rDif 2 =rDif+rDif 2 r 20 =r 2 rDif 2 =rDif rDif 3 =rDif 2 +rDif 3 r 2 p=rasterToPoints(rDif 3 ) r 2 p. df = data frame (r 2 p)

PAGE 34

chasingthechasers34 png(out,width= 700 ,height= 700 ) p=ggmap(RozelMap,extent="device")+ geom tile(aes(x=x,y=y,fill=layer), data =r 2 p. df ,alpha=. 8 )+ ylab( expression ( paste ("Latitude [",{}^o,"N]")))+ xlab( expression ( paste ("Longitude [",{}^o,"E]")))+ coord _equal ()+ scale_ fill gradientn("Chaser Minutes Per Square", limits= c ( 0 2400 ),breaks= c ( 0 600 1200 1800 2400 ), colours =colfunc( 100 ))+ theme bw()+theme( axis title .x=element _text (size= 8 ), axis title .y=element _text (size= 8 ))+geom point(aes(x= 99 4655 ,y= 38 14493 ),color="black",size= 2 ) print (p) dev off () print (i) } {rdensityovertimeMoore} ourlocation=geocode("Oklahoma City OK") OkMap= get_ map(location= unlist (ourlocation), maptype="toner",zoom= 7 source ="stamen") lla= attr (OkMap,"bb") $ ll.lat llo= attr (OkMap,"bb") $ ll.lon ula= attr (OkMap,"bb") $ ur.lat ulo= attr (OkMap,"bb") $ ur.lon r=raster( ncol = 32 nrow = 32 xmn=llo,xmx=ulo, ymn=lla,ymx=ula) df 0 = read csv ("LocationsByTimeMoore / 0 .txt",header=FALSE) names (df 0 )= c ("lat","lon") df 0 =df 0 [ !is na ( df$ lat),] xy 0 = cbind (x=df 0 $ lon,y=df 0 $ lat) r 20 =rasterize(xy 0 ,r,fun= function (x,...) length (x), background= 0 ) rDif=r 20 rDif 2 = 0 rDif 3 = 0 colfunc < colorRampPalette( c ("white","orange","red")) nframes= 59 j= 1 :nframes fn= paste ("LocationsByTimeMoore / ",j,".txt",sep="") for (iin 1 :nframes){ if (i< 10 ){out= paste ('PlotsByTimeDifMoore / 000 ', i,'plot.png',sep="")} if (i< 100 && i>= 10 ){out= paste ('PlotsByTimeDifMoore / 00 ', i,'plot.png', sep="")} df = read csv (fn[i],header=FALSE) names ( df )= c ("lat","lon") df = df [ !is na ( df$ lat),] xy = cbind (x= df$ lon,y= df$ lat) r 2 =rasterize( xy ,r,fun= function (x,...) length (x), background= 0 )

PAGE 35

chasingthechasers35 rDif=r 2 +r 20 rDif 2 =rDif+rDif 2 r 20 =r 2 rDif 2 =rDif rDif 3 =rDif 2 +rDif 3 r 2 p=rasterToPoints(rDif 3 ) r 2 p. df = data frame (r 2 p) png(out,width= 700 ,height= 700 ) p=ggmap(OkMap,extent="device")+ geom tile(aes(x=x,y=y,fill=layer), data =r 2 p. df ,alpha=. 8 )+ ylab( expression ( paste ("Latitude [",{}^o,"N]")))+ xlab( expression ( paste ("Longitude [",{}^o,"E]")))+ coord _equal ()+ scale_ fill gradientn("Chaser Minutes Per Square", limits= c ( 0 3600 ),breaks= c ( 0 1200 2400 3600 ), colours =colfunc( 100 ))+ theme bw()+theme( axis title .x=element _text (size= 8 ), axis title .y=element _text (size= 8 ))+geom point(aes(x= 97 62888917 ,y= 35 28681593 ),color="black",size= 2 ) print (p) dev off () print (i) } {rdifferenceRozel} ourlocation=geocode("Rozel KS") RozelMap= get_ map(location= unlist (ourlocation), maptype="toner",zoom= 7 source ="stamen") #ggmap(RozelMap,extent="device") lla= attr (RozelMap,"bb") $ ll.lat llo= attr (RozelMap,"bb") $ ll.lon ula= attr (RozelMap,"bb") $ ur.lat ulo= attr (RozelMap,"bb") $ ur.lon r=raster( ncol = 32 nrow = 32 xmn=llo,xmx=ulo, ymn=lla,ymx=ula) df 0 = read csv ("LocationsByTime / 0 .txt",header=FALSE) names (df 0 )= c ("lat","lon") df 0 =df 0 [ !is na ( df$ lat),] xy 0 = cbind (x=df 0 $ lon,y=df 0 $ lat) r 20 =rasterize(xy 0 ,r,fun= function (x,...) length (x), background= 0 ) colfunc < colorRampPalette( c ("white","orange","red")) rDif 3 = 0 nframes= 59 j= 1 :nframes fn= paste ("LocationsByTime / ",j,".txt",sep="") for (iin 1 :nframes){ if (i< 10 ){out= paste ('PlotsByTimeDif 2 / 000 ',i,'plot.png' ,sep="")}

PAGE 36

chasingthechasers36 if (i< 100 && i>= 10 ){out= paste ('PlotsByTimeDif 2 / 00 ',i, 'plot.png',sep="")} df = read csv (fn[i],header=FALSE) names ( df )= c ("lat","lon") df = df [ !is na ( df$ lat),] xy = cbind (x= df$ lon,y= df$ lat) r 2 =rasterize( xy ,r,fun= function (x,...) length (x), background= 0 ) rDif=r 2 r 20 rDif 2 =rDif> 0 rDif 3 =rDif 2 +rDif 3 r 20 =r 2 r 2 p=rasterToPoints(rDif 3 ) r 2 p. df = data frame (r 2 p) png(out) p=ggmap(RozelMap,extent="device")+ geom tile(aes(x=x,y=y,fill=layer), data =r 2 p. df ,alpha=. 8 )+ ylab( expression ( paste ("Latitude [",{}^o,"N]")))+ xlab( expression ( paste ("Longitude [",{}^o,"E]")))+ coord _equal ()+ scale_ fill gradientn("Minutes square added at least one chaser ",limits= c ( 0 16 ), colours =colfunc( 16 ))+geom point(aes(x = 99 4655 ,y= 38 14493 ),color=" black",size= 2 )+ theme bw()+theme( axis title .x=element _text (size= 8 ), axis title .y=element _text (size= 8 )) print (p) dev off () print (i) } {rmediodrozel} ourlocation=geocode("Russel KS") RozelMap= get_ map(location= unlist (ourlocation), maptype="toner",zoom= 7 source ="stamen") #ggmap(RozelMap,extent="device") lla= attr (RozelMap,"bb") $ ll.lat llo= attr (RozelMap,"bb") $ ll.lon ula= attr (RozelMap,"bb") $ ur.lat ulo= attr (RozelMap,"bb") $ ur.lon EPSG < make_ EPSG() EPSG[ grep ("kansas",EPSG $ note,ignore. case =TRUE), 1 : 2 ] subset (EPSG,code== 26977 ) ll="+proj=longlat +datum=NAD 83 +ellps=GRS 80 lcc="+proj=lcc +lat 1 = 39 783 +lat 2 = 38 7167 +lat 0 = 38 33 +lon 0 = 98 +x 0 = 40 +y 0 = 0 +datum=NAD 83 +units=m +no defs" Rozel. df = data frame (lon= 99 4655 ,lat= 38 14493 ) Rozel.sp=SpatialPoints(Rozel. df ,proj 4 string=CRS(ll)) Rozel.sp=spTransform(Rozel.sp,CRS(lcc))

PAGE 37

chasingthechasers37 nframes= 59 j= 1 :nframes fn= paste ("LocationsByTime / ",j,".txt",sep="") for (iin 1 :nframes){ if (i< 10 ){out= paste ('PlotsMedoid / 000 ',i,'plot.png', sep="")} if (i< 100 && i>= 10 ){out= paste ('PlotsMedoid / 00 ',i,' plot.png',sep="")} df = read csv (fn[i],header=FALSE) names ( df )= c ("lat","lon") df = subset ( df ,lat<=ula & lat>=lla & lon>=llo & lon<= ulo) spdf=SpatialPointsDataFrame( coords = cbind ( df$ lon, df$ lat), data = df ) proj 4 string(spdf)=CRS(ll) spdfT=spTransform(spdf,CRS(lcc)) cc=coordinates(spdfT) best=pamk(cc,krange= 1 : 10 ,alpha=. 9 ) meds=best $ pamobject $ medoids clustering=best $ pamobject $ clustering df$ cluster 2 < clustering nc=best $ nc size= summary (best $ pamobject) $ clusinfo[, 1 ] df 0 = data frame (Time= rep ( 0 ,nc), meds, size) #df 0 =data.frame(Time= 0 ,meds) spdf 0 T=SpatialPointsDataFrame( coords =meds, data =df 0 proj 4 string=CRS(lcc)) spdf 0 =spTransform(spdf 0 T,CRS(ll)) dd=gDistance(spdf 0 T,Rozel.sp) #distance=rbind(distance,dd[which.min(dd)]) distance 0 = as data frame (dd) df 0 = as data frame (spdf 0 ) png(out,width= 900 ,height= 900 ) p=ggmap(RozelMap,extent="device")+ geom point(aes(x=x,y=y), data =df 0 ,color="black",size= 7 ) + geom point(aes(x=lon,y=lat,colour= factor (cluster 2 )), data = df ,size= 2 )+theme( legend .position="none") p print (p) dev off () print (i) }

PAGE 38

chasingthechasers38 {rmediodmoore} ourlocation=geocode("Moore OK") MooreMap= get_ map(location= unlist (ourlocation), maptype="toner",zoom= 8 source ="stamen") #ggmap(RozelMap,extent="device") lla= attr (MooreMap,"bb") $ ll.lat llo= attr (MooreMap,"bb") $ ll.lon ula= attr (MooreMap,"bb") $ ur.lat ulo= attr (MooreMap,"bb") $ ur.lon EPSG < make_ EPSG() EPSG[ grep ("kansas",EPSG $ note,ignore. case =TRUE), 1 : 2 ] subset (EPSG,code== 26977 ) ll="+proj=longlat +datum=NAD 83 +ellps=GRS 80 lcc="+proj=lcc +lat 1 = 39 783 +lat 2 = 38 7167 +lat 0 = 38 33 +lon 0 = 98 +x 0 = 40 +y 0 = 0 +datum=NAD 83 +units=m +no defs" Rozel. df = data frame (lon= 99 4655 ,lat= 38 14493 ) Rozel.sp=SpatialPoints(Rozel. df ,proj 4 string=CRS(ll)) Rozel.sp=spTransform(Rozel.sp,CRS(lcc)) nframes= 59 j= 1 :nframes fn= paste ("LocationsByTime / ",j,".txt",sep="") for (iin 1 :nframes){ if (i< 10 ){out= paste ('PlotsMedoid 3 / 000 ',i,'plot.png', sep="")} if (i< 100 && i>= 10 ){out= paste ('PlotsMedoid 3 / 00 ',i,' plot.png',sep="")} df = read csv (fn[i],header=FALSE) names ( df )= c ("lat","lon") df = subset ( df ,lat<=ula & lat>=lla & lon>=llo & lon<= ulo) spdf=SpatialPointsDataFrame( coords = cbind ( df$ lon, df$ lat), data = df ) proj 4 string(spdf)=CRS(ll) spdfT=spTransform(spdf,CRS(lcc)) cc=coordinates(spdfT) best=pamk(cc,krange= 1 : 10 ,alpha=. 9 ) meds=best $ pamobject $ medoids clustering=best $ pamobject $ clustering df$ cluster 2 < clustering nc=best $ nc

PAGE 39

chasingthechasers39 size= summary (best $ pamobject) $ clusinfo[, 1 ] df 0 = data frame (Time= rep ( 0 ,nc), meds, size) #df 0 =data.frame(Time= 0 ,meds) spdf 0 T=SpatialPointsDataFrame( coords =meds, data =df 0 proj 4 string=CRS(lcc)) spdf 0 =spTransform(spdf 0 T,CRS(ll)) dd=gDistance(spdf 0 T,Rozel.sp) #distance=rbind(distance,dd[which.min(dd)]) distance 0 = as data frame (dd) df 0 = as data frame (spdf 0 ) png(out,width= 900 ,height= 900 ) p=ggmap(MooreMap,extent="device")+ geom point(aes(x=x,y=y), data =df 0 ,color="black",size= 7 ) + geom point(aes(x=lon,y=lat,colour= factor (cluster 2 )), data = df ,size= 2 )+theme( legend .position="none") p print (p) dev off () print (i) } {rmediod 2 } ourlocation=geocode("Russel KS") RozelMap= get_ map(location= unlist (ourlocation), maptype="toner",zoom= 6 source ="stamen") #ggmap(RozelMap,extent="device") lla= attr (RozelMap,"bb") $ ll.lat llo= attr (RozelMap,"bb") $ ll.lon ula= attr (RozelMap,"bb") $ ur.lat ulo= attr (RozelMap,"bb") $ ur.lon EPSG < make_ EPSG() EPSG[ grep ("kansas",EPSG $ note,ignore. case =TRUE), 1 : 2 ] subset (EPSG,code== 26977 ) ll="+proj=longlat +datum=NAD 83 +ellps=GRS 80 lcc="+proj=lcc +lat 1 = 39 783 +lat 2 = 38 7167 +lat 0 = 38 33 +lon 0 = 98 +x 0 = 40 +y 0 = 0 +datum=NAD 83 +units=m +no defs" Rozel. df = data frame (lon= 99 4655 ,lat= 38 14493 ) Rozel.sp=SpatialPoints(Rozel. df ,proj 4 string=CRS(ll)) Rozel.sp=spTransform(Rozel.sp,CRS(lcc))

PAGE 40

chasingthechasers40 nframes= 59 j= 1 :nframes fn= paste ("LocationsByTime / ",j,".txt",sep="") for (iin 1 :nframes){ if (i< 10 ){out= paste ('PlotsMedoid 2 / 000 ',i,'plot.png', sep="")} if (i< 100 && i>= 10 ){out= paste ('PlotsMedoid 2 / 00 ',i,' plot.png',sep="")} df = read csv (fn[i],header=FALSE) names ( df )= c ("lat","lon") df = subset ( df ,lat<=ula & lat>=lla & lon>=llo & lon<= ulo) spdf=SpatialPointsDataFrame( coords = cbind ( df$ lon, df$ lat), data = df ) proj 4 string(spdf)=CRS(ll) spdfT=spTransform(spdf,CRS(lcc)) cc=coordinates(spdfT) best=pamk(cc,krange= 1 : 10 ,alpha=. 9 ) meds=best $ pamobject $ medoids clustering=best $ pamobject $ clustering df$ cluster 2 < clustering nc=best $ nc size= summary (best $ pamobject) $ clusinfo[, 1 ] df 0 = data frame (Time= rep ( 0 ,nc), meds, size) #df 0 =data.frame(Time= 0 ,meds) spdf 0 T=SpatialPointsDataFrame( coords =meds, data =df 0 proj 4 string=CRS(lcc)) spdf 0 =spTransform(spdf 0 T,CRS(ll)) dd=gDistance(spdf 0 T,Rozel.sp) #distance=rbind(distance,dd[which.min(dd)]) distance 0 = as data frame (dd) df 0 = as data frame (spdf 0 ) png(out,width= 900 ,height= 900 ) p=ggmap(RozelMap,extent="device")+ geom point(aes(x=x,y=y), data =df 0 ,color="black",size= 7 ) + geom point(aes(x=lon,y=lat,colour= factor (cluster 2 )), data = df ,size= 2 )+theme( legend .position="none") p print (p) dev off () print (i) }

PAGE 41

chasingthechasers41 Youcanalsoembedplots, forexample : {rfig.width= 7 ,fig.height= 6 } plot (cars)

PAGE 42

chasingthechasers42 References C.A.Doswelletall.Stormspottingandpublicawarenesssincethe rsttornadoforecastsof 1948 WeatherandForecasting 14 : 544 557 1999 Elsneretall.Thedecreasingpopulationbiasintornadoreports acrossthecentralplains. Wea.ClimateSoc 5 : 221 232 2013 NationalGeographic.Lastdaysofastormchaser. NationalGeographic 2013 DonaldA.Norman. LivingwithComplexity .TheMITPress, 2010 JefRaskin. TheHumaneInterface:NewDirectionsforDesigningInteractiveSystems .Addison-WesleyProfessional, 2000 EdzerPebesmaRogerBivand,VirgilioG—mez-Rubio. AppliedSpatial DataAnalysiswithR .Springer, 2013 DanielShiffman. LearningProcessing:ABeginner'sGuidetoProgrammingImages,Animation,andInteraction .MorganKaufmannPub, 2008 EdwardR.Tufte. EnvisioningInformation .GraphicsPress,Cheshire, Connecticut, 1990 .ISBN 0 9613921 1 8 EdwardR.Tufte. VisualExplanations .GraphicsPress,Cheshire, Connecticut, 1997 .ISBN 0 9613921 2 6


xml version 1.0 encoding UTF-8
REPORT xmlns http:www.fcla.edudlsmddaitss xmlns:xsi http:www.w3.org2001XMLSchema-instance xsi:schemaLocation http:www.fcla.edudlsmddaitssdaitssReport.xsd
INGEST IEID EVOPRED0O_AF3NJ2 INGEST_TIME 2016-04-21T20:48:01Z PACKAGE AA00025542_00001
AGREEMENT_INFO ACCOUNT UF PROJECT UFDC
FILES