nasadata

This package intends to provide a hassle-free way to access some of NASA’s open-source API’s to build applications or models.

Because the documentation seems inconsistent and there are tons of API’s, I have concentrated my efforts on three which I believe provide the best “bang for my money”.

The source package is built around these three API’s, but for the sake of clarity, i’ll group the first two into one example.

EONET Webservice

The Earth Observatory Natural Event Tracker is a Webservice that feeds curated natural “events” that are tracked by a few sources. It is somewhat unclear what exactly constitutes an “event”…

From the official docs:

The curation of events is a big component of the EONET system and while the technical details are, to an extent, straight forward, the definition of what exactly constitutes an event is fluid and daring us to be constrained. What are the contextual parameters of an event? If one curator defines a specific wildfire in Idaho as a discrete event and another defines the summer wildfire season in the Pacific Northwest as a single event, what does that mean for the end user? If an end user can filter by source/curator does that provide them with ample context for the development of their application?

We are still thinking about these issues and how to best represent them within EONET and we encourage you to get in touch with us if you have ideas or suggestions or use cases that you have developed.

However, at least this gives us an idea. An event is something like a storm, fire, drought, etc.

So, let’s imagine we want to see some action that occured a few days ago.

I’ll start with installing the package:

# install.packages("devtools")
devtools::install_github("Eflores89/nasadata")
library(nasadata)

Now, what kind of event do I want? We can query the webservice to find all of the available ones like this:

categories <- eonet_categories()
  # there are a few columns, I'll only show two...
names(categories)
# [1] "id"          "title"       "link"        "description" "layers" 
categories[,1:2]
#   id                title
#   6              Drought
#   7        Dust and Haze
#  16          Earthquakes
#   9               Floods
#  14           Landslides
#  19              Manmade
#  15     Sea and Lake Ice
#  10        Severe Storms
#  17                 Snow
#  18 Temperature Extremes
#  12            Volcanoes
#  13          Water Color
#  8            Wildfires

Who is reporting these events is probably also important, so we can see this with a similar function:

sources <- eonet_sources()
  # there are a few columns, I'll only show two...
names(sources)
# [1] "id"     "title"  "source" "link" 
sources[,1:2]
#        id                                                 title
#    CALFIRE California Department of Forestry and Fire Protection
#       CEMS               Copernicus Emergency Management Service
#         EO                                     Earth Observatory
#      GDACS         Global Disaster Alert and Coordination System
#      GLIDE                      GLobal IDEntifier Number (GLIDE)
#    InciWeb                                               InciWeb
#        IDC    International Charter on Space and Major Disasters
#        MRR                                  LANCE Rapid Response
#  NASA_ESRS            NASA Earth Science and Remote Sensing Unit
#  ReliefWeb                                             ReliefWeb
#  SIVolcano        Smithsonian Institute Global Volcanism Program
#     UNISYS                                        Unisys Weather
#   USGS_CMT  USGS Emergency Operations Collection Management Tool
#       HDDS                 USGS Hazards Data Distribution System

Now that we got this out of the way, let’s see if we can get an individual event. The earth_event() function does this in an intuitive way. I’m going to bring only the latest event reported by InciWeb:

an_event <- earth_event(status = "all", 
                        sources = "InciWeb", 
                        category_id = "all", 
                        limit = 1,
                        LimitType = "limit")
class(an_event)
# [1] "list"
names(an_event)
# "Events"     "Sources"    "Categories" "Geography"  "Meta"  

The event is a list with a few objects parsed together:

In this case, we have a fire in North Carolina…

an_event$Events$event_id
# [1] "EONET_382"
an_event$Events$event_title
# [1] "Silver Mine Fire, North Carolina"
# --- We can actually find it here:
an_event$Sources$source_url
# [1] "http://inciweb.nwcg.gov/incident/4706/"

And this is where it happened…

an_event$Geography
#$EONET_382
#                  date  type         coordinates
#1 2016-04-21T15:00:00Z Point -82.80806, 35.89028

The coordinates are of course useful because we plot the events in our favorite R package (leaflet or ggmap is really nice) or we can also use it to “feed” into the other API’s in the package. I’ll explain these next…

Imagery and Assets API’s

The Earth Imagery API (available here) let’s us access imagery that is being retrieved from Landsat 8 Satellites and stored in Google Earth Engine. From what I can see, the images are poor quality but the obvious point here is to merge them and detect large variations (for example, to track deforestation).

The Assets API is basically a helper for the Imagery API: it gives us dates of available coordinates, so that we can query the latter and retrieve the image.

Let’s see if we can see the “event” we recorded earlier…

First, I want to see if there is any images recorded in that time frame (the frecuency is roughly every 16 days).

Caveat: This API requieres an active key. It’s free and you can get it at api.nasa.gov

# coordinates of event
coord_long <- (-82.80806)
coord_lat <- 35.89028
key <- "example1234key"

# images available
images <- earth_asset(key, 
                      lon = coord_long, 
                      lat = coord_lat, 
                      start_date = "2016-03-01", 
                      end_date = "2016-04-30")
names(images)
# [1] "date"        "id"          "type"        "coordinates"
images$date
# [1] 2016-03-01T16:05:40 
# [2] 2016-03-17T16:05:35
# [3] 2016-04-02T16:05:26 
# [4] 2016-04-18T16:05:20

So, it seems we’re out of luck… The fire ocurred after the last picture taken. Nonetheless, let’s see how we can download this last image…

img <- earth_image(key, 
                  lon = coord_long, 
                  lat = coord_lat, 
                  date = "2016-04-18", plot = TRUE)
class(img)
# [1] "list"

The img object is a list consisting of two objects:

If the parameter is set to TRUE, you also get a rasterImage.

This package is still in the early stages of development, and I plan on submitting to CRAN in a few weeks, so any suggestions/improvements are very welcome at my twitter: @eflores89 or via issues in the github package repo: https://github.com/Eflores89/nasadata.