42
CHASING THE CHASERS By IAN ELSNER SUPERVISORY COMMITTEE: Angelos Barmpoutis, Chair Corene Matyas, Member Marko Suvajdzic, Member A PROJECT IN LIEU OF THESIS PRESENTED TO THE COLLEGE OF FINE ARTS OF THE UNIVERSITY OF FLORIDA IN PARTIAL FULFILLMENT OF THE REQUIREMENTS FOR THE DEGREE OF MASTER OF ARTS UNIVERSITY OF FLORDIA 2014

CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

CHASING THE CHASERS                          

By IAN ELSNER

SUPERVISORY COMMITTEE: Angelos Barmpoutis, Chair

Corene Matyas, Member Marko Suvajdzic, Member

A PROJECT IN LIEU OF THESIS PRESENTED TO THE COLLEGE OF FINE ARTS OF THE UNIVERSITY OF FLORIDA IN PARTIAL FULFILLMENT

OF THE REQUIREMENTS FOR THE DEGREE OF MASTER OF ARTS

UNIVERSITY OF FLORDIA

2014

Page 2: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

© 2014 IAN ELSNER

Page 3: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 3

Contents

Introduction 4

Research Statement 4

Organization 4

Software Used 5

Software Methods 5

Chaser Data 6

Tornado Data 6

Application 7

Tools For Analysis 9

Density of Chasers 10

Cumulative Density 12

Medoid of Chasers 15

Conclusion 18

Further Research 18

Geographic Prism 18

Debris Tracking 19

Appendix A: Recording Data 20

Appendix B: Application 20

Appendix C: Maps 31

Reference 42

Page 4: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

Chasing The Chasers 1 1 Committee: Angelos Barmpoutis,Corene Matyas & Marko Suvajdzic

Ian ElsnerApril 17, 2014

Since 1990, there has been an increased awareness of tornados2. 2 C. A. Doswell et all. Storm spottingand public awareness since the firsttornado forecasts of 1948. Weather andForecasting, 14:544–557, 1999

This has been coupled with a rise in tornado chasers. These chasersgather data about tornadoes in the form of surveys and videos. Untilnow, however, nobody has gathered data on the chasers themselves.This project uses novel chaser location data gathered during the2013 season to show how analytics can be used to understand chaserbehavior.

This analysis will be useful for chasers trying to find the best set-up position during a tornado chase. It will be useful for tornadoresearchers who use positions of chasers as a reference point for thephotos and videos collected from an event. I consider this data anessential part of the historical record of tornados.

Introduction

Research Statement

Recent research has shown a decreasing population bias in tornadoreports over the past four decades3. Tornado reports in the middle 3 Elsner et all. The decreasing popu-

lation bias in tornado reports acrossthe central plains. Wea. Climate Soc, 5:221–232, 2013

of the 20th century tended towards population centers but now thereports are more randomly distributed. The researchers suggest thatthe increased number of storm chasers in the central Plains mightbe responsible. The decreasing population bias indicates that stormchaser location has a relationship to tornado location. This paperpresents a novel dataset of tornado chasers during the 2013 season.Using this dataset, this paper develops models that quantify relation-ship between chasers for tornado researchers and the general public.

Organization

This paper is organized as follows. The first part (Introduction) con-cerns the programs and data that I used to make this project. Thesecond part (Application) presents the data as an application thatallows users to access a year of chaser data. The application followsa history of interactive data design, drawing on the design principlesof Adam Grossman and Edward Tufte. This second part makes upthe Digital Arts and Sciences portion of this project. The third part(Tools for Analysis) presents different analytical methods of describ-ing chaser events. These methods rely on geographic techniques. The

Page 5: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 5

methods are density of chasers, cumulative density, and modoid ofchasers. Each method is presented as a proof-of-concept for a fewparticular examples. The relative advantages and disadvantages ofeach are discussed. I end with my final statements (Conclusion) anda few possible future uses for the project (Future Research).

Software Used

This project is also split across two different programing environ-ments. I use the Processing development environment to make thestandalone application and geographic prism method. Processing isa programing language that focuses on the visual arts4. It features a 4 Daniel Shiffman. Learning Processing: A

Beginner’s Guide to Programming Images,Animation, and Interaction. MorganKaufmann Pub, 2008

straightforward draw function and a library of extensions. My appli-cation makes use of both features.

I use the Unfolding library for Processing to handle the geographicprojection. The Unfolding library was developed by Till Nagel asa geographic visualizer for Processing. While Unfolding managesthe projection and the interface with Processing, it does not provideany map images. For that, I turn to a 3rd party map tilling service,Cloudmade. The Cloudmade API allows me to bring raster images ofthe USA into my application at any scale.

I use the R project for statistical computing to do analysis of thechaser events (density of chasers, cumulative density, and modoidof chasers). R is an open source langue with built-in mechanisms fororganizing, graphing, and presenting data5. R also serves the aim 5 Edzer Pebesma Roger Bivand, Virgilio

Gómez-Rubio. Applied Spatial DataAnalysis with R. Springer, 2013

of an open, reproducible project. All the maps that I present can beeasily recreated thanks to R.

I use PostgreSQL, an open source database, to store and accessmy collected tornado data. The database runs on my productionmachine via postgress.app. I use pgAdmin to interface with thePostgreSQL database. I use Processing to load the data into my Post-greSQL database and Processing to load them out.

Software Methods

The Chasing the Chasers Application respects a long line of weatherinterface design principles. Most importantly, the Application isinfluenced by Donald Norman’s central thesis6 that simplification 6 Donald A. Norman. Living with

Complexity. The MIT Press, 2010is too simple a goal. Instead, he argues, humans do best in complexenvironments and designers should account for that in their designs.

The works of Tufte are also crucial in the design sense7. The layout 7 Edward R. Tufte. Envisioning In-formation. Graphics Press, Cheshire,Connecticut, 1990. ISBN 0-9613921-1-8

of this page is almost identical to the layout of Tufte’s books: a massof text with a constant, thick sidebar. Tufte’s thoughts on typesetting,particularly his justification that san serif fonts are more difficult toread, influenced the fonts of the Application. Tufte’s approach to

Page 6: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 6

color is faithfully imitated in this project, with color only being usedto highlight and differentiate.

The Application follows an important principal laid out in JefRaskin’s work8. He argues that interfaces should be instantly re- 8 Jef Raskin. The Humane Interface:

New Directions for Designing InteractiveSystems. Addison-Wesley Professional,2000

sponsive, even if the responsiveness does not necessarily add to theinformation conveyed. The user should fee like any motion, evenscrolling across a screen, changes something to feel more comfortablewith the interface as a whole.

Chaser Data

I record my data from Spotter Network. Spotter Network is a non-profit corporation that aggregates chaser position and meteorologicaldata. Chasers submit their positions to Spotter Network to watchtheir position in relation to other chasers. Spotter Network’s scopeis limited to the current positions of chasers: its product is a GoogleMap that displays the current positions of all chasers in the network(Figure 1). Once the system is set up, the submission process hap-pens automatically at regular intervals. This automatic reporting isimportant for the type of data I am collecting.

Figure 1: The home-page of Spotter Network(http://www.spotternetwork.org/)showcasing its main feature: a mapof the current locations of SpotterNetwork members.

My innovation is to record this current data and store it for lateruse. For the 2013 tornado season, I wrote a script to parse and storeall current data from Spotter Network. The resulting database in-cludes about 500,000 entries for each day, representing about 2000chasers (Figure 2). This database includes almost all storms of 2013,including the Moore, OK tornado of May 20th and Illinois tornadooutbreak of November 17th.

Many chasers submit their position to Spotter Network. There isno way to know exactly how many, but the locations of other chasersprove to to be useful while chasing.

Figure 2: A selection of the raw datacaptured over the course of severalmonths. Note the anonymised chaserpositions as geographic coordinates.

Tornado Data

At time of publication, the National Weather Service has not re-leased final tornado data from the 2013 season. The Storm PredictionCenter, which is part of the National Weather Service, uploads pre-liminary chase paths, collected pictures, and survey information ofparticularly intense storms or storms with one or more casualties.

I use this preliminary data from two storms for this project: theRozel, KS tornado of May 18th and the Moore, OK tornado of May20th. I choose these storms because they are significant storms ofthe 2013 season, they have available track data, and they have manychaser intercepts. I refer to these tornados in this document by thecities nearest to them.

Page 7: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 7

Application

I present the current positions of tornado chasers on an interactivemap. In order to do so, I converted the collected XML chaser datainto entries in a postgreSQL database. While both the XML chaserdata and the postgreSQL database contain the same data, the post-greSQL database allows me to ask more intelligent queries. Theseinclude, "how many chasers where moving between 12:00 and 12:30?"and "what are the positions of chaser Ian Elsner?"

I use the Processing development environment to create an ap-plication that plots the mot recent position of every chaser in thedatabase.

PostgreSQLSpotter Network

XML Database

Processing

Unfolding Library

Cloudmade Tiles

Display ClassChaser Class Tornado Class

Figure 3: Schematic of the visualiza-tion. Chaser data was downloadedfrom Spotter Network and stored in aPostgreSQL database. The Processingapplication interacts with PostgreSQLdatabase in the form of queries. Pro-cessing uses the Unfolding libraryand the Cloudmade API to handlegeographic projections and map tilesrespectively.

While the map is dense when viewing the entire continentalUnited States, users can zoom in on any part of the country to seethe positions at a scale that makes sense. Users can also search for aparticular chaser by using the search function at the top right cornerof the application.

I use time stamps to track the positions of chasers through time. Icoded a method of interpolation to determine the position of chaserby the second. If the time that the user wants is between two timecodes, then the system will display a position between two locationsassociated with the time codes. This interpolation creates smoothanimations of events.

Page 8: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 8

Figure 4: Chaser locations on UTC23:18:00 on May 18, 2013, as seen in theChasing the Chasers app. Here we arezoomed out to see the entire continentalUS.

Figure 5: Chaser locations on May 18,2013, manually zoomed in to centralKansas, showing the primary interfaceelement: a red bar that represents timeof day.

Page 9: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 9

I also used tornado data captured provided by the NationalWeather Service. In some cases, the data is available as damage pathshape files, in other cases, as Google Earth location files, in othercases as start and end points. Using this data, I display the tornadopositions along with the chaser locations. The tornado positions up-date at the current time. Note that only a fraction of the tornadopaths from the 2013 season are available.

To create an application that is intuitive to the user, I use a red barat the bottom of the screen that follows the user’s curser. As the userslides back and forth, the time changes in a six hour period, withthe tornado touchdown occurring at the very middle. Three hoursoccur before the tornado touchdown and three hours occur after thetornado touchdown.

This main interface is inspired by Adam Grossman’s work on DarkSky, an iOS app that shows past and future weather conditions. DarkSky uses a scrubber bar that extends about the third of the way upthe screen (Figure 6). The scrubber bar both controls the time andindicates the time.

Figure 6: The main interface elementof my application was inspired by thisvertical green line in Adam Grossman’sDarkSky app.

The interface also takes cues from Edward Tufte’s redesign of asupercell animation as he presents it in Visual Explanations9. I de-

9 Edward R. Tufte. Visual Explanations.Graphics Press, Cheshire, Connecticut,1997. ISBN 0-9613921-2-6

signed my time bar to match the style and position of Tufte’s figure.The time bar that maps the time out linearly over a 2D map of thelandscape. Tufte argues that labels should be part of a chart itselfas often as possible. I take his advice by indicating chaser name aspart of the dot that represents the position.The period of time dur-ing which the tornado is on the ground is shown on the bar as a redhighlight (Figure 8). The limited color pallet follows Tufte’s colortheory, wherein strong colors are only used sparingly10. 10 Edward R. Tufte. Envisioning In-

formation. Graphics Press, Cheshire,Connecticut, 1990. ISBN 0-9613921-1-8

The Application presents the novel dataset in a simple, intuitiveway. With it, I make the framework for a program aimed at the gen-eral public.

Tools For Analysis

Here I present a suite of analytical tools for describing chaser posi-tions. I see these tools being used for chasers in the field interested inintercepting a tornado and for tornado researchers interested in com-bining the positions of chasers with other observations. The methodsI use are density of chasers, cumulative density of chasers, medoid ofchasers.

I export the location data from Processing and import it into R. Iexport the location data from Processing because the positions of thechasers are interpolated; I can call up the location of all chasers atany arbitrary time.

Page 10: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 10

Figure 7: The thunderstorm animationdesigned by Tufte and presented inVisual Explanations.

Figure 8: The timeline of my Applica-tion, showing the red highlight duringthe time the tornado is on the ground.Density of Chasers

With the current chaser information, we can create a density mapthat highlights areas of the central Plains where there are a concen-tration of chasers. I subset the data to only show a part of the greatPlains.

I consider chaser locations within a region centered on Russell,KS. The map domain is bounded by 36.10 and 41.57N latitudes and102.37 and 95.34W longitudes and encompasses the the central Plainsfrom northern Texas to central Nebraska.

We show the density by dividing the map up into a 32 by 32 gridand counting the number of chasers in each square. Each squarecontains 0.17N and 0.21 W.

Page 11: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 11

37

38

39

40

41

−102 −100 −98 −96Longitude [oE]

Latit

ude

[o N]

0

5

10

13Chasers per square

Figure 9: Chaser density [number ofchasers per square] at UTC 23:18:00 onMay 18, 2013.

Page 12: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 12

Scale is important. We see the difference in the density at a dif-ferent scale because each box contains a larger or smaller section ofland. For example, this is the smaller scale across a much larger sec-tion of the continental US. The map domain is bounded by 26.31 and48.37N latitudes and 113.44 and 85.31W longitudes and encompassesthe entire central third of the country. We use the same 32 by 32 gridas above, but now each square contains 0.68N and 0.87W.

30

35

40

45

−110 −105 −100 −95 −90Longitude [oE]

Latit

ude

[o N]

0

10

20

30Chasers per square

Figure 10: Chaser density [number ofchasers per square] at UTC 23:18:00 onMay 18, 2013. Note the smaller scale.

Cumulative Density

This method builds on the Density of Chasers method. We now usethe stored data to measure the difference in density during a setperiod of time. For this graph, we show the difference in densities

Page 13: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 13

through the 60 minutes before the Rozel tornado touches down. Thismethod adds the total number of chasers in the current minute tothe sum of all previous minutes. We output each of the minutes as aseparate frame to create a cumulative density map animation.

37

38

39

40

41

−102 −100 −98 −96Longitude [oE]

Latit

ude

[o N]

0

600

1200

1800

2400Chaser Minutes Per Square

Figure 11: Cumulative chaser density[chaser minutes per square] during onehour before the Rozel touchdown onMay 18, 2013. This method makes iteasy to detect the hotspots. The blackdot represents the touchdown locationof the Rozel tornado.

One minute before the touchdown of the tornado, it is clear whichsquares had the most chaser activity. A square with a high intensityis called a hotspot.

We also take the example of Moore tornado using the exact samecumulative technique. Here, the hotspot is clear, but it is not closeto the touchdown location of the Moore tornado. This is an exampleof when the chaser community misjudged the location of the tor-nado and were caught unawares. National Geographic reports that

Page 14: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 14

a well-funded chase team "misjudged the weather patterns and, likenumerous other chasers, followed a storm down to Duncan, Okla-homa - thereby missing the tornado that leveled much of the townof Moore.11" This example shows the advantages of the cumulative 11 National Geographic. Last days of a

storm chaser. National Geographic, 2013density approach.

33

34

35

36

37

38

−100 −98 −96 −94Longitude [oE]

Latit

ude

[o N]

0

1200

2400

3600Chaser Minutes Per Square

Figure 12: Cumulative chaser density[chaser minutes per square] duringone hour before the Moore touchdownon May 20th, 2013. The black dotrepresents the touchdown location ofthe Moore tornado.

Another way to display the change in chaser positions is to mea-sure squares by whether or not at least one chaser has entered overthe past minute. We do not account for squares that have added nonew chasers or lost chasers in the past minute. We add up the min-utes during which a square added at least once chaser and display itin Figure 13. Compared with the cumulative density map of the sametime period (Figure 11), there are more distinct hotspots, notably in a

Page 15: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 15

patch north of the touchdown location. There was an accumulation ofchasers in this area, though they were not as many as near the actualtouchdown point. This is because the model accounts for only at leastone chaser entering a square and does not further reward squaresthat have additional chasers.

36

37

38

39

40

−102 −100 −98 −96Longitude [oE]

Latit

ude

[o N]

0

4

8

12

16Minutes square added at least one chaser

Figure 13: Cumulative measure ofeach square that added chasers on aminute-by-minute basis over an hourlong period beginning at UTC 23:18:00on May 18, 2013. The black dot is thetouchdown location of the Rozel, KStornado.

Medoid of Chasers

I use medoids to summarize the chaser positions. A medoid is themember of the dataset where the difference with all other membersof the dataset is minimal. If a dataset shows multiple clusters, then ithas multiple medoids. A medoid is effected by the scale of the map.

Page 16: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 16

Here we use the same boundaries as the density map. We use theflexible procedures for clustering (fpc) package in R for generatingthe clustering and the medoid locations.

I display each of the clusters in our boundaries as a different color.This method is useful for observing clusters of chasers. Tornadochasers can use this method while chasing to classify which chasersare part of a larger group and which ones are more isolated.

Figure 14: Chaser clusters (as coloreddots) and chaser medoids (as blackdots) at UTC 23:18:00 on May 18, 2013.

The clustering is heavily dependent on scale. I recommend chasersin the field use this method at about a statewide scale, like Figure14 because this represents a drivable scale and it shows divisions bysupercells.

If I use a smaller scale, then the clusters group together chasersaiming for different targets. The medoids that sit atop major citiessuch as Whiataw, Kansas City, and Oklahoma City make sense. Theyrepresent the cluster of chasers who live in those cites and perhapshave not chosen to chase.

I also apply this method to the Moore tornado at the UTC 18:58:00,May 20, 2013, exactly one hour before touchdown. Here, the clusternear Oklahoma City spreads south past the touchdown location.

I also track the medoids through time. We construct an animation

Page 17: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 17

Figure 15: Chaser clusters (as coloreddots) and chaser medoids (as largeblack dots) at UTC 23:18:00 on May 18,2013.

Figure 16: Chaser clusters (as coloreddots) and chaser medoids (as largeblack dots) at UTC 18:58:00 on May20, 2013, one hour before the Mooretornado touchdown.

Page 18: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 18

that recalculates the clusters and medoid points every frame. Duringthis animation, the clusters of chasers are continually resorted and, asa result, the medoids change positions.

Conclusion

In this project, various methods were used to show the value of usinga new chaser location dataset as part of a wider analysis. First, thispaper presented a novel dataset of tornado chasers during the 2013season. This data was collected during the 2013 season using SpotterNetwork, a widely used website that aggregates chaser positions. Allthe data were organized into an PostgreSQL database and presentedas a standalone Application using Processing. The Application useddesign techniques from previous attempts to visualize weather data.

Then, using the dataset, this paper developed models that quantifythe relationship between tornado chasers for tornado researchersand the general public. These models are chaser density, cumulativechaser density, and chaser medoid. The relative advantages of eachmethod were presented for different audiences. This paper makesthe persuasive case that chaser data should be included as part of thewider historical record of tornados.

Further Research

I see two immediate use cases for this project: helping chasers bettervisualize the positions of other chasers to make better decisions andhelping researchers combine various types of tornado data. I presenttwo examples as ways

Geographic Prism

A geographic prism describes a "bubble" in space and time. We canuse it to further define the gravitational "pull" towards the placewhere the tornado will be in the hour before the tornado touchdown.All chasers are either within this boundary or not. Those chasersthat enter the boundary first have correctly "bet" on that setup posi-tion. We use the application that we built in Processing as a basis forimplementing this prism (Figure 17).

Figure 17: A proof-of-concept of usinga geographic prism to rank individualchasers.

For this example of the Rozel touchdown, the red circle is the ge-ographic prism. We keep track of each chaser who enters the prism.We create a leaderboard to show who in the prism is closest to thetouchdown location.

Page 19: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 19

Debris Tracking

The Enhanced Fujita Scale (or EF Scale) estimates tornado intensityon a categorical scale. It was originally developed in the 1970s byTim Fujita, a structural engineer who determined that the damagecaused to a building was indicative of the intensity of the event. Inthe context of the time, it made sense to use this indirect methodof measuring tornados: storm chasing was in its infancy and manytornados events occurred without direct observation.

To determine the velocity of tornado debris on camera footage ofan event, one needs to know the exact location of the camera and theexact location of the tornado. With methods like the one I present,such a conclusion might be possible.

Figure 18: This tornado is an idealcandidate to measure the debris directlybecause of the chaser’s proximity to theevent.

I performed a proof of concept to demonstrate the potential usesfor this type of data with the Rago, Kansas tornado of May 19, 2012.The National Weather Service released the damage path, document-ing the location of the tornado through time. The location of thecamera is known.

Using the 3D software package Blender, we track a piece of debris.This tracking works by looking for similar image pattens in eachsuccessive frame. It creates a marker in Blender’s internal coordinatesystem. Because we know the distance between the camera and thedebris, we can calculate the speed that the debris is traveling at aselection of time. In this case, our estimate for the speed of the debrisis 80 mph, which is within the EF Scale for this particular tornado.

Figure 19: The debris tracking as part ofthe Blender 3D software.

Page 20: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 20

Appendix A: Recording Data

cd ~/Desktop /; while t rue ; do fi lename=$ ( date +%s ) ; c u r lht tp ://www. spotternetwork . org/feeds/rss�p o s i t i o n s . xml >$ { f i lename } . xml ; echo $ { f i lename } . xml ; s leep 1 8 0 ; done ;

Appendix B: Application

import process ing . opengl . * ;

import contro lP5 . * ;

import codeanticode . g lgraphics . GLConstants ;import codeanticode . g lgraphics . * ;import de . fhpotsdam . unfolding . * ;import de . fhpotsdam . unfolding . geo . * ;import de . fhpotsdam . unfolding . u t i l s . * ;import de . fhpotsdam . unfolding . providers . * ;import de . fhpotsdam . unfolding . marker . * ;import de . fhpotsdam . unfolding . data . * ;import j ava . t e x t . * ;

i n t currentc lockhours ;

S t r i n g tornadoname = " " ;

i n t currentdate ;

i n t tornadoindex = 1 ;

S t r i n g namevalue = " " ;

S t r i n g textValue = " " ;

ControlP5 cp5 ;

RadioButton r ;

ArrayList <Str ing > l i s t 1 ;ArrayList <Str ing > l i s t 2 ;i n t counter = 0 ;

S t r i n g [ ] c u r r e n t t o r n = new S t r i n g [ 1 ] ;

import j ava . applet . * ;

import j ava . awt . Dimension ;

import j ava . awt . Frame ;import j ava . awt . event . MouseEvent ;import j ava . awt . event . KeyEvent ;import j ava . awt . event . FocusEvent ;import j ava . awt . Image ;import j ava . io . * ;import j ava . net . * ;import j ava . t e x t . * ;

Page 21: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 21

import j ava . u t i l . * ;import j ava . u t i l . zip . * ;import j ava . u t i l . regex . * ;

/ / T a b l e t a b l e = l o a d T a b l e (" d a t a / d a t a . t x t " ) ;

import de . b e z i e r . data . s q l . * ;

S t r i n g [ ] datachasers ;

/ / S t r i n g [ ] sa1 = { "OH" , "NY" , "CA" } ;

/ / S t r i n g [ ] d a t a c h a s e r s 1 ;

/ / S t r i n g L i s t i n v e n t o r y ;

/ / S t r i n g L i s t <St r ing > b a l l s ;

f l o a t previoustime ;f l o a t nextt ime ;S t r i n g chaserName ;i n t numberofchaserdots ;

f l o a t l a s tpo in tseconds in theday ;

f l o a t pointsecondsinthedaymoore ;

f l o a t f i rs tpointsecondsinthedaymoore ;

f l o a t lastpointsecondsinthedaymoore ;

f l o a t f i r s t h o u r s ;f l o a t f i r s t m i n u t e s ;f l o a t f i r s t s e c o n d s ;

i n t numberofchasers1 ;i n t numberofchasers2 ;

boolean torandovisab le = f a l s e ;

f l o a t previousTornPosi t ionx ;f l o a t previousTornPosi t iony ;

f l o a t nextTornPosi t ionx ;f l o a t nextTornPosi t iony ;

S c re e nP o s i t i o n previousCarPosi t ion ;S c re e nP o s i t i o n previousTornPos ;

S c re e nP o s i t i o n nextCarPos i t ion ;PFont font ;PFont font2 ;

PFont t i c k f o n t ;PFont t i c k f o n t b i g ;

l iveTornLocat ion tornLive ;

Page 22: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 22

UnfoldingMap map ;

PostgreSQL pgsql ;

f l o a t s = 2 ;

f l o a t secondsintheday ;

f l o a t f i r s t p o i n t s e c o n d s i n t h e d a y ;

i n t animationindex = 80000 ;

f l o a t p o s i t i o n n e x t x ;f l o a t pos i t ionnexty ;

f l o a t p o s i t i o n x ;f l o a t pos i t iony ;

Locat ion prevCarPosFinal = new Location ( 0 , 0 ) ;Locat ion prevTornPosFinal = new Location ( 0 , 0 ) ;

individualTornados mooreOK ;individualTornados2 mooreOK2 ;individualChasers [ ] dots ;individualChasers [ ] dots2 ;

S t r i n g [ ] c h a s e r In f o = new S t r i n g [ 4 8 1 ] ;S t r i n g [ ] chaser In fo2 = new S t r i n g [ 1 4 2 2 ] ;

void setup ( ) {s i z e ( 1 4 0 0 , 750 , GLConstants .GLGRAPHICS) ;map = new UnfoldingMap ( this , new OpenStreetMap .

CloudmadeProvider ( " 322 cdfb6aad64546bf5557627e0ef f f4 " ,1930 ) ) ; / / 1714 / / 7 7 9 2 2

MapUtils . c rea teDefaul tEventDispatcher ( this , map) ;Locat ion usaLocation = new Location ( 3 8 . 2 , �99 .46) ;map . zoomAndPanTo ( usaLocation , 10 ) ;/ / b a l l s = new A r r a y L i s t <St r ing > ( ) ;

datachasers = new S t r i n g [ 1 ] ;

cp5 = new ControlP5 ( t h i s ) ;

cp5 . addText f ie ld ( " " ). s e t P o s i t i o n ( width �300 ,15). s e t S i z e ( 2 8 0 , 3 0 ). se tFont ( c rea teFont ( " Pala t ino�Roman" , 1 6 ) ). setAutoClear ( f a l s e ). setColorForeground ( c o l o r ( 0 , 0 , 0 , 100 ) ). setColorBackground ( c o l o r ( 2 4 0 , 2 4 0 , 2 4 0 ) ). setColorValueLabel ( c o l o r ( 0 ) );

r = cp5 . addRadioButton ( " radioButton " ). s e t P o s i t i o n ( 2 0 , 6 0 ). s e t S i z e ( 4 0 , 2 0 ). setColorForeground ( c o l o r ( 1 0 0 ) ). se tColorAct ive ( c o l o r ( 2 5 5 ) ). se tColorLabel ( c o l o r ( 0 ) )

Page 23: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 23

. setItemsPerRow ( 1 )

. setSpacingColumn ( 1 0 0 )

. addItem ( " Rozel " , 1 )

. addItem ( " Moore " , 2 );

for ( Toggle t : r . get I tems ( ) ) {t . capt ionLabel ( ) . setColorBackground ( c o l o r ( 2 5 5 , 8 0 ) ) ;t . capt ionLabel ( ) . s t y l e ( ) . moveMargin(�7 ,0 ,0 ,�3) ;t . capt ionLabel ( ) . s t y l e ( ) . movePadding ( 7 , 0 , 0 , 3 ) ;t . capt ionLabel ( ) . s t y l e ( ) . backgroundWidth = 4 5 ;t . capt ionLabel ( ) . s t y l e ( ) . backgroundHeight = 1 3 ;

}

/ / i n v e n t o r y = new S t r i n g L i s t ( ) ;/ / i n v e n t o r y . append (" c o f f e e " ) ;/ / i n v e n t o r y . append (" f l o u r " ) ;/ / i n v e n t o r y . append (" t e a " ) ;/ / p r i n t l n ( i n v e n t o r y ) ;

/ *L i s t <F e a t u r e > t o r n a d o e s = GeoJSONReader . l o a d D a t a ( t h i s , "

e x t r a c t D a m a g e P o l y s _ o l d . j s o n ") ;L i s t <Marker > t o r n a d o M a r k e r s = MapUtils . c r e a t e S i m p l e M a r k e r s (

t o r n a d o e s ) ;c o l o r c = c o l o r ( 2 5 5 , 204 , 0 ) ;

/ / t o r n a d o M a r k e r s . s e t C o l o r ( c o l o r ( 2 5 5 , 0 , 0 ) ) ;map . addMarkers ( t o r n a d o M a r k e r s ) ;* /

font = loadFont ( "TwCenMT�Bold�80.vlw " ) ;t e x t F o n t ( font , 40 ) ;

font2 = loadFont ( "TwCenMT�Bold�80.vlw " ) ;t e x t F o n t ( font , 20 ) ;

t i c k f o n t = loadFont ( " Pala t ino�Roman�16.vlw " ) ;

t i c k f o n t b i g = loadFont ( " Pala t ino�Roman�60.vlw " ) ;

mooreOK = new individualTornados ( ) ;mooreOK2 = new individualTornados2 ( ) ;

S t r i n g user = " i a n e l s n e r " ;S t r i n g pass = " " ;

/ / name o f t h e d a t a b a s e t o use/ /S t r i n g database = " i a n e l s n e r " ;pgsql = new PostgreSQL ( this , " l o c a l h o s t " , database , user ,

pass ) ;

i f ( pgsql . connect ( ) ) {i n t i =0 ;

Page 24: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 24

pgsql . query ( "SELECT COUNT ( DISTINCT \" Chaser_ID \") FROMmoore " ) ;

while ( pgsql . next ( ) ) {/ / p r i n t l n (" Number o f I t e m s :"+ p g s q l . g e t I n t ( 1 ) ) ;

numberofchasers1 = pgsql . g e t I n t ( 1 ) ;/ / p r i n t l n ( n u m b e r o f c h a s e r s 1 ) ;

/ / d a t a c h a s e r s = new S t r i n g [ n u m b e r o f c h a s e r s 1 ] ;

dots = new individualChasers [ numberofchasers1 ] ;S t r i n g [ ] ch a s e r In f o = new S t r i n g [ numberofchasers1 ] ;

}

pgsql . query ( "SELECT DISTINCT \" Chaser_ID \" FROM moore " );

while ( pgsql . next ( ) ){

ch a ser In fo [ i ] = pgsql . g e t S t r i n g ( " Chaser_ID " ) ;

/ / p r i n t l n ( c h a s e r I n f o [ i ] ) ;i ++;

}

for ( i n t k =0 ; k<c h a s e r In f o . length ; k++){

dots [ k ] = new individualChasers ( c has er In fo [ k ] ) ;

}

}

}

/ *v o i d saveData ( S t r i n g newData , b o o l e a n appendData ) {

B u f f e r e d W r i t e r bw = n u l l ;t r y {

F i l e W r i t e r fw = new F i l e W r i t e r ( " / t e s t 2 . t x t " , appendData ) ;bw = new B u f f e r e d W r i t e r ( fw ) ;bw . w r i t e ( newData + System . g e t P r o p e r t y (" l i n e . s e p a r a t o r " ) ) ;

} c a t c h ( IOExcep t i on e ) {} f i n a l l y {

i f ( bw != n u l l ) {t r y {

bw . c l o s e ( ) ;} c a t c h ( IOExcep t i on e ) { }

}}

}* /

void draw ( ) {

Page 25: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 25

map . draw ( ) ;s t roke ( 2 5 5 , 0 , 0 , 1 0 0 ) ;strokeWeight ( 2 ) ;l i n e ( mouseX , height �100 , mouseX , height ) ;

l i s t 1 = new ArrayList <Str ing > ( ) ;l i s t 2 = new ArrayList <Str ing > ( ) ;

/ / s = map . getZoom ( ) / 1 0 ;

t e x t F o n t ( font , 20 ) ;

i f ( tornadoindex ==1) {

mooreOK . paint ( ) ;

for ( i n t j = 0 ; j <dots . length ; j ++) {

dots [ j ] . pa int ( ) ;tornadoname = " Rozel , KS" ;

}}

e lse i f ( tornadoindex ==2) {

mooreOK2 . pa int ( ) ;

tornadoname = " Moore , OK" ;

for ( i n t j = 0 ; j <dots . length ; j ++) {

dots [ j ] . pa int ( ) ;

}

}

i n t clockhours = animationindex /3600 ;i n t clockminutes = ( animationindex /60) %60;i n t clockseconds = animationindex %60;

f i l l ( 0 , 0 , 0 ) ;

/ / p r i n t l n ( l i s t 2 . g e t ( 0 ) ) ;

Page 26: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 26

S t r i n g [ ] a c t u a l l i s t = new S t r i n g [ l i s t 1 . s i z e ( ) ] ;for ( i n t i = 0 ; i < l i s t 1 . s i z e ( ) ; i ++) {

a c t u a l l i s t [ i ] = l i s t 1 . get ( i ) ;

}

/ / s a v e S t r i n g s (""+ c o u n t e r +". t x t " , a c t u a l l i s t ) ;

/ / s a v e S t r i n g s (" t o r a n d o "+ c o u n t e r +". t x t " , c u r r e n t t o r n ) ;

/ / c o u n t e r ++;/ / l i s t 1 . c l e a r ( ) ;

/ / t e x t ( f rameRate , 10 , 60 ) ;

f i l l ( 0 , 1 0 0 , 255 , 100 ) ;s t roke ( 0 , 0 , 0 , 255 ) ;strokeWeight ( 2 ) ;

/ / r e c t ( 0 , h e i g h t �30 , width , h e i g h t ) ;

l i n e ( 0 , height �30 , width , height �30) ;

/ / l i n e ( width / 2 , h e i g h t �25 , width / 2 , h e i g h t �40) ;

/ / i n t ( map ( l a s t p o i n t s e c o n d s i n t h e d a y , i r s t p o i n t s e c o n d s i n t h e d a y�5000 , f i r s t p o i n t s e c o n d s i n t h e d a y +5000 , 0 , width ) )

/ / l i n e ( i n t ( map ( l a s t p o i n t s e c o n d s i n t h e d a y ,f i r s t p o i n t s e c o n d s i n t h e d a y �5000 , f i r s t p o i n t s e c o n d s i n t h e d a y+5000 , 0 , width ) ) , h e i g h t �25 , i n t ( map (l a s t p o i n t s e c o n d s i n t h e d a y , f i r s t p o i n t s e c o n d s i n t h e d a y �5000 ,

f i r s t p o i n t s e c o n d s i n t h e d a y +5000 , 0 , width ) ) , h e i g h t �40) ;

t e x t Al i gn (CENTER) ;f i l l ( 2 5 5 ) ;

f i l l ( 0 , 250 , 250 , 100 ) ;noStroke ( ) ;

/ / r e c t ( 0 , 0 , width , 30 ) ;s t roke ( 0 ) ;strokeWeight ( 2 ) ;/ / l i n e ( 0 , 30 , width , 30 ) ;

t ex tA l i gn ( LEFT ) ;

f i l l ( 0 ) ;t e x t F o n t ( t i c k f o n t b i g , 30 ) ;

Page 27: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 27

currentdate = 18 + clockhours /24 ;

currentc lockhours = clockhours % 2 4 ;

t e x t ( tornadoname+" "+currentdate+" May 2013 "+currentc lockhours+" : "+clockminutes+" : "+clockseconds , 20 ,

40 ) ;

t ex tA l i gn (CENTER) ;

f i l l ( 0 ) ;

s t roke ( 0 ) ;

strokeWeight ( 2 ) ;

l i n e ( 0 , height �27 , 0 , height �33) ;

t e x t F o n t ( t i c k f o n t , 16 ) ;t e x t ( " 3 " , 8 , height �10) ;

l i n e ( i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y �7200 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �27 ,i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y �7200 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �33) ;

t e x t ( " 2 hours " , i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y �7200 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �10) ;

l i n e ( i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y �3600 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �27 ,

i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y �3600 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �33);

t e x t ( " 1 hour " , i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y �3600 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �10) ;

l i n e ( i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y +3600 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �27 ,

i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y +3600 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �33);

t e x t ( " 1 hour " , i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y +3600 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �10) ;

l i n e ( i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y +7200 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height

Page 28: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 28

�27 , i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y +7200 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height�33) ;

t e x t ( " 2 hours " , i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y +7200 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �10) ;

t e x t ( "Touchdown" , width /2 , height �10) ;l i n e ( i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y ,

f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height�27 , i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height�33) ;

i f ( tornadoindex == 1 ) {

s t r oke ( 2 5 5 , 0 , 0 ) ;strokeWeight ( 5 ) ;

l i n e ( i n t (map( las tpointsecondsintheday ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 , f i r s t p o i n t s e c o n d s i n t h e d a y+10800 , 0 , width ) ) , height �30 , i n t (map(f i r s t p o i n t s e c o n d s i n t h e d a y , f i r s t p o i n t s e c o n d s i n t h e d a y�10800 , f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) ,height �30) ;

animationindex= i n t (map( mouseX , 0 , width ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800) ) ;

l i n e ( i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y +10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �27 ,i n t (map( f i r s t p o i n t s e c o n d s i n t h e d a y +10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y �10800 ,f i r s t p o i n t s e c o n d s i n t h e d a y +10800 , 0 , width ) ) , height �33) ;

}

i f ( tornadoindex == 2 ) {

s t roke ( 2 5 5 , 0 , 0 ) ;strokeWeight ( 5 ) ;

l i n e ( i n t (map( lastpointsecondsinthedaymoore ,f i rs tpointsecondsinthedaymoore �10800 ,f i r s tpointsecondsinthedaymoore +10800 , 0 , width ) ) , height�30 , i n t (map( f i rs tpointsecondsinthedaymoore ,f i rs tpointsecondsinthedaymoore �10800 ,f i r s tpointsecondsinthedaymoore +10800 , 0 , width ) ) , height�30) ;

/ / p r i n t l n ( f i r s t p o i n t s e c o n d s i n t h e d a y m o o r e ) ;

Page 29: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 29

/ / p r i n t l n ( a n i m a t i o n i n d e x ) ;

animationindex= i n t (map( mouseX , 0 , width ,f i rs tpointsecondsinthedaymoore �10800 ,f i r s tpointsecondsinthedaymoore +10800) ) ;

l i n e ( i n t (map( f i rs tpointsecondsinthedaymoore +10800 ,f i rs tpointsecondsinthedaymoore �10800 ,f i r s tpointsecondsinthedaymoore +10800 , 0 , width ) ) , height�27 , i n t (map( f i rs tpointsecondsinthedaymoore +10800 ,f i rs tpointsecondsinthedaymoore �10800 ,f i r s tpointsecondsinthedaymoore +10800 , 0 , width ) ) , height�33) ;

}

t e x t ( " 3 " , width�8 , height �10) ;}

void contro lEvent ( ControlEvent theEvent ) {

i f ( theEvent . isFrom ( r ) ) {p r i n t ( " got an event from "+theEvent . getName ( ) +"\ t " ) ;

for ( i n t i =0 ; i <theEvent . getGroup ( ) . getArrayValue ( ) . length ; i++) {

p r i n t ( i n t ( theEvent . getGroup ( ) . getArrayValue ( ) [ i ] ) ) ;}p r i n t l n ( "\ t "+theEvent . getValue ( ) ) ;

i f ( theEvent . getValue ( ) == 1 ) {

tornadoindex = 1 ;

}

i f ( theEvent . getValue ( ) == 2 ) {

tornadoindex = 2 ;

}

/ / myColorBackground = c o l o r ( i n t ( t h e E v e n t . group ( ) . v a l u e ( ) * 5 0 ), 0 , 0 ) ;

}

i f ( theEvent . isAssignableFrom ( T e x t f i e l d . c l a s s ) ) {p r i n t l n ( " contro lEvent : a cc e s s in g a s t r i n g from c o n t r o l l e r ’ "

Page 30: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 30

+theEvent . getName ( ) +" ’ : "+theEvent . getS tr ingValue ( )) ;

namevalue=theEvent . getS tr ingValue ( ) ;

}}

void keyPressed ( ) {i f ( key == ENTER) {

tornadoindex = 2 ;p r i n t l n ( " Enter " ) ;

}

i f ( key == TAB) {

tornadoindex = 1 ;p r i n t l n ( " Tab " ) ;

}}

public void Rozel ( i n t theValue ) {p r i n t l n ( " a button event from Rozel , KS : "+theValue ) ;

tornadoindex = 1 ;

}

public void Moore ( i n t theValue ) {p r i n t l n ( " a button event from Rozel , KS : "+theValue ) ;

tornadoindex = 2 ;

}

Page 31: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 31

Appendix C: Maps

Chasing the Chasers========================================================

‘ ‘ ‘ { r readChaserData }May18 = read . csv ( "~ / Dropbox / Tornado_ Ian / t e s t . csv " )‘ ‘ ‘

‘ ‘ ‘ { r packages }setwd ( "~ / Dropbox / Tornado_ Ian " )l i b r a r y ( ggplot2 )l i b r a r y (ggmap)l i b r a r y ( plyr )l i b r a r y ( rgeos )l i b r a r y ( l u b r i d a t e )l i b r a r y ( sp )require ( ggplot2 )require ( s p a t s t a t )require ( maptools )require ( rgdal )require ( r a s t e r )require ( c l u s t e r )require ( fpc )‘ ‘ ‘

‘ ‘ ‘ { r RozelKS }l i b r a r y (ggmap)o u r l o c a t i o n = geocode ( " Russel KS" )RozelMap = get _map( l o c a t i o n = u n l i s t ( o u r l o c a t i o n ) ,

maptype=" toner " , zoom = 7 , source=" stamen " )##ggmap ( RozelMap , e x t e n t =" d e v i c e " )l l a = a t t r ( RozelMap , " bb " ) $ l l . l a tl l o = a t t r ( RozelMap , " bb " ) $ l l . lonula = a t t r ( RozelMap , " bb " ) $ur . l a tulo = a t t r ( RozelMap , " bb " ) $ur . lonr = r a s t e r ( ncol = 32 , nrow = 32 ,

xmn = l l o , xmx = ulo ,ymn = l l a , ymx = ula )

‘ ‘ ‘

Density of Chasers

‘ ‘ ‘ { r density }

fn = paste ( " LocationsByTime / " , 50 , " . t x t " , sep = " " )df = read . csv ( fn , header = FALSE)

names ( df ) = c ( " l a t " , " lon " )df = df [ ! i s . na ( df$ l a t ) , ]xy = cbind ( x = df$ lon , y = df$ l a t )r2 = r a s t e r i z e ( xy , r , fun = function ( x , . . . ) length ( x ) ,

background = 0 )r2p = r a s t e r T o P o i n t s ( r2 )r2p . df = data . frame ( r2p )co l func <� colorRampPalette ( c ( " white " , " orange " , " red " ) )

Page 32: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 32

p = ggmap( RozelMap , e x t e n t=" device " ) +geom_ t i l e ( aes ( x = x , y = y , f i l l = l a y e r ) ,

data = r2p . df , alpha = . 5 ) +ylab ( expression ( paste ( " Lat i tude [ " , { } ^ o , "N] " ) ) ) +xlab ( expression ( paste ( " Longitude [ " , { } ^ o , "E ] " ) ) ) +coord _equal ( ) +s c a l e _ f i l l _ gradientn ( " Chasers per square " , l i m i t s = c ( 0 , 13 ) ,

breaks=c ( 0 , 5 , 10 , 13 ) ,colours = col func ( 1 4 ) ) +

theme_bw( ) + theme ( axis . t i t l e . x= element _ t e x t ( s i z e =8) , axis .t i t l e . y= element _ t e x t ( s i z e =8) ) + geom_ point ( aes ( x=�99 .4655 , y = 3 8 . 1 4 4 9 3 ) , c o l o r = " black " , s i z e = 2 )

p‘ ‘ ‘

‘ ‘ ‘ { r densi ty2 }l i b r a r y (ggmap)o u r l o c a t i o n = geocode ( " Rozel KS" )RozelMap = get _map( l o c a t i o n = u n l i s t ( o u r l o c a t i o n ) ,

maptype=" toner " , zoom = 5 , source=" stamen " )#ggmap ( RozelMap , e x t e n t =" d e v i c e " )l l a = a t t r ( RozelMap , " bb " ) $ l l . l a tl l o = a t t r ( RozelMap , " bb " ) $ l l . lonula = a t t r ( RozelMap , " bb " ) $ur . l a tulo = a t t r ( RozelMap , " bb " ) $ur . lonr = r a s t e r ( ncol = 32 , nrow = 32 ,

xmn = l l o , xmx = ulo ,ymn = l l a , ymx = ula )

fn = paste ( " LocationsByTime / " , 0 , " . t x t " , sep = " " )tornfn = paste ( " TornadoLocationsByTime / " , " torando " , 0 , " . t x t " ,

sep = " " )df = read . csv ( " LocationsByTime / 0 . t x t " , header = FALSE)

co l func <� colorRampPalette ( c ( " white " , " orange " , " red " ) )names ( df ) = c ( " l a t " , " lon " )df = df [ ! i s . na ( df$ l a t ) , ]

xy = cbind ( x = df$ lon , y = df$ l a t )r2 = r a s t e r i z e ( xy , r , fun = function ( x , . . . ) length ( x ) ,

background = 0 )r2p = r a s t e r T o P o i n t s ( r2 )r2p . df = data . frame ( r2p )

p = ggmap( RozelMap , e x t e n t=" device " ) +geom_ t i l e ( aes ( x = x , y = y , f i l l = l a y e r ) ,

data = r2p . df , alpha = . 5 ) +ylab ( expression ( paste ( " Lat i tude [ " , { } ^ o , "N] " ) ) ) +xlab ( expression ( paste ( " Longitude [ " , { } ^ o , "E ] " ) ) ) +s c a l e _ f i l l _ gradientn ( " Chasers per square " , l i m i t s = c ( 0 , 30 ) ,

colours = col func ( 3 0 ) ) +theme_bw( ) + theme ( axis . t i t l e . x= element _ t e x t ( s i z e =8) , axis .

t i t l e . y= element _ t e x t ( s i z e =8) )

Page 33: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 33

p

‘ ‘ ‘

Cumulative Density

‘ ‘ ‘ { r densi tyovert imeRozel }o u r l o c a t i o n = geocode ( " Russel KS" )RozelMap = get _map( l o c a t i o n = u n l i s t ( o u r l o c a t i o n ) ,

maptype=" toner " , zoom = 7 , source=" stamen " )

l l a = a t t r ( RozelMap , " bb " ) $ l l . l a tl l o = a t t r ( RozelMap , " bb " ) $ l l . lonula = a t t r ( RozelMap , " bb " ) $ur . l a tulo = a t t r ( RozelMap , " bb " ) $ur . lonr = r a s t e r ( ncol = 32 , nrow = 32 ,

xmn = l l o , xmx = ulo ,ymn = l l a , ymx = ula )

df0 = read . csv ( " LocationsByTime / 0 . t x t " , header = FALSE)names ( df0 ) = c ( " l a t " , " lon " )df0 = df0 [ ! i s . na ( df$ l a t ) , ]xy0 = cbind ( x = df0 $ lon , y = df0 $ l a t )r20 = r a s t e r i z e ( xy0 , r , fun = function ( x , . . . ) length ( x ) ,

background = 0 )rDi f = r20rDi f2 = 0rDi f3 =0

co l func <� colorRampPalette ( c ( " white " , " orange " , " red " ) )nframes = 59j = 1 : nframes

fn = paste ( " LocationsByTime / " , j , " . t x t " , sep = " " )for ( i in 1 : nframes ) {

i f ( i < 10 ) { out = paste ( ’ PlotsByTimeDif1 / 000 ’ ,i , ’ p l o t . png ’ , sep = " " ) }

i f ( i < 100 && i >= 10 ) { out = paste ( ’ PlotsByTimeDif1 / 00 ’ ,i , ’ p l o t . png ’ ,sep = " " ) }

df = read . csv ( fn [ i ] , header = FALSE)names ( df ) = c ( " l a t " , " lon " )df = df [ ! i s . na ( df$ l a t ) , ]xy = cbind ( x = df$ lon , y = df$ l a t )r2 = r a s t e r i z e ( xy , r , fun = function ( x , . . . ) length ( x ) ,

background = 0 )rDi f = r2 + r20rDi f2 = rDi f + rDif2r20 = r2rDi f2 = rDi frDi f3 = rDif2 + rDif3r2p = r a s t e r T o P o i n t s ( rDi f3 )r2p . df = data . frame ( r2p )

Page 34: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 34

png ( out , width =700 , he ight =700)p = ggmap( RozelMap , e x t e n t=" device " ) +

geom_ t i l e ( aes ( x = x , y = y , f i l l = l a y e r ) ,data = r2p . df , alpha = . 8 ) +

ylab ( expression ( paste ( " Lat i tude [ " , { } ^ o , "N] " ) ) ) +xlab ( expression ( paste ( " Longitude [ " , { } ^ o , "E ] " ) ) ) +coord _equal ( ) +s c a l e _ f i l l _ gradientn ( " Chaser Minutes Per Square " ,

l i m i t s = c ( 0 , 2 4 0 0 ) , breaks=c ( 0 , 600 ,1200 , 1800 , 2400 ) ,

colours= col func ( 1 0 0 ) ) +theme_bw( ) + theme ( axis . t i t l e . x= element _ t e x t ( s i z e =8) , axis .

t i t l e . y= element _ t e x t ( s i z e =8) ) + geom_ point ( aes ( x=�99 .4655 , y = 3 8 . 1 4 4 9 3 ) , c o l o r = " black " , s i z e = 2 )

print ( p )dev . off ( )print ( i )}‘ ‘ ‘

‘ ‘ ‘ { r densityovertimeMoore }o u r l o c a t i o n = geocode ( " Oklahoma City OK" )OkMap = get _map( l o c a t i o n = u n l i s t ( o u r l o c a t i o n ) ,

maptype=" toner " , zoom = 7 , source=" stamen " )

l l a = a t t r (OkMap, " bb " ) $ l l . l a tl l o = a t t r (OkMap, " bb " ) $ l l . lonula = a t t r (OkMap, " bb " ) $ur . l a tulo = a t t r (OkMap, " bb " ) $ur . lonr = r a s t e r ( ncol = 32 , nrow = 32 ,

xmn = l l o , xmx = ulo ,ymn = l l a , ymx = ula )

df0 = read . csv ( " LocationsByTimeMoore / 0 . t x t " , header = FALSE)names ( df0 ) = c ( " l a t " , " lon " )df0 = df0 [ ! i s . na ( df$ l a t ) , ]xy0 = cbind ( x = df0 $ lon , y = df0 $ l a t )r20 = r a s t e r i z e ( xy0 , r , fun = function ( x , . . . ) length ( x ) ,

background = 0 )rDi f = r20rDi f2 = 0rDi f3 =0

co l func <� colorRampPalette ( c ( " white " , " orange " , " red " ) )nframes = 59j = 1 : nframes

fn = paste ( " LocationsByTimeMoore / " , j , " . t x t " , sep = " " )for ( i in 1 : nframes ) {

i f ( i < 10 ) { out = paste ( ’ PlotsByTimeDifMoore / 000 ’ ,i , ’ p l o t . png ’ , sep = " " ) }

i f ( i < 100 && i >= 10 ) { out = paste ( ’ PlotsByTimeDifMoore / 00 ’ ,i , ’ p l o t . png ’ ,sep = " " ) }

df = read . csv ( fn [ i ] , header = FALSE)names ( df ) = c ( " l a t " , " lon " )df = df [ ! i s . na ( df$ l a t ) , ]xy = cbind ( x = df$ lon , y = df$ l a t )r2 = r a s t e r i z e ( xy , r , fun = function ( x , . . . ) length ( x ) ,

background = 0 )

Page 35: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 35

rDi f = r2 + r20rDi f2 = rDi f + rDif2r20 = r2rDi f2 = rDi frDi f3 = rDif2 + rDif3r2p = r a s t e r T o P o i n t s ( rDi f3 )r2p . df = data . frame ( r2p )png ( out , width =700 , he ight =700)p = ggmap(OkMap, e x t e n t=" device " ) +

geom_ t i l e ( aes ( x = x , y = y , f i l l = l a y e r ) ,data = r2p . df , alpha = . 8 ) +

ylab ( expression ( paste ( " Lat i tude [ " , { } ^ o , "N] " ) ) ) +xlab ( expression ( paste ( " Longitude [ " , { } ^ o , "E ] " ) ) ) +coord _equal ( ) +s c a l e _ f i l l _ gradientn ( " Chaser Minutes Per Square " ,

l i m i t s = c ( 0 , 3 6 0 0 ) , breaks=c ( 0 , 1200 ,2400 , 3600 ) ,

colours= col func ( 1 0 0 ) ) +theme_bw( ) + theme ( axis . t i t l e . x= element _ t e x t ( s i z e =8) , axis .

t i t l e . y= element _ t e x t ( s i z e =8) ) + geom_ point ( aes ( x=�97 .62888917 , y = 35 .28681593 ) , c o l o r = " black " , s i z e = 2 )

print ( p )dev . off ( )print ( i )}‘ ‘ ‘

‘ ‘ ‘ { r d i f f e r e n c e R o z e l }

o u r l o c a t i o n = geocode ( " Rozel KS" )RozelMap = get _map( l o c a t i o n = u n l i s t ( o u r l o c a t i o n ) ,

maptype=" toner " , zoom = 7 , source=" stamen " )#ggmap ( RozelMap , e x t e n t =" d e v i c e " )l l a = a t t r ( RozelMap , " bb " ) $ l l . l a tl l o = a t t r ( RozelMap , " bb " ) $ l l . lonula = a t t r ( RozelMap , " bb " ) $ur . l a tulo = a t t r ( RozelMap , " bb " ) $ur . lonr = r a s t e r ( ncol = 32 , nrow = 32 ,

xmn = l l o , xmx = ulo ,ymn = l l a , ymx = ula )

df0 = read . csv ( " LocationsByTime / 0 . t x t " , header = FALSE)names ( df0 ) = c ( " l a t " , " lon " )df0 = df0 [ ! i s . na ( df$ l a t ) , ]xy0 = cbind ( x = df0 $ lon , y = df0 $ l a t )r20 = r a s t e r i z e ( xy0 , r , fun = function ( x , . . . ) length ( x ) ,

background = 0 )co l func <� colorRampPalette ( c ( " white " , " orange " , " red " ) )rDi f3 = 0nframes = 59j = 1 : nframesfn = paste ( " LocationsByTime / " , j , " . t x t " , sep = " " )for ( i in 1 : nframes ) {

i f ( i < 10 ) { out = paste ( ’ PlotsByTimeDif2 / 000 ’ , i , ’ p l o t . png ’, sep = " " ) }

Page 36: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 36

i f ( i < 100 && i >= 10 ) { out = paste ( ’ PlotsByTimeDif2 / 00 ’ , i ,’ p l o t . png ’ , sep = " " ) }

df = read . csv ( fn [ i ] , header = FALSE)names ( df ) = c ( " l a t " , " lon " )df = df [ ! i s . na ( df$ l a t ) , ]xy = cbind ( x = df$ lon , y = df$ l a t )r2 = r a s t e r i z e ( xy , r , fun = function ( x , . . . ) length ( x ) ,

background = 0 )rDi f = r2 � r20rDi f2 = rDi f > 0rDi f3 = rDif2 + rDif3r20 = r2r2p = r a s t e r T o P o i n t s ( rDi f3 )r2p . df = data . frame ( r2p )png ( out )p = ggmap( RozelMap , e x t e n t=" device " ) +

geom_ t i l e ( aes ( x = x , y = y , f i l l = l a y e r ) ,data = r2p . df , alpha = . 8 ) +

ylab ( expression ( paste ( " Lat i tude [ " , { } ^ o , "N] " ) ) ) +xlab ( expression ( paste ( " Longitude [ " , { } ^ o , "E ] " ) ) ) +coord _equal ( ) +s c a l e _ f i l l _ gradientn ( " Minutes square added at l e a s t one chaser

" , l i m i t s = c ( 0 , 16 ) ,colours = col func ( 1 6 ) ) + geom_ point ( aes ( x

= �99 .4655 , y = 3 8 . 1 4 4 9 3 ) , c o l o r = "black " , s i z e = 2 ) +

theme_bw( ) + theme ( axis . t i t l e . x= element _ t e x t ( s i z e =8) , axis .t i t l e . y= element _ t e x t ( s i z e =8) )

print ( p )dev . off ( )print ( i )}‘ ‘ ‘

‘ ‘ ‘ { r mediodrozel }o u r l o c a t i o n = geocode ( " Russel KS" )RozelMap = get _map( l o c a t i o n = u n l i s t ( o u r l o c a t i o n ) ,

maptype=" toner " , zoom = 7 , source=" stamen " )#ggmap ( RozelMap , e x t e n t =" d e v i c e " )l l a = a t t r ( RozelMap , " bb " ) $ l l . l a tl l o = a t t r ( RozelMap , " bb " ) $ l l . lonula = a t t r ( RozelMap , " bb " ) $ur . l a tulo = a t t r ( RozelMap , " bb " ) $ur . lon

EPSG <� make_EPSG ( )EPSG[ grep ( " kansas " , EPSG$ note , ignore . case=TRUE) , 1 : 2 ]subset (EPSG , code ==26977)

l l = "+pro j= l o n g l a t +datum=NAD83 + e l l p s =GRS80 "l c c = "+pro j= l c c + l a t _ 1=39 .783 + l a t _ 2=38 .7167 + l a t _ 0=38 .33 +lon _

0=�98 +x_0=40 +y_0=0 +datum=NAD83 + u n i t s =m +no_ defs "

Rozel . df = data . frame ( lon = �99 .4655 , l a t = 3 8 . 1 4 4 9 3 )Rozel . sp = S p a t i a l P o i n t s ( Rozel . df , p r o j 4 s t r i n g =CRS( l l ) )Rozel . sp = spTransform ( Rozel . sp , CRS( l c c ) )

Page 37: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 37

nframes = 59j = 1 : nframesfn = paste ( " LocationsByTime / " , j , " . t x t " , sep = " " )for ( i in 1 : nframes ) {

i f ( i < 10 ) { out = paste ( ’ PlotsMedoid / 000 ’ , i , ’ p l o t . png ’ ,sep = " " ) }

i f ( i < 100 && i >= 10 ) { out = paste ( ’ PlotsMedoid / 00 ’ , i , ’p l o t . png ’ , sep = " " ) }

df = read . csv ( fn [ i ] , header = FALSE)names ( df ) = c ( " l a t " , " lon " )df = subset ( df , l a t <= ula & l a t >= l l a & lon >= l l o & lon <=

ulo )spdf = Spat ialPointsDataFrame ( coords = cbind ( df$ lon , df$ l a t ) ,

data = df )

p r o j 4 s t r i n g ( spdf ) = CRS( l l )spdfT = spTransform ( spdf , CRS( l c c ) )

cc = coordinates ( spdfT )bes t = pamk( cc , krange = 1 : 1 0 , alpha = . 9 )

meds = bes t $ pamobject $medoidsc l u s t e r i n g = bes t $ pamobject $ c l u s t e r i n gdf$ c l u s t e r 2 <� c l u s t e r i n gnc = bes t $nc

s i z e = summary ( bes t $ pamobject ) $ c l u s i n f o [ , 1 ]df0 = data . frame ( Time = rep ( 0 , nc ) ,

meds ,s i z e )

# d f 0 = d a t a . f r ame ( Time = 0 , meds )spdf0T = SpatialPointsDataFrame ( coords = meds ,

data = df0 ,p r o j 4 s t r i n g = CRS( l c c ) )

spdf0 = spTransform ( spdf0T , CRS( l l ) )dd = gDistance ( spdf0T , Rozel . sp )# d i s t a n c e = r b i n d ( d i s t a n c e , dd [ which . min ( dd ) ] )

di s ta nce0 = as . data . frame ( dd )df0 = as . data . frame ( spdf0 )

png ( out , width =900 , he ight =900)

p = ggmap( RozelMap , e x t e n t=" device " ) +geom_ point ( aes ( x = x , y = y ) , data=df0 , c o l o r =" black " , s i z e =7)

+geom_ point ( aes ( x = lon , y = l a t , colour = f a c t o r ( c l u s t e r 2 ) ) ,

data=df , s i z e =2) + theme ( legend . p o s i t i o n =" none " )pprint ( p )dev . off ( )print ( i )}

Page 38: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 38

‘ ‘ ‘

‘ ‘ ‘ { r mediodmoore }o u r l o c a t i o n = geocode ( " Moore OK" )MooreMap = get _map( l o c a t i o n = u n l i s t ( o u r l o c a t i o n ) ,

maptype=" toner " , zoom = 8 , source=" stamen " )#ggmap ( RozelMap , e x t e n t =" d e v i c e " )l l a = a t t r (MooreMap , " bb " ) $ l l . l a tl l o = a t t r (MooreMap , " bb " ) $ l l . lonula = a t t r (MooreMap , " bb " ) $ur . l a tulo = a t t r (MooreMap , " bb " ) $ur . lon

EPSG <� make_EPSG ( )EPSG[ grep ( " kansas " , EPSG$ note , ignore . case=TRUE) , 1 : 2 ]subset (EPSG , code ==26977)

l l = "+pro j= l o n g l a t +datum=NAD83 + e l l p s =GRS80 "l c c = "+pro j= l c c + l a t _ 1=39 .783 + l a t _ 2=38 .7167 + l a t _ 0=38 .33 +lon _

0=�98 +x_0=40 +y_0=0 +datum=NAD83 + u n i t s =m +no_ defs "

Rozel . df = data . frame ( lon = �99 .4655 , l a t = 3 8 . 1 4 4 9 3 )Rozel . sp = S p a t i a l P o i n t s ( Rozel . df , p r o j 4 s t r i n g =CRS( l l ) )Rozel . sp = spTransform ( Rozel . sp , CRS( l c c ) )

nframes = 59j = 1 : nframesfn = paste ( " LocationsByTime / " , j , " . t x t " , sep = " " )for ( i in 1 : nframes ) {

i f ( i < 10 ) { out = paste ( ’ PlotsMedoid3 / 000 ’ , i , ’ p l o t . png ’ ,sep = " " ) }

i f ( i < 100 && i >= 10 ) { out = paste ( ’ PlotsMedoid3 / 00 ’ , i , ’p l o t . png ’ , sep = " " ) }

df = read . csv ( fn [ i ] , header = FALSE)

names ( df ) = c ( " l a t " , " lon " )df = subset ( df , l a t <= ula & l a t >= l l a & lon >= l l o & lon <=

ulo )spdf = Spat ialPointsDataFrame ( coords = cbind ( df$ lon , df$ l a t ) ,

data = df )

p r o j 4 s t r i n g ( spdf ) = CRS( l l )spdfT = spTransform ( spdf , CRS( l c c ) )

cc = coordinates ( spdfT )bes t = pamk( cc , krange = 1 : 1 0 , alpha = . 9 )

meds = bes t $ pamobject $medoidsc l u s t e r i n g = bes t $ pamobject $ c l u s t e r i n gdf$ c l u s t e r 2 <� c l u s t e r i n gnc = bes t $nc

Page 39: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 39

s i z e = summary ( bes t $ pamobject ) $ c l u s i n f o [ , 1 ]df0 = data . frame ( Time = rep ( 0 , nc ) ,

meds ,s i z e )

# d f 0 = d a t a . f r ame ( Time = 0 , meds )spdf0T = SpatialPointsDataFrame ( coords = meds ,

data = df0 ,p r o j 4 s t r i n g = CRS( l c c ) )

spdf0 = spTransform ( spdf0T , CRS( l l ) )dd = gDistance ( spdf0T , Rozel . sp )# d i s t a n c e = r b i n d ( d i s t a n c e , dd [ which . min ( dd ) ] )

di s ta nce0 = as . data . frame ( dd )df0 = as . data . frame ( spdf0 )png ( out , width =900 , he ight =900)p = ggmap(MooreMap , e x t e n t=" device " ) +

geom_ point ( aes ( x = x , y = y ) , data=df0 , c o l o r =" black " , s i z e =7)+

geom_ point ( aes ( x = lon , y = l a t , colour = f a c t o r ( c l u s t e r 2 ) ) ,data=df , s i z e =2) + theme ( legend . p o s i t i o n =" none " )

pprint ( p )dev . off ( )print ( i )}

‘ ‘ ‘

‘ ‘ ‘ { r mediod2 }o u r l o c a t i o n = geocode ( " Russel KS" )RozelMap = get _map( l o c a t i o n = u n l i s t ( o u r l o c a t i o n ) ,

maptype=" toner " , zoom = 6 , source=" stamen " )#ggmap ( RozelMap , e x t e n t =" d e v i c e " )l l a = a t t r ( RozelMap , " bb " ) $ l l . l a tl l o = a t t r ( RozelMap , " bb " ) $ l l . lonula = a t t r ( RozelMap , " bb " ) $ur . l a tulo = a t t r ( RozelMap , " bb " ) $ur . lon

EPSG <� make_EPSG ( )EPSG[ grep ( " kansas " , EPSG$ note , ignore . case=TRUE) , 1 : 2 ]subset (EPSG , code ==26977)

l l = "+pro j= l o n g l a t +datum=NAD83 + e l l p s =GRS80 "l c c = "+pro j= l c c + l a t _ 1=39 .783 + l a t _ 2=38 .7167 + l a t _ 0=38 .33 +lon _

0=�98 +x_0=40 +y_0=0 +datum=NAD83 + u n i t s =m +no_ defs "

Rozel . df = data . frame ( lon = �99 .4655 , l a t = 3 8 . 1 4 4 9 3 )Rozel . sp = S p a t i a l P o i n t s ( Rozel . df , p r o j 4 s t r i n g =CRS( l l ) )Rozel . sp = spTransform ( Rozel . sp , CRS( l c c ) )

Page 40: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 40

nframes = 59j = 1 : nframesfn = paste ( " LocationsByTime / " , j , " . t x t " , sep = " " )for ( i in 1 : nframes ) {

i f ( i < 10 ) { out = paste ( ’ PlotsMedoid2 / 000 ’ , i , ’ p l o t . png ’ ,sep = " " ) }

i f ( i < 100 && i >= 10 ) { out = paste ( ’ PlotsMedoid2 / 00 ’ , i , ’p l o t . png ’ , sep = " " ) }

df = read . csv ( fn [ i ] , header = FALSE)names ( df ) = c ( " l a t " , " lon " )df = subset ( df , l a t <= ula & l a t >= l l a & lon >= l l o & lon <=

ulo )spdf = Spat ialPointsDataFrame ( coords = cbind ( df$ lon , df$ l a t ) ,

data = df )

p r o j 4 s t r i n g ( spdf ) = CRS( l l )spdfT = spTransform ( spdf , CRS( l c c ) )

cc = coordinates ( spdfT )bes t = pamk( cc , krange = 1 : 1 0 , alpha = . 9 )

meds = bes t $ pamobject $medoidsc l u s t e r i n g = bes t $ pamobject $ c l u s t e r i n gdf$ c l u s t e r 2 <� c l u s t e r i n gnc = bes t $nc

s i z e = summary ( bes t $ pamobject ) $ c l u s i n f o [ , 1 ]df0 = data . frame ( Time = rep ( 0 , nc ) ,

meds ,s i z e )

# d f 0 = d a t a . f r ame ( Time = 0 , meds )spdf0T = SpatialPointsDataFrame ( coords = meds ,

data = df0 ,p r o j 4 s t r i n g = CRS( l c c ) )

spdf0 = spTransform ( spdf0T , CRS( l l ) )dd = gDistance ( spdf0T , Rozel . sp )# d i s t a n c e = r b i n d ( d i s t a n c e , dd [ which . min ( dd ) ] )

di s ta nce0 = as . data . frame ( dd )df0 = as . data . frame ( spdf0 )png ( out , width =900 , he ight =900)p = ggmap( RozelMap , e x t e n t=" device " ) +

geom_ point ( aes ( x = x , y = y ) , data=df0 , c o l o r =" black " , s i z e =7)+

geom_ point ( aes ( x = lon , y = l a t , colour = f a c t o r ( c l u s t e r 2 ) ) ,data=df , s i z e =2) + theme ( legend . p o s i t i o n =" none " )

pprint ( p )dev . off ( )print ( i )}

‘ ‘ ‘

Page 41: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 41

You can a l s o embed plots , for example :

‘ ‘ ‘ { r f i g . width =7 , f i g . height =6}plot ( c a r s )‘ ‘ ‘

Page 42: CHASING THE CHASERS - University of Floridaufdcimages.uflib.ufl.edu/AA/00/02/55/42/00001/Elsner...chasing the chasers 7 Application I present the current positions of tornado chasers

chasing the chasers 42

References

C. A. Doswell et all. Storm spotting and public awareness since thefirst tornado forecasts of 1948. Weather and Forecasting, 14:544–557,1999.

Elsner et all. The decreasing population bias in tornado reportsacross the central plains. Wea. Climate Soc, 5:221–232, 2013.

National Geographic. Last days of a storm chaser. National Geo-graphic, 2013.

Donald A. Norman. Living with Complexity. The MIT Press, 2010.

Jef Raskin. The Humane Interface: New Directions for Designing Interac-tive Systems. Addison-Wesley Professional, 2000.

Edzer Pebesma Roger Bivand, Virgilio Gómez-Rubio. Applied SpatialData Analysis with R. Springer, 2013.

Daniel Shiffman. Learning Processing: A Beginner’s Guide to Program-ming Images, Animation, and Interaction. Morgan Kaufmann Pub,2008.

Edward R. Tufte. Envisioning Information. Graphics Press, Cheshire,Connecticut, 1990. ISBN 0-9613921-1-8.

Edward R. Tufte. Visual Explanations. Graphics Press, Cheshire,Connecticut, 1997. ISBN 0-9613921-2-6.