diff --git a/QuickStart.html b/QuickStart.html new file mode 100644 index 0000000..d1623a2 --- /dev/null +++ b/QuickStart.html @@ -0,0 +1,1240 @@ + + + + + + + + +QuickStart - OPeNDAP + + + + + +
+
+

1. Introduction

+
+
+

OPeNDAP is the developer of client/server +software, of the same name, that enables scientists to share data more +easily over the internet. The OPeNDAP group is also the original +developer of the Data +Access Protocol 2.0 (DAP2), and the much modern Data Access Protocol 4 (DAP4) that the software uses. Many other groups have +adopted DAP and provide compatible clients, servers, and SDKs. +OPeNDAP’s DAP is also a NASA community standard. For the rest of this +document, "OPeNDAP" will refer to the software.

+
+
+

With OPeNDAP, you can access data using an OPeNDAP URL of any database +server that supports OPeNDAP. You can do this via command-line, +Internet browser, or a custom UI. You can also use other NetCDF compliant tools, +such as PyDAP/Python, Matlab, R, IDL, IDV, and Panoply.

+
+
+ + + + + +
+
Note
+
+OPeNDAP data is, by +default, stored and transmitted in binary form. In addition to its +native data representation format, OPeNDAP can get data in the +following formats: NetCDF3 (classic), NetCDF4 (enhanced), GeoTIFF, JPEG2000, JSON, ASCII. +
+
+
+

This quick start guide covers how to use OPeNDAP in a typical web +browser, such as Firefox, Chrome, or Safari, to discover information +about data that is useful when creating database queries. For +additional information, see the OPeNDAP User Guide.

+
+
+

1.1. Key Terms

+
+
    +
  • +

    Hyrax: The server half of OPeNDAP, developed by the OPeNDAP group.

    +
  • +
  • +

    OPeNDAP URL An OPeNDAP URL is a URL that includes "opendap.org" and +enables you to access data on a database server on which OPeNDAP is implemented.

    +
  • +
  • +

    DAP (Data Access Protocol): A data transmission protocol designed +by OPeNDAP specifically for sciencific data. The protocol relies on +the widely used and stable HTTP and MIME standards and provides +data types to accommodate gridded data, relational data, and time +series, as well as allowing users to define their own data types.

    +
  • +
  • +

    Constraint Expressions (CEs): Criteria that limits/subsets what data is returned +from a remote database. Because most databases will have far more data +than you want, you’ll want to find out something out about the data +and then use that information to constrain your queries. Any subsetting as a result +to CEs takes place close to the data.

    +
  • +
  • +

    DMR (Dataset Metadata Response): This is single XML file used in the DAP4 protocol, +that provides information about the data file such as: variable names, their types, sizes, +dimensions, and many other attributes. A client that parses the DMR +can create remote Dataset objects that accurately describe the data file, +without openning nor downloding any remote data (lazy reads).

    +
  • +
  • +

    DDS (Dataset Descriptor Structure): Provides a description in the DAP2 +protocol of the "shape" of data in a database, using a vaguely C-like syntax.

    +
  • +
  • +

    DAS (Data Attribute Structure): Similar to a DDS but contains +information about the data, such as units and the name of the +variable. Used only in the DAP2 protocol.

    +
  • +
+
+
+
+
+
+

2. Which DAP Protocol should I use to access/serve data?

+
+
+
+DAP4vsDAP2 +
+
Figure 1. Differences in the data model and response types between DAP2 and DAP4.
+
+
+

There are many differences between the DAP2 and DAP4 protocol, and we refer to the +DAP4 specification for an in-depth +look at what these are. Broadly speaking, the DAP4 data model is close to a superset of +DAP2, meaning any data file that can be transmitted via the DAP2 (DODS) protocol, CAN +BE transmitted via the DAP4 protocol. And despite the fact that Grids are no longer part +of DAP4 (see Figure 1), any Array represented in the DAP2 data model +as a Grid IS represented as an Array in the DAP4 data model. However, any DAP4 dataset +that contains atomic types (e.g. an attribute or a variable) or container types that are +NOT part of the DAP2 data model (i.e. a Group), will NOT be able to be represented by the DAP2 model and the transmition via DAP2 protocol will fail.

+
+
+ + + + + +
+
Note
+
+It is possible that DAP2 protocol will transmit datasets with missing attributes, +when these attributes have atomic types beyond the scope of the DAP2 data model (e.g. Char, +Int64, etc; see Figure 1). +
+
+
+

We strongly recommend users to adopt the DAP4 Protocol. Any Hyrax data server that implements the DAP4 +protocol CAN produce DAP2 responses. This means that any existing data user with an access client API that is only compatible with the DAP2 protocol (DDS/DAS), will still be able to access data from a DAP4 implementing Hyrax data server, as long as the data file contains types within the scope of the DAP2 data model.

+
+
+
+
+

3. What to do With an OPeNDAP URL

+
+
+

Suppose someone gives you a hot tip that there is a lot of good data at…​

+
+
+
+
http://test.opendap.org:8080/opendap/atlas03/ATL03_20181228015957_13810110_003_01.h5
+
+
+
+

This URL points to Level 2 data from the Advanced Topographic Laser Altimeter (ATLAS) instrument above the Ice, Cloud, and land Elevation Satellite-2 (ICESat-2). This particular file from the ATLAS03 was created by NASA in 2021, and has over 80 Groups with many variables inside.

+
+
+

The simplest thing you can is to download the data to which the URL points or you could append .ascii and feed the URL to a regular web browser. However, the file may contain data that is too big +to perform simple exploratory analysis using any of the two mentioned approaches.

+
+
+

Another option is to use a Client API of your preference, that can parse the DMR response. Packages and applications like PyDAP, Ferret, and MATLAB, have long included support for parsing DAP responses. But this approach works best when the remote dataset has few variables, i.e. less than 5, and when the DMR is relatively small. Many datasets produced by NASA, NOAA, can have 100s of variables, with many nested Groups, which all make parsing of the DAP response slower, and it also takes long time for the Client API to parse the +DMR. Just opening such files (lazily) can be huge bottleneck for many users, even more when attempting to read multiple files in parallel, each file with 100s of variables.

+
+
+

Instead, OPeNDAP has long supported METADATA inspection of remote datasets via +Data Request Forms.

+
+
+ + + + + +
+
Note
+
+Because you will rarely want to request an entire archive, +OPeNDAP provides sophisticated sub-sampling capabilities, and you need +to know something about the data in order to use them. +
+
+
+

3.1. An Easy Way: Using the Browser-Based OPeNDAP Server Dataset Request Form

+
+

OPeNDAP includes a way to sample data that makes writing a constraint +expression somewhat easier than using only a URL to do the same thing. +Append .dmr.html to an OPeNDAP URL, and you will get an OPeNDAP Server +DAP4 Dataset Request Form that simplifies the process for sampling data.

+
+
+
+DRF ATLAS03 +
+
Figure 2. DAP4 Data Request form for the dataset (to see the Request Form, click here)
+
+
+

The OPeNDAP Server DAP4 Dataset Request Form has four main sections. To learn more about the +basic Data Request form go to OPeNDAP Website Resource.

+
+
+

The DAP4 Request Form allows one to inspect the entire dataset, all variables, its medatada, +their size, and importantly it can allow users to subset the dataset close to the data. +OPeNDAP servers are specialized in subsetting close to the data, and the subsetting can be done +in two different ways:

+
+
+
    +
  1. +

    Reduce the number of variables (less variables)

    +
  2. +
  3. +

    Reduce the size of variables (spatial subset)

    +
  4. +
+
+
+

Together, these can greatly speed up the response and significantly reduce the amount of time + a Client API spends parsing the DMR to represent the dataset for exploration.

+
+
+

The DAP4 Request Form has an interactive feature to build a new URL that represents the +subset dataset. For example, consider that you are only interested in plotting one of the track +as s function of time. Say Data within the Group gt3r, and within it the time, longitude and +latitude within the heights subgroup. You check the boxes related the three variables +of interest, with their following Fully Qualifying Names

+
+
+
+
/gt3r/heights/delta_time
+/gt3r/heights/lat_ph
+/gt3r/heights/lon_ph
+
+
+
+

And the resulting URL on the DataURL box becomes:

+
+
+
+
dataURL + ?dap4.ce=/gt3r/heights/delta_time;/gt3r/heights/lat_ph;/gt3r/heights/lon_ph
+
+
+
+

The URL above is the original URL plus a Constraint Expression (CE). You can pass that URL +to a client API (like PyDAP) and it will request from Hyrax the (much reduced) DMR associated only +with these three variables.

+
+
+

The OPeNDAP Server Dataset Request Form works for sequence data as well +as grids. However, since sequence constraint expressions look +different from grid expressions, the form also looks slightly +different. The variable selection boxes allow you to enter relational +expressions for each variable. Apart from that, the function is +exactly the same.

+
+
+
+Gsodock html +
+
+
+

Click here to see +a live "sequence" form. Click the checkboxes to choose which data +types you want returned, and then add constraint expressions as desired. +The data file contains a day’s record of changing water properties off +a dock in Rhode Island. If you click the Depth and Time boxes (as in +the figure), you will get a record of the tide going in and out twice. You +can add conditions by entering values in the text boxes. See what you +get when you limit the selection to records where the Depth is greater +than 2 meters.

+
+
+
+

3.2. A More Flexible Way: Using Commands in a Browser

+
+

If you would prefer to not use the OPeNDAP Server Data Access Form, +you can use just a browser instead. This section describes how to do +that.

+
+
+

OPeNDAP has sophisticated methods for subsampling data at a remote +site, but you need some information about the data first. First, we +will look at data’s DMR. This provides a description of the "shape" of the data, +types, and attributes. You get a dataset’s DMR by appending .dmr.xml to the URL, +which is an xml document.

+
+
+

For example, consider the much simpler Reynolds Dataset from NOAA, describing mean sea surface temperature. Click +here to see +an example of an OPeNDAP DMR for the REYNOLDS Dataset +at sst.mnmean.nc.gz.dmr.xml. The (collapsed) DMR looks like this:

+
+
+
+Reynolds dmr +
+
Figure 3. XML browser view the DMR of the Reynolds Dataset.
+
+
+ + + + + +
+
Note
+
+The xml is a interactive document that allows to click and collapse the information on the DMR. Figure 3 has all the nodes associated with Attributes collapsed. +
+
+
+

From the sst.mnmean.nc.gz DMR in Figure 3, you can see that the dataset consists of:

+
+
+
    +
  • +

    Dataset declaration.

    +
  • +
  • +

    Dimensions declaration by their name and size

    +
  • +
  • +

    Numeric types of the Array data with appropriate Dimension and Attribute declarations in their nodes (not visible on Figure 3).

    +
  • +
  • +

    Global Attributes declaration.

    +
  • +
+
+
+

The DMR in Figure 3 broadly allows another interactive inspection +of a remote dataset.

+
+
+

Note that the same dataset can be represented by the same DAP4 server as a Grid by adding +a .dds at the end of the URL

+
+
+
+Reynolds dds +
+
Figure 4. DDS representing a Grid Array not part of the DAP4 protocol, by a DAP4 enabled server.
+
+
+

Continuing with the DMR, we can inspect the response to a URL with a Constraint Expression. +This allows us to quickly verify that the resulting DMR represents only the data we +are interesed. For example, say we are only interested in sea surface temperature (sst). +The URL with the constraint expression, along with the added .dmr.xml is:

+
+
+
+
http://test.opendap.org/dap/data/nc/sst.mnmean.nc.gz.dmr.xml?dap4.ce=/sst
+
+
+
+

This URL on a browser results in the DMR shown in Figure 4.

+
+
+
+Reynolds dmr sst +
+
Figure 5. DMR showing only the variable sst and the attributes of the dataset.
+
+
+

A savvy User can now use the client API along with the above Constrained URL, to speed up their +exploration and analysis.

+
+
+

Lastly, going back to the original ATLAS03 dataset with over 80 Groups, and many more variables +referenced in Figure 2, the CE to discard all variables except delta_time, lon_ph and lat_ph from the responsed, yields the following (XML) DMR

+
+
+
+ATLAS03 ConstrainedDMR +
+
Figure 6. DMR showing 3 variables inside the nested Group hierarcy /gt3r/heights/.
+
+
+

A Client API such as will parse much faster such response, as compared to the original dataset.

+
+
+

To learn more about Constraint Expressions on the DAP4 data model, check out the +DAP4 specification

+
+
+

3.2.1. Peeking at Data

+
+

Now that we know a little about the shape of the data and the data +attributes, we will look at some of the data.

+
+
+

You can request a piece of an array with subscripts, just like in a C +program, Matlab, or many other computer languages. Use a colon to +indicate a subscript range. For example, +http://test.opendap.org/dap/data/nc/sst.mnmean.nc.gz.ascii?time[0:6] +will produce a time vector that looks like this:

+
+
+
+Reynolds time vector +
+
+
+

If you are interested in the Reynolds dataset, you are probably more +interested in the sea surface temperature data than the dependent +variable vectors. The temperature data is a three-dimensional grid. To +sample the sst grid, you just add a dimension for time: +"…​sst/mnmean.nc.ascii?sst[0:1][13:16][103:105]". Click +here +to see this example in action. You will see something like this:

+
+
+
+Reynolds sst +
+
+
+

Notice that when you ask for part of an OPeNDAP grid, you get the array +part along with the corresponding parts of the map vectors.

+
+
+

One potentially confusing thing about our request is that we requested +the time, latitude, and longitude by their position in the map vectors, +but in the returned information they are referenced by their values. +That is, we asked for the 0th and 1st time values, but these are 19723 +and 19754. We also asked for the 103rd, 104th, and 105th longitude +values, but these are 206, 208, and 210 degrees, respectively. The value +434 in the return can be referenced as "…​sst/mnmean.nc.ascii?sst[1][15][103]". Click here to see this in action.

+
+
+

Note that the sst values are in Celsius degrees multiplied by 100, as +indicated by the scale_factor attribute of the +DAS. Further, +it’s important to remember that with this dataset the data were +obtained by calculating spatial and temporal means. Consequently, the +data points in the sst array should be ignored when the value is the +missing data flag (32767) as these pixels are probably coincident with +land (although there can be other reasons for missing data).

+
+
+
Server Functions: Looking at Geo-Referenced Data Using Hyrax
+
+

There are a number of different DAP servers that have been developed by +different organizations. Hyrax, the DAP server developed by the OPeNDAP +group, supports access to geo-referenced data using lat/lon coordinates. +You probably noticed that the array and grid indexes used so far are not +very intuitive. You can see the data are global and are indexed by +latitude and longitude, but in the previous example we first looked at +the lat and lon vectors, saw which indexes corresponded to which +real-world locations, and then made our accesses using those indexes.

+
+
+

Hyrax supports a small set of functions which can perform these +look-up operations for you. For example, we could rewrite the example +above like this: +"…​sst/mnmean.nc.gz.ascii?geogrid(sst,62,206,56,210,"19722<time<19755")". +Click +here +to see this in action. The results look like this:

+
+
+
+Reynolds sst geogrid +
+
+
+

The Syntax for geogrid() is: "geogrid(grid variable, upper latitude, left longitude, lower latitude, +right longitude, other expressions)", where other expressions must be enclosed in double quotes, and can be one of these forms:

+
+
+
    +
  • +

    variable relop value

    +
  • +
  • +

    value relop variable

    +
  • +
  • +

    value relop variable relop value

    +
  • +
+
+
+

Relop stands for one of the relational operators: <,>,⇐,>=,=,!=. +Value stands for a numeric constant, and Variable must be the name +of one of the grid dimensions. You can use multiple clauses by +separating them with commas, but each clause must be surrounded by +double quotes. For example, the following is yet another way to get the +same return data as the above example:

+
+ +
+

You can figure out which functions are supported by Hyrax by calling +the server function +version(). +This will return an XML document that shows each registered function and +its version.

+
+
+

To find out how to call each function, you can call it with an empty +parameter list and get some documentation for that function. For +example, try +…​?geogrid().

+
+
+ + + + + +
+
Note
+
+Other severs, such as ERDAP, support alternative ways of doing similar operations. +
+
+
+
+
Creating Server Function Pipelines
+
+

Server functions can be composed to form pipelines, feeding the value of +one function to another. Since the values in this data set are scaled up +by a factor of 100, we can use the linear_scale() function to scale +the result using…​

+
+
+
+
y = mx + b
+
+
+
+

…​where m is the scale factor and b offset. The linear_scale() +function syntax is:

+
+
+
    +
  • +

    linear_scale(variable, scale factor, offset)

    +
  • +
  • +

    linear_scale(variable)

    +
  • +
+
+
+

Use the first form when you want to specify m and b explicitly or +the second form when Hyrax can guess the values using data set metadata. +(Note: You will get an error if the server cannot figure out value to use). For example,

+
+
+

…​nc.gz.ascii?linear_scale(geogrid(sst produces the following:

+
+
+
+Reynolds sst linear scale geogrid +
+
+
+
+
+

3.2.2. Working With Sequence Data

+
+

Gridded data works well for satellite images, model data, and data +compilations such as the Reynolds data we have just looked at. Other data, +such as data measured at a specific site, are not so readily stored in +that form. OPeNDAP provides a data type called a "sequence" to store this +kind of data.

+
+
+

A sequence can be thought of as a relational data table, with each +column representing a different data variable, and each row representing +a different measurement of a set of values (also called an "instance"). +For example, an ocean temperature profile can be stored as a Sequence +with two columns: pressure and temperature. Each measurement is a +pressure and a temperature and is contained in one row. A weather +station’s data can be stored as a sequence with time in one column and +each weather variable in another column. You can find a good example of a sequence at http://test.opendap.org/dap/data/ff/gsodock.dat

+
+
+

This is a 24-hour record of measurements at a weather station on a dock +in Rhode Island. Each record consists of a dozen different variables, +including air temperature, wind speed, and direction, as well as depth, +temperature, and water salinity The data is arranged into 144 +measurements of each of the twelve variables.

+
+
+

Ask for the DDS, and you will see the twelve variables, all contained in a Sequence called URI_GSO-Dock:

+
+
+
+Gsodock dds +
+
+
+

The DAS contains the units for each data type and some additional information:

+
+
+
+Gsodock das +
+
+
+

To select the data you want from a server, use a constraint +expression, just as you did with the gridded data above. Now, though, +the constraint contains two kinds of clauses. One is a list of +variables you wish to have returned (the projection clause), +and the other is the conditions under which they should be returned +(the selection clause). For example, if you want to see salinity +data read after noon that day, try this:

+
+ +
+

Selection clauses can be stacked endlessly against a projection clause, +allowing all the flexibility most people need to sample data files. +Here is an example of applying two conditions:

+
+ +
+

Try it yourself with three or four conditions or more.

+
+
+
+
+
+
+

4. Finding OPeNDAP URLs

+
+
+

Data often comes in the form of a URL enclosed in an email message, +and there are several other ways to find data served by OPeNDAP +servers.

+
+
+

4.1. Google

+
+

Use Google to search for 'OPeNDAP Hyrax' or to search for 'OPeNDAP <terms>' or 'Hyrax <terms>'. For example, Google OPeNDAP sea surface temperature.

+
+
+
+

4.2. GCMD

+
+

The Global Change Master Directory provides +a huge amount of earth science data and catalogs OPeNDAP URLs for the +datasets that have them. You can search on "OPeNDAP" from the main +page to find many of these datasets.

+
+
+

If you make that search, check the list for the Reynolds data; it should be there.

+
+
+
+

4.3. Web Interface

+
+

Many sites that serve one OPeNDAP dataset also serve others. The +OPeNDAP web interface (if it is enabled by the site) allows you to +check the directory structure for other datasets. For example, we will +look at the Reynolds data we saw previously: +http://test.opendap.org/dap/data/nc/sst.mnmean.nc.gz.html

+
+
+

If we use the same URL, but without the file name at the end, we can +browse the directory of data: http://test.opendap.org/dap/data/nc/

+
+
+

The OPeNDAP server checks to see whether the URL is a directory, and if +it is, it generates a directory listing, like this:

+
+
+
+Test.oopendap.org directory view +
+
+
+

You can see from the directory listing that the monthly mean dataset +that we have been looking at is accompanied by a host of other datasets. The +site you are looking at is our test data sit. We use these datasets to +run many of our nightly tests. All of the files in the the /data/nc +directory are stored in NetCDF files; other directories under /data +hold data stored in other file types.

+
+
+ + + + + +
+
Note
+
+In general, this list is produced by an OPeNDAP server and +this feature works on all servers. However, it only really understands +OPeNDAP data files, so other file types will simply be sent without +any interpretation. This can be useful if the 'other file' happens to +be a README or other documentation file since this makes it simple to +serve data stored in files and documented using plain text files. +Essentially, the person or organization providing data does not need +to do anything besides installing the server (Hyrax). +
+
+
+
+
+
+

5. Further Analysis

+
+
+

This guide is about forming an OPeNDAP URL. After you have figured out +how to request the data, there are a variety of things you can do with +it. (OPeNDAP software mentioned here is available from the +OPeNDAP Home Page.)

+
+
+
    +
  • +

    Use a generic web client like geturl (a standard part of the +OPeNDAP software) or free programs such as +wget, curl +or Chrome to download data into a local data file. To be able to use +the data further, you will probably want to download the data using +one of alternative response types like the ASCII version (by using the +.ascii suffix on the URL, as in the examples shown above) or +GeoTIFF, NetCDF3, Jpeg2000, etc., using the suffix appropriate for +those formats.

    +
  • +
  • +

    Any tool that uses the Java- or C-NetCDF API will work with OPeNDAP. +For example, Matlab has built-in support for OPeNDAP; Matlab supported +NetCDF calls can be used with DAP datasets. Other tools that are built +on NetCDF API also read data from OPeNDAP servers. A free tool similar +to Matlab, GNU Octave, is also +supported. The R Project for Statistical +Computing can also read data from OPeNDAP servers. The +Ferret and +GrADS free data analysis packages both +support OPeNDAP. You can use these for down loading OPeNDAP data and +for examining it afterwards. (There are limitations. For example, +Ferret may not be able to read datasets served as Sequence data.)

    +
  • +
+
+
+ + + + + +
+
Note
+
+For information about NetCDF compliant tools, see the NetCDF Compliant Tools in the User Guide. +
+
+
+
    +
  • +

    Other tools, that are Java NetCDF compliant, also function with +OPeNDAP clients; for example, +IDV and +Panoply.

    +
  • +
  • +

    If you have written a C NetCDF or Java NetCDF compliant data +analysis program, you can probably read data from OPeNDAP servers.

    +
  • +
+
+
+

The use of these clients, like the ways in which you can analyze the +data you find, is beyond the scope of this document.

+
+
+
+
+ + + \ No newline at end of file diff --git a/QuickStart.pdf b/QuickStart.pdf new file mode 100644 index 0000000..bf48c8d Binary files /dev/null and b/QuickStart.pdf differ diff --git a/README.pdf b/README.pdf new file mode 100644 index 0000000..4b68a0c Binary files /dev/null and b/README.pdf differ diff --git a/UserGuideComprehensive.html b/UserGuideComprehensive.html new file mode 100644 index 0000000..e7427fc --- /dev/null +++ b/UserGuideComprehensive.html @@ -0,0 +1,3503 @@ + + + + + + + + +User Guide - OPeNDAP Documentation + + + + + +
+
+

1. About This Guide

+
+
+

This guide introduces important concepts behind the OPeNDAP data +model and Web API as well as the clients and servers that +use them. While it is not a reference for any particular client or server, you will find links to particular clients and servers in it.

+
+
+
+
+

2. What is OPeNDAP

+
+
+

OPeNDAP provides a way for researchers to access scientific data +anywhere on the Internet, from a wide variety of new and existing +programs.

+
+
+

It is used widely in earth-science research settings but it is not limited to that. Using a flexible data model and a well-defined transmission format, an OPeNDAP client can request data from a wide variety of OPeNDAP servers, allowing researchers to enjoy flexibility similar to the flexibility of the web.

+
+
+ + + + + +
+
Note
+
+There are different implementations of OPeNDAP produced by various open source organizations. This guide covers the implementation of OPeNDAP produced by the OPeNDAP group. +
+
+
+

The OPeNDAP architecture uses a client/server model, with a client +that sends requests for data out onto the network to a server, +that answers with the requested data. This is the same model used by +the World Wide Web, +where client browsers submit requests to web servers for the data that +compose web pages. Using flexible, general-purpose data types +that can easily represent scientific data, OPeNDAP servers deliver real data +directly to client programs in the format needed by that client. In addition to the OPeNDAP data encoding, our server can return data in the following formats: NetCDF, GeoTIFF, JPEG2000, JSON, ASCII.

+
+
+

OPeNDAP clients are very specialized browsers, constructed in one of two ways: +either (1) by linking new or existing data analysis programs with +OPeNDAP-enabled versions of the data +access APIs they use, or (2) by modifying programs to use one of the +OPeNDAP data access APIs. In addition to providing a sophisticated set +of network-compatible APIs in several languages, there are also +libraries of legacy APIs available in OPeNDAP-aware versions; for example, the +popular NetCDF +library can read data from remote OPeNDAP data sources as +easily as it reads from a local file.

+
+
+

To expand the universe of data available to a user, OPeNDAP incorporates +a powerful data translation facility. Data may be stored in data +structures and formats that are defined by the data provider, yet it +can be accessed by users with the ease that they access local data files +on their own systems. +Although there are limitations on the types of data that may be translated (see +Translating Data Models in this guide), the facility +is flexible and general enough to handle many translations. The upshot of this is:

+
+
+
    +
  • +

    Users may not need to know that data from one set are stored in a +format different from data in another set. Also, it may be possible +that neither data set is stored in a format readable by the +data analysis and display program that they use.

    +
  • +
  • +

    No OPeNDAP user will be cut off from accessing +data because of its storage format. Scientist who wants to make their +data available to other OPeNDAP users may do so while keeping +that data in what may be a highly idiosyncratic format.

    +
  • +
+
+
+

The combination of the OPeNDAP network communication model and the data +translation facility make OPeNDAP a powerful tool for the retrieval, +sampling, and display of large distributed datasets. Although OPeNDAP was +developed by oceanographers, its application is not limited to +oceanographic data. The organizing principles and algorithms may be +applied to many other fields.

+
+
+

The uniformity of the data’s appearance makes the system useful +for data analysis and also enables one to automate data transport and manipulation +tasks. For example, NOAA’s +Live Access Server (LAS) +uses OPeNDAP, as do many of the real-time observing systems that make up the +Integrated Ocean Observing System (IOOS), such as the +Gulf of Maine Ocean Observing System (GoMOOS).

+
+
+

Users who are interested in OPeNDAP may be divided into data consumers +and data providers (roles that are often assumed by the same +scientists). The remainder of this guide is organized around this distinction +between classes of users.

+
+
+

2.1. The OPeNDAP Client/Server

+
+

OPeNDAP uses a client/server model. The OPeNDAP servers are web servers +equipped to interpret an OPeNDAP URL sent to them. An OPeNDAP client +composes and sends messages to those servers. There are standalone +OPeNDAP clients, but most clients are constructed from data analysis +programs that are modified to get their data remotely, from the internet, rather +than locally, from a file.

+
+
+

Without OPeNDAP, a program that uses one of the common data +access APIs (such as NetCDF) operates as shown in +The Architecture of a Data Analysis Package figure, shown below. Here is how it works: +The user makes a request for data from the program; the program uses a +data access API to read and write data; the program uses procedures +defined by that API to access the data, which is typically stored on the +same host machine. Some APIs are somewhat more sophisticated than this, but their general operation is similar.

+
+
+
+Unlinked +
+
Figure 1. The Architecture of a Data Analysis Package
+
+
+

The operation of an OPeNDAP client is illustrated in the The Architecture of a Data Analysis Package Using OPeNDAP figure, shown below. Here, the same program that was used in The Architecture of a Data Analysis Package +figure (above) has been modified to use one of the OPeNDAP API libraries. +Now, in addition to being able to use local data as before, the program is able to access data from OPeNDAP servers anywhere on the internet just as it would local data.

+
+
+

To make any analysis program into an OPeNDAP client, it just needs to be linked with the OPeNDAP API library. (Or, if your program uses one of the +supported legacy API libraries, like NetCDF, you can link with the +OPeNDAP version of that library.) This will create a program that +accepts URLs as well as file pathnames to identify needed data. (See OPeNDAP Client in this guide).

+
+
+
+Linked +
+
Figure 2. The Architecture of a Data Analysis Package Using OPeNDAP
+
+
+

OPeNDAP also provides data translation functionality. Data from the +original data file is translated by the OPeNDAP server into the OPeNDAP +data model for transmission to the client. Upon receiving the data, the +client translates the data into the +Data Model it understands. Because +the data transmitted from an OPeNDAP server to the client travel in the +OPeNDAP format, the dataset’s original storage format is completely +irrelevant to the client. For example, if the client was originally designed to read +NetCDF format files, the data returned by the OPeNDAP-enabled NetCDF library +will appear to have been read from a NetCDF file. Similarly, if the program uses C, Python, Java or JavaScript there are OPeNDAP API libraries that will enable it to directly access data. Finally, if a program can read data from files using any of the server’s supported format, it is easy to use the OPeNDAP server to send you data in a file and use that just like any other local data file.

+
+
+

OPeNDAP does not claim to remove all of the overhead of data searches. A +user will still have to keep track of the URLs of interesting data in +the same way a user must now keep track of the names of files. (You may +run across datasets where the data consists of OPeNDAP URLs. These are +the OPeNDAP file servers and have been developed by OPeNDAP users to +organize datasets consisting of large numbers of individual files.) But +OPeNDAP does make the access to that data simpler and quicker.

+
+
+

The OPeNDAP group provides a whole array of client software to implement +this communication standard. These range from standalone clients to +libraries to link with existing software. In addition, a community of like-minded software developers and data users has built compatible software that extends the software we offer in many new directions.

+
+
+
+

2.2. OPeNDAP Services

+
+

The communication between an OPeNDAP client and server is specified by +the DAP. This defines the range of messages a +server must understand and the kinds of replies it makes.

+
+
+

There are two categories of messages that an OPeNDAP server can understand. +Some are required by the DAP and others are merely suggested. A server +is considered to be DAP-compliant if it can respond intelligibly to the +required messages. Following are the requests messages a server is required to understand:

+
+
+
+
Data Description
+
+

Data values come in types and sizes. An array, for example, might consist of 10 integers. The value "ten" and the type "integer" describe the array. This request returns information about data types, so that a receiving program can allocate space appropriately. See Data Description Structure (DDS) in this guide.

+
+
Data Attribute
+
+

This is a request to provide information about data and typically includes information like units, names of data types, reference information and so on. See Data Attribute Structure (DAS) in this guide.

+
+
Data
+
+

The server also must be able to respond to a request for the data itself. See Data Description Structure (DDS) in this guide.

+
+
+
+
+

In addition, a server may respond to requests like these:

+
+
+
+
ASCII
+
+

Some servers can convert data to ASCII values on the fly. This allows users to view data using a standard web browser, assuming the data are not too large. See ASCII Service in this guide.

+
+
Info
+
+

The info response is a formatted page containing information from the Data Attributes and Data Description responses. It is meant to be a human-readable means to show what is available in a dataset via a standard web browser. See Info Service in this guide.

+
+
HTML
+
+

Very similar to the info response, the HTML response provides the information from the info response and also includes a JavaScript form to help you build a request for data from the same data file. The best description of the HTML form is in the Quick Start Guide.

+
+
SOAP
+
+

While existing SOAP queries may continue to work, SOAP is has been deprecated and is not actively suppored by OPeNDAP servers.

+
+
DDX
+
+

The DDX is an XML version of the Data Attribute and Data Description replies. See DDX in this guide.

+
+
+
+
+
+

2.3. The OPeNDAP Server (aka "Hyrax")

+
+

OPeNDAP provides a definition of the communication between client and +server and enables servers and clients that conform to DAP standard to communicate +with each other. In addition to the DAP communication standard +itself, the OPeNDAP group also provides an implementation of a +standard server protocol, called _Hyrax.

+
+
+

For most data consumers, the architecture of Hyrax is not important +since they see only its web interface (through a browser or by pasting +URLs into an application). Hyrax is actually made up of two pieces. You can think of them +as a front-end and a back-end, though a client will not be aware of the +separation. They will often be run on the same machine, and even when +they are not, a client will see only the front end.

+
+
+
    +
  • +

    The front-end server is a Tomcat servlet and is also called the +OPeNDAP Lightweight Front-End Servlet (OLFS). Its job is to receive +your request for data and manage all the different forms a request +might take. For example, you might be asking for the data, an ASCII +version of the data, or a reply to a SOAP message looking for data. The +front-end server can also reply to THREDDS catalog requests, for +information about the data, and can directly provide some information +about the data, too.

    +
  • +
  • +

    The Back-End Server (BES) is more strictly about performance and is +designed to respond quickly and efficiently to requests from the OLFS.

    +
  • +
+
+
+ + + + + +
+
Note
+
+Most users will not make requests directly to the BES. +
+
+
+

See Data Model in this guide for a description +of the data returned by requests and see +OPeNDAP Server in this guide for a description of +the URL syntax used to send requests.

+
+
+

Go to the OPeNDAP 4 Data Server documentation for +a description of how to install and configure an OPeNDAP data server +("Hyrax").

+
+
+
+

2.4. Administration and Centralization of Data

+
+

Under OPeNDAP, there is no central archive of data. Data under OPeNDAP +is organized similar to the World Wide Web. To make your data accessable, all that you need to do is to start up a properly +configured server on an Internet node that has access to the data to be +served. Data providers are free to join and to leave the system as doing so is convenient, just as any proprietor of a web page is free to delete it or add to it as needed.

+
+
+

Similar to the World Wide Web, there are some +disadvantages to the lack of central authority. If no one knows about a +web site, no one will visit it. Similarly, listing a dataset metadata in a +central data catalog, such as the International Directory Network (IDN), can make data available to other researchers in a way that simply configuring an OPeNDAP server would not. You can contact the IDN and submit +your server to their catalog.

+
+
+

The remainder of this section will be divided into three sections:

+
+
+
    +
  • +

    Instructions on the building and operating of OPeNDAP clients

    +
  • +
  • +

    A tutorial and reference on running OPeNDAP servers and making data +available to OPeNDAP clients

    +
  • +
  • +

    A technical documentation describing the +implementation details (and the motivation behind many of the design +decisions) of the OPeNDAP software.

    +
  • +
+
+
+
+
+
+

3. OPeNDAP Data Model

+
+
+

This section provides a review of the data types OPeNDAP sends between +client and server and issues involved in translating one to another. +This information may be useful to researchers who will be using +OPeNDAP to transfer data.

+
+
+

3.1. Data and Data Models

+
+

Basic to the operation of OPeNDAP is its data model and the set of +messages that define the communication between client and server. This +section presents the data model (the next section presents the messages).

+
+
+

3.1.1. Data Models

+
+

Any data set is made up of data and a data model. The data model defines +the type and arrangement of data values and may be thought of as an +abstract representation of the relationship between one data value and +another. Although it may seem paradoxical, it is precisely this +relationship that defines the meaning of a number. Without the +context provided by a data model, a number does not represent anything. +For example, within some data set, it may be apparent that a number +represents the value of temperature at some point in space and time. +Without its neighboring temperature measurements, and without the +latitude, longitude, height (or depth), and time, the same number is meaningless.

+
+
+

As the model only defines an abstract set of relationships, two data +sets containing different data may share the same data model. For +example, the data produced by two different measurements with the same +instrument will use the same data model, though the values of the data +are different. Sometimes two models may be equivalent. For example, an +XBT (eXpendable BathyThermograph) measures a time series of temperature +near the surface of the ocean, but is usually stored as a series of +temperature and depth measurements. The temperature vs. time model of +the original data is equivalent to the temperature vs. depth model of +the stored data.

+
+
+

In a computational sense, a data model may be considered to be the data +type or collection of data types used to represent that data. A +temperature measurement might occur as half an entry in a sequence of +temperature and depth pairs. However the data model also includes the +scalar latitude, longitude, and date that identify the time and place +where the temperature measurements were taken. Thus the data set might +be represented in a C-like syntax like this:

+
+
+
Example Data Description of XBT Station
+
+
Dataset {
+   Float64 lat;
+   Float64 lon;
+   Int32 minutes;
+   Int32 day;
+   Int32 year;
+   Sequence {
+      Float64 depth;
+      Float64 temperature;
+   } cast;
+} xbt-station;
+
+
+
+

The above example describes a data set that contains all the data from +a single XBT. The data set is called xbt-station and contains +floating-point representations of the latitude and longitude of the +station and three integers that specify when the XBT measurements +were made. The xbt-station contains a single sequence (called cast) of +measurements, which are represented here as values for depth and temperature.

+
+
+

A slightly different data model representing the same data might look like this:

+
+
+
Example Data Description of XBT Station Using Structures
+
+
Dataset {
+   Structure {
+      Float64 lat;
+      Float64 lon;
+   } location;
+   Structure {
+      Int32 minutes;
+      Int32 day;
+      Int32 year;
+   } time;
+   Sequence {
+      Float64 depth;
+      Float64 temperature;
+   } cast;
+} xbt-station;
+
+
+
+

In this example, some of the data have been grouped, implying a +relation between them. The nature of the relationship is not defined, +but it is clear that lat and lon are both components of location and +that each measurement in the cast sequence is made up of depth and temperature values.

+
+
+

In these two examples, meaning was added to the data set only by +providing a more refined context for the data values. No other data was +added, but the second example can be said to contain more +information than the first one.

+
+
+

These two examples are refinements of the same basic arrangement of +data. However, there is nothing that says that a completely different +data model can not be just as useful or just as accurate. For example, the +depth and temperature data, instead of being represented by a sequence +of pairs could be represented by a pair of sequences or arrays:

+
+
+
Example Data Description of XBT Station Using Arrays
+
+
Dataset {
+   Structure {
+      Float64 lat;
+      Float64 lon;
+   } location;
+   Structure {
+      Int32 minutes;
+      Int32 day;
+      Int32 year;
+   } time;
+   Float64 depth[500];
+   Float64 temperature[500];
+} xbt-station;
+
+
+
+

The relationship between the depth and temperature variables is no +longer quite as clear, but depending on what sort of processing is +intended, the loss may be unimportant.

+
+
+

The choice of a computational data model to contain a data set +depends in many cases on the whims and preferences of the user as well +as on the data analysis software to be used. Several different data +models may be equally useful for a given task and not all data models will contain the same quantity of informaiton.

+
+
+

Note that with a carefully chosen set of data type constructors, such as +those we have used in the preceding examples, a user can implement an +infinite number of data models. The examples above use the OPeNDAP DDS format, which will become important +in later discussions of the details of the OPeNDAP DAP. +The precise details of the DDS syntax are described in the DDS section of this guide.

+
+
+
Data Models and APIs
+
+

A data access Application Program Interface (API) is a library of +functions designed to be used by a computer program to read, write, and +sample data. Any given data access API can be said to implicitly define a data model. (Or, at least, it will define restrictions on the data model.) That is, the functions that compose the API accept and return data using a certain collection of computational data types: multi-dimensional arrays might be required for some data, scalars for +others, and sequences for others. This collection of data types and their +use constitute the data model represented by that API. (Or data +models—there is no reason an API cannot accommodate several different +models.)

+
+
+
+
Translating Data Models
+
+

The problem of data model translation is central to the implementation +of OPeNDAP. With an effective data translator, an OPeNDAP program +originally designed to read netCDF data can have some access to data +sets that use an incompatible data model, such as an SQL database.

+
+
+

In general, it is not possible to define an algorithm that will +translate data from any model to any other model without losing information +defined by the position of data values or the relations between them. +Some of these incompatibilities are obvious. For example, a data model designed for +time series data may not be able to accommodate multi-dimensional +arrays. Others are more subtle. For example, a Sequence looks very +similar to a collection of Arrays in many respects, but this does not +mean they can always be translated from one to the other. For example, +some APIs return only one Sequence "instance" at a time. This means that +even if a Sequence of sets of three numbers is more or less the same +shape as three parallel Arrays, it will be very difficult to model the +one kind of behavior on the other kind of API.

+
+
+

However, even though the general problem is not solvable, there are many +useful translations that can be done and there are many others that are +still useful despite their inherent information loss.

+
+
+

For example, consider a relational structure below, which contains two nested +Sequences. The outer sequence represents all the XBT drops in a cruise; the inner sequence represents each XBT drop.

+
+
+
Example Data Description of XBT Cruise
+
+
Dataset {
+   Sequence {
+      Int32 id;
+      Float64 latitude;
+      Float64 longitude;
+      Sequence {
+         Float64 depth;
+         Float64 temperature;
+      } xbt_drop;
+   } station;
+} cruise;
+
+
+
+

Note that each entry in the cruise sequence is composed of a tuple of +data values (one of which is itself a sequence). Were we to arrange +these data values as a table, they might look like this:

+
+
+
+
id   lat   lon   depth  temp
+1   10.8   60.8    0     70
+                  10     46
+                  20     34
+2   11.2   61.0    0     71
+                  10     45
+                  20     34
+3   11.6   61.2    0     69
+                  10     47
+                  20     34
+
+
+
+

This can be made into an array, although doing so introduces redundancy:

+
+
+
+
id   lat   lon   depth  temp
+1   10.8   60.8    0     70
+1   10.8   60.8   10     46
+1   10.8   60.8   20     34
+2   11.2   61.0    0     71
+2   11.2   61.0   10     45
+2   11.2   61.0   20     34
+3   11.6   61.2    0     69
+3   11.6   61.2   10     47
+3   11.6   61.2   20     34
+
+
+
+

The data is now in a form that may be read by an API such as netCDF. However, +consider the analysis stage. Suppose a user wants to see graphs of each +station’s data. It is not obvious simply from the arrangement of the +array where one station stops and the next one begins. Analyzing data in +this format is not a function likely to be accommodated by a program +that uses the netCDF API, even though it is theoretically possible to +implement.

+
+
+
+
+

3.1.2. Data Access Protocol (DAP)

+
+

The OPeNDAP DAP defines how an OPeNDAP client and +an OPeNDAP server communicate with one another to pass data from the +server to the client. The job of the functions in the OPeNDAP client +library is to translate data from the DAP into the form expected by the +data access API for which the OPeNDAP library is substituting. The job +of an OPeNDAP server is to translate data stored on a disk (in whatever +format they happen to be stored in) to the DAP for transmission to the +client.

+
+
+
DAP Components
+

The DAP consists of several components:

+
+
+
    +
  1. +

    An "intermediate data representation" for data sets. This is used to +transport data from the remote source to the client. The data types that +make up this representation may be thought of as the OPeNDAP data model.

    +
  2. +
  3. +

    A format for the "ancillary data" needed to translate a data set +into the intermediate representation and to translate the intermediate +representation into the target data model. The ancillary data in turn +consists of two pieces:

    +
    +
      +
    • +

      A description of the shape and size of the various data types stored +in some given data set. This is called the (DDS).

      +
    • +
    • +

      Capsule descriptions of some of the properties of the data stored in +some given data set. This is called the DAS.

      +
    • +
    +
    +
  4. +
  5. +

    A "procedure" for retrieving data and ancillary data from remote +platforms.

    +
  6. +
  7. +

    An "API" consisting of OPeNDAP classes and data access calls +designed to implement the protocol,

    +
  8. +
+
+
+

The intermediate data representation and the ancillary data formats are +introduced in the OPeNDAP +Messages section of this guide, as are the steps of the procedure. The actual details of the +software used to implement these formats and procedures is a subject of +the documentation of the respective software.

+
+
+
+

3.1.3. Data Representation

+
+

There are many popular data storage formats, and many more than that in +use. When these formats are optimized, they are optimized for data +storage and are not generally suitable for data transmission. In order +to transmit data over the Internet, OPeNDAP must translate the data +model used by a particular storage format into the data model used for +transmission.

+
+
+

If the data model for transmission is defined to be general enough to +encompass the abstractions of several data models for storage, then this +intermediate representation—the transmission format—can be used to +translate between one data model and another.

+
+
+

The OPeNDAP data model consists of a fairly elementary set of base +types combined with an advanced set of constructs and operators that +allows it to define data types of arbitrary complexity. This way, the +OPeNDAP data access protocol can be used to transmit data from virtually +any data storage format.

+
+
+
OPeNDAP Elements
+

OPeNDAP comprises the following elements:

+
+
+
+
Base Types
+
+

These are the simple data types, like integers, floating point +numbers, strings, and character data.

+
+
Constructor
+
+

Types These are the more complex data types that can be constructed +from the simple base types. Examples are structures, sequences, +arrays, and grids.

+
+
Operators
+
+

Access to data can be operationally defined with operators defined on the various data types.

+
+
External Data Representation
+
+

In order to transmit the data across the Internet, there needs to be a machine-independent definition of what the various data types look like. For example, the client and server need to agree on the most significant digit of a particular byte in the message

+
+
+
+
+

These elements are defined in greater detail in the sections that follow.

+
+
+
Base Types
+
+

The OPeNDAP data model uses the concepts of variables and operators. +Each data set is defined by a set of one or more variables, and each +variable is defined by a set of attributes. A variable’s +attributes—such as units, name and type—must not be confused with +the data value (or values) that may be represented by that variable. A +variable called time may contain an integer number of minutes, but it +does not contain a particular number of minutes until a context, such as +a specific event recorded in a data set, is provided. Each variable may +further be the object of an operator that defines a subset of the +available data set.

+
+
+

Variables in the DAP have two forms. They are either base types or type +constructors. Base type variables are similar to predefined variables in +procedural programming languages like C or Fortran (such as int or +integer*4). While these have an internal structure, it is not +possible to access parts of that structure using the DAP. Base type +variables in the DAP have two predefined attributes (or +characteristics): name and type. They are defined as follows:

+
+
+
+
Name
+
+

A unique identifier that can be used to reference the part of the +dataset associated with this variable.

+
+
Type
+
+

The data type contained by the variable. Data types include the following:

+
+
    +
  • +

    Byte is a single byte of data. This is the same as unsigned char in +ANSI C.

    +
  • +
  • +

    Int16 is a 16 bit two’s complement integer. This is synonymous with long +in ANSI C when that type is implemented as 16 bits.

    +
  • +
  • +

    UInt16 is a 16 bit unsigned integer.

    +
  • +
  • +

    Int32 is a 32 bit two’s complement integer. This is synonymous with long +in ANSI C when that type is implemented as 32 bits.

    +
  • +
  • +

    UInt32 is a 32 bit unsigned integer.

    +
  • +
  • +

    Float32 is the IEEE 32 bit floating point data type.

    +
  • +
  • +

    Float64 is the IEEE 64 bit floating point data type.

    +
  • +
  • +

    String is a sequence of bytes terminated by a null character.

    +
  • +
  • +

    Url is a string containing an OPeNDAP URL.

    +
  • +
+
+
+
+
+
+

The declaration in a +DDS of a variable of any of the base types is simply the type of the +variable followed by its name and a semicolon. For example, to declare +a month variable to be a 32-bit integer, you would type…​

+
+
+
+
Int32 month;
+
+
+
+
+
Constructor Types
+
+

Constructor types, such as arrays and structures, describe the grouping +of one or more variables within a dataset. These classes are used to +describe different types of relations between the variables that +comprise the dataset. For example, an array might indicate that the +variables grouped are all measurements of the same quantity with some +spatial relation to one another, whereas a structure might indicate a +grouping of measurements of disparate quantities that happened at the +same place and time.

+
+
+

There are six classes of type constructor variables defined by +OPeNDAP: arrays, structures, sequences, functions, and grids. These are explained below.

+
+
+
Array
+

An array is a one dimensional indexed data structure as defined by ANSI +C. Multidimensional arrays are defined as arrays of arrays. An array may +be subsampled using subscripts or ranges of subscripts enclosed in +brackets ([]). For example, temp[3][4] would indicate the value in the +fourth row and fifth column of the temp array. (As in C, OPeNDAP array +indices start at zero.)

+
+
+

A chunk of an array may be specified with subscript ranges; the array +temp[2:10][3:4] indicates an array of nine rows and two columns whose +values have been lifted intact from the larger temp array.

+
+
+ + + + + +
+
Note
+
+A hyperslab may be selected from an array with a stride value. The +array represented by temp[2:2:10][3:4] would have only five rows; the +middle value in the first subscript range indicates that the output +array values are to be selected from alternate input array rows. The +array temp[2:3:10][3:4] would select from every third row, and so on. +
+
+
+

A DDS declaration of a 5x6 array of floating point numbers would look like this:

+
+
+
+
Float64 data[5][6];
+
+
+
+

In addition to its magnitude, every dimension of an array may also have +a name. The previous declaration could be written as…​

+
+
+
+
Float64 data[height = 5][width = 6];
+
+
+
+
Structure
+

A Structure is a class that may contain several variables of different +classes. However, though it implies that its member variables are +related somehow, it conveys no relational information about them. The +structure type can also be used to group a set of unrelated variables +together into a single dataset. The "dataset" class name is a synonym +for structure.

+
+
+

A DDS Structure declaration containing some data and the month in which the +data was taken might look like this:

+
+
+
+
   Structure {
+      Int32 month;
+      Float64 data[5][6];
+   } measurement;
+
+
+
+

Use the . operator to refer to members of a Structure. For example, +measurement.month would identify the integer member of the Structure +defined in the above declaration.

+
+
+
Sequence
+

A Sequence is an ordered set of variables, each of which may have several +values. The variables may be of different classes. Each element of a +Sequence consists of a value for each member variable, so a Sequence is +sort of like an ordered set of Structures.

+
+
+

Thus a Sequence can be represented as…​

+
+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

s00

s01

…​

s0n

s10

s11

…​

s1n

s20

s21

…​

s2n

.

…​

…​

.

.

…​

…​

.

.

…​

…​

.

si0

si1

…​

sin

+
+

Every instance of Sequence S has the same number, order, and class of +its member variables. A Sequence implies that each of the variables is +related to each other in some logical way. For example, a Sequence +containing position and temperature measurements might imply that each +temperature measurement was taken at the corresponding position. A +Sequence is different from a Structure because its constituent variables +have several instances while a Structure’s variables have only one +instance (or value).

+
+
+

A Sequence declaration is similar to a Structure’s declaration. For example, the +following would define a Sequence that would contain many members like +the Structure defined above:

+
+
+
+
   Sequence {
+      Int32 month;
+      Float64 data[5][6];
+   } measurement;
+
+
+
+

Note that, unlike an Array, a Sequence has no index. This means that a +Sequence’s values are not simultaneously accessible. Instead, a Sequence +has an implied state, corresponding to a single element in the +Sequence.

+
+
+

As with a Structure, the variable measurement.month has a single value. +The distinction is that this variable’s value changes depending on the +state of the Sequence. You can think of a Sequence as composed of the +data you get from successive reads of data from a file. The data values +available at any point are the last values read from the file, and you +will not have immediate access to any of the other values in that file.

+
+
+
Grid
+

A Grid is an association of an N dimensional array with N named vectors +(one-dimensional arrays), each of which has the same number of elements +as the corresponding dimension of the array. Each data value in the Grid +is associated with the data values in the vectors associated with its +dimensions.

+
+
+

For example, consider an array of temperature values that has six +columns and five rows. Suppose that this array represents measurements +of temperature at five different depths in six different locations. The +problem is the indication of the precise location of each temperature +measurement, relative to one another.

+
+
+

If the six locations are evenly spaced, and the five depths are also +evenly spaced, then the data set can be completely described using the +array and two scalar values indicating the distance between adjacent +vertices of the array. However, if the spacing of the measurements is +not regular, as in the figure below, then an array will be inadequate. To adequately describe the positions of each +of the points in the grid, the precise location of each column and row +must be described.

+
+
+
+Grid +
+
Figure 3. A Sample of an Irregular Grid of Data
+
+
+

The secondary vectors in the Grid data type provide a solution to this +problem. Each member of these vectors associates a value for all the +data points in the corresponding rank of the array. The value can +represent location or time or some other quantity and can even be a +constructor data type. The following declaration would define a data +type that could accommodate a structure like this:

+
+
+
+
 Grid {
+      Float64 data[distance = 6][depth = 5];
+      Float64 distance[6];
+      Float64 depth[5];
+   } measurement;
+
+
+
+

In this example, a vector called depth contains five values, each +corresponding to the depths of each row of the array, while another +vector called distance contains the scalar distance between the location +of the corresponding column and a reference point.

+
+
+

In a similar arrangement, a location array could contain six +(latitude, longitude) pairs indicating the absolute location of each +column of the grid.

+
+
+
+
    Grid {
+      Float64 data[distance = 6][depth = 5];
+      Float64 depth[5];
+      Array Structure {
+         Float64 latitude;
+         Float64 longitude;
+      } location[6];
+   } measurement;
+
+
+
+
+
External Data Representation
+
+

Now that you know what the data types are, the next step is to define +their external representation. The data access protocol defines an external +representation for each of the base-type and constructor-type variables. +This is used when an object of the given type is transferred from one +computer to another. Defining a single external representation makes +possible the translation of variables from one computer to another when +those computers use different internal representations for those +variable types.

+
+
+

The data access protocol uses Sun Microsystems' XDR protocol for the +external representation of all of the base type variables. The table +below shows the XDR types used to represent the various base type +variables.

+
+
+

The XDR data types corresponding to OPeNDAP base-type variables.

+
+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Base TypeXDR Type

Byte

xdr byte

Int16

xdr int16

UInt16

xdr unsigned int16

Int32

xdr int32

UInt32

xdr unsigned int32

Float32

xdr float

Float64

xdr double

String

xdr string

URL

xdr string

+
+

A base type variable is always either transmitted or not. You will not see a fraction of an String type transmitted. Constructor type variables, being composed of the bast type variables, are transmitted as sets of base type variables, and these may be sampled, with a constraint expression.

+
+
+

Constraint expressions do not affect how a base-type variable is +transmitted from a client to a server; they determine if a variable is +to be transmitted. For constructor type variables, however, constraint +expressions may be used to exclude portions of the variable. For +example, if a constraint expression is used to select the first three of +six fields in a structure, the last three fields of that structure are +not transmitted by the server.

+
+
+

What remains is to define the external representation of the constructor +type variables. For each of the six constructor types these definitions +are:

+
+
+
+
Array
+
+

An Array is sent using the xdr_array function. This means that an +Array of 100 Int32s is sent as a single block of 100 xdr longs, not +100 separate "xdr long"s.

+
+
Structure
+
+

A Structure is sent by encoding each field in the order those fields +are declared in the DDS and transmitting the resulting block of bytes.

+
+
Sequence
+
+

A Sequence is transmitted by encoding each item in the sequence as if +it were a Structure, and ending each such structure after the other, +in the order of their occurrence in the sequence. The entire sequence +is sent, subject to the constraint expression. In other words, if no +constraint expression is supplied then the entire sequence is sent. +However, if a constraint expression is given all the records in the +sequence that satisfy the expression are sent.

+
+
Grid
+
+

A Grid is encoded as if it were a Structure (one component after the +other, in the order of their declaration).

+
+
+
+
+

The external data representation used by OPeNDAP +may be compressed, depending on the configuration of the respective +machines. The compression is done using the gzip program. Only the data +transmission itself will be affected by this; the transmission of the +ancillary data is not compressed.

+
+
+
+
+
+
+
+

4. OPeNDAP Messages

+
+
+

This section provides A closer look at the messages passed to and from an OPeNDAP server and the various services that may be provided. Also reviews constraint expressions, which can be used to select data from specific datasets. Researchers who will use OPeNDAP to get data for analysis will find this useful.

+
+
+

An OPeNDAP server is in the business of making replies to queries for +data and other services. The queries come in the form of specially +formed URLs, and the replies consist of MIME documents whose contents are +described in the sections below. (Technically speaking, the response +document headers are not exactly right, but they function in the same +way.)

+
+
+

All the requests start with a root URL, and they all are in the form of +a GET, using a suffix on the root URL and a constraint expression to +indicate which service is requested and what the parameters are. (There is also an experimental SOAP interface that uses a POST to request data.)

+
+
+

The replies come in three categories: Ancillary data, Data, and the +other services. The following sections cover each of them, beginning +with the ancillary data messages.

+
+
+

4.1. Ancillary Data

+
+

In order to use a data set, a user must have some information at his +or her disposal that is not strictly included in the data itself. This +information, called ancillary data, describes the shape and size of the +data types that make up the data set, and provides information about +many of the data set’s attributes. OPeNDAP uses two different +structures to supply this ancillary information about an OPeNDAP data +set. The DDS describes the data set’s +structure and the relationships between its variables, and the DAS provides information about the variables +themselves. Both structures are described in the following sections.

+
+
+

4.1.1. Dataset Descriptor Structure (DDS)

+
+

In order to translate data from one data model into another, OPeNDAP +must have some knowledge about the types of the variables and their +semantics that comprise a given data set. It must also know something +about the relations of those variables—even those relations which are +only implicit in the dataset’s own API. This knowledge about the +dataset’s structure is contained in a text description of the dataset +called the DDS.

+
+
+

The DDS does not describe how the information in the data set is +physically stored, nor does it describe how the "native" API is used to +access that data. Those pieces of information are contained in the API +itself and in the OPeNDAP server, respectively. The DDS contains +knowledge about the dataset variables and the interrelations of those +variables. The server uses the DDS to describe the structure of a +particular dataset to a client.

+
+
+

The DDS is a textual description of the variables and their classes that +make up some data set. The DDS syntax is based on the variable +declaration and definition syntax of C and C++. A variable that is a +member of one of the base type classes is declared by writing the class +name followed by the variable name. The type constructor classes are +declared using C’s brace notation. A grammar for the syntax is given in +the table below. (Note that the Dataset keyword has the same syntactic +function as Structure but is used for the specific job of enclosing the +entire data set even when it does not technically need an enclosing +element.)

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1. DDS Syntax
"data setDataset \{ declarations } name;

"declaration

List declaration

"base-type" var;

Structure \{"declarations"} "var";

Sequence \{"declarations"} "var";

Grid \{ ARRAY : "declaration" MAPS: "declarations" } "var";

"base-type"

Byte

Int32

UInt32

Float64

String

Url

"var"

"name"

"name array-decl"

"array-decl"

[integer ]

["name" = integer]

"name"

User-chosen name of data set, variable, or array dimension.

+
+

A DDS is returned in response to a request for the DDS, and it is also +part of the data return. The request URL for the DDS is composed of the +root URL, with the suffix ".dds". For example, if a data set is located +at http:/tests.opendap.org/data/mydata.dat then you’ll find the DDS at +http:/tests.opendap.org/data/mydata.dat.dds

+
+
+

An example DDS entry is shown below. (There are more in the +Data Model, section of this guide, where there is also an +explanation of the information implied by the data model.)

+
+
+
An Example Dataset Descriptor Entry
+
+
 Dataset {
+  Int32 catalog_number;
+  Sequence {
+    String experimenter;
+    Int32 time;
+    Structure {
+      Float64 latitude;
+      Float64 longitude;
+    } location;
+    Sequence {
+      Float64 depth;
+      Float64 salinity;
+      Float64 oxygen;
+      Float64 temperature;
+    } cast;
+  } station;
+} data;
+
+
+
+
+

4.1.2. Dataset Attribute Structure (DAS)

+
+

The DAS is used to store attributes for +variables in the dataset. An attribute is any piece of information about +a variable that the creator wants to bind with that variable excluding +the type and size, which are part of the DDS. Typical attributes might +range from error measurements to text describing how the data was +collected or processed.

+
+
+

In principle, attributes are not processed by software, other than to be +displayed. However, many systems rely on attributes to store extra +information that is necessary to perform certain manipulations of data. +In effect, attributes are used to store information that is used "by +convention" rather than "by design". OPeNDAP can effectively support +these conventions by passing the attributes from data set to user +program via the DAS. (Of course, OPeNDAP cannot enforce conventions in +datasets where they were not followed in the first place.)

+
+
+

The syntax for attributes in a DAS is shown in the table below. Every +attribute of a variable is a triple: attribute name, type, and value. The +name of an attribute is an identifier, consisting of alphanumeric +characters, plus "_" and "/". The type of an attribute may be one of: +"Byte", "Int32", "UInt32", "Float64", "String" or "Url". An attribute +may be scalar or vector. In the latter case the values of the vector are +separated by commas (,) in the textual representation of the DAS.

+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2. Dataset Attribute Structure Syntax
"DAS"Attributes "{var-attr-list}"

"var-attr-list"

"var-attr"

"var-attr-list" "var-attr"

(empty list)

"var-attr"

"variable" \{"attr-list"}

"container" {var-attr-list}

"global-attr"

"global-attr"

Global "variable" \{"attr-list"}

"attr-list"

attr-triple;

"attr-list" "attr-triple"

"(empty list)"

"attr-triple"

attr-type attribute attr-val-vec;

"attr-val-vec"

"attr-val"

"attr-val-vec", "attr-val"

"attr-val"

numeric value

"variable"

"string"

"attr-type"

"Byte"

Int32

UInt32

Float64

String

Url

"variable"

user-chosen variable name

"attribute"

user-chosen attribute name

"container"

user-chosen container name

+
+

A DAS is returned in response to a request for the DAS. Unlike the #DDS[DDS], it is not part of the data return. The request URL for the DAS is composed of the root URL, with the suffix ".das". For example, if a data set is located at http:/tests.opendap.org/data/mydata.dat then you’ll find the DAS at http:/tests.opendap.org/data/mydata.dat.das.

+
+
+
Containers
+
+

An attribute can contain another attribute, or a set of attributes. This +is roughly comparable to the way compound variables can contain other +variables in the DDS. The container defines a new lexical scope for the +attributes it contains.

+
+
+

Consider the following example:

+
+
+
An Example of Attribute Containers
+
+
 Attributes {
+   Bill {
+      String LastName "Evans";
+      Byte Age 53;
+      String DaughterName "Matilda";
+      Matilda {
+         String LastName "Fink";
+         Byte Age 26;
+      }
+   }
+}
+
+
+
+

Here, the attribute Bill.LastName would be associated with the string +"Evans", and Bill.Age with the number 53. However, the attribute +Bill.Matilda.LastName would be associated with the string "Fink" and +Bill.Matilda.Age with the number 26.

+
+
+

Using container attributes as above, you can construct a DAS that +exactly mirrors the construction of a DDS that uses compound data types, +like "Structure" and "Sequence". Note that though the Bill attribute is +a container, it has attributes of its own, as well. This exactly +corresponds to the situation where, for example, a "Sequence" would have +attributes belonging to it, as well as attributes for each of its member +variables. Suppose the Sequence represented a single time series of +measurements, where several different data types are measured at each +time. The Sequence attributes might be the time and location of the +measurements, and the individual variables might have attributes +describing the method or accuracy of that measurement.

+
+
+
+
Global Attributes
+
+

A "global attribute" is not bound to a particular identifier in a +dataset; these attributes are stored in one or more containers with the +name Global or ending with _Global. Global attributes are used to +describe attributes of an entire dataset. For example, a global +attribute might contain the name of the satellite or ship from which the +data was collected. Here’s an example:

+
+
+
An Example of Global Attributes
+
+
 Attributes {
+   Bill {
+      String LastName "Evans";
+      Byte Age 53;
+      String DaughterName "Matilda";
+      Matilda {
+         String LastName "Fink";
+         Byte Age 26;
+      }
+   }
+   Global {
+      String Name "FamilyData";
+      String DateCompiled "11/17/98";
+   }
+}
+
+
+
+

Global attributes can be used to define a certain view of a dataset. +For example, consider the following DAS:

+
+
+
An Example of Global Attributes In Use
+
+
 Attributes {
+   CTD {
+      String Ship "Oceanus";
+      Temp {
+         String Name "Temperature";
+      }
+      Salt {
+         String Name "Salinity";
+      }
+   }
+   Global {
+      String Names "OPeNDAP";
+   }
+   FNO_Global {
+      String Names "FNO";
+      CTD {
+         Temp {
+            String FNOName "TEMPERATURE";
+         }
+         Salinity {
+            String FNOName "SALINITY";
+         }
+      }
+   }
+}
+
+
+
+

Here, a dataset contains temperature and salinity measurements. To aid +processing of this dataset by some OPeNDAP client, long names are +supplied for the Temp and Salt variables. However, a different client +(FNO) spells variable names differently. Since it is seldom practical to +come up with general-purpose translation tables, the dataset +administrator has chosen to include these synonyms under the FNO_Global +attributes, as a convenience to those users.

+
+
+

Using global attributes, a dataset or catalog administrator can create a +layer of attributes to make OPeNDAP datasets conform to several +different dataset naming standards. This becomes significant when trying +to compile an OPeNDAP dataset database.

+
+
+
+
+
+

4.2. Data Transmission

+
+

An OPeNDAP server returns data to a client in response to a request URL composed of the root URL, with the suffix ".dods". For example, if a data set is located at http:/tests.opendap.org/data/mydata.dat then you’ll find the data at http:/tests.opendap.org/data/mydata.dat.dods

+
+
+

The data is returned in a MIME document that consists of two parts: the +DDS and the data encoded according to the description in +External Data Representation. (The returned document is sometimes called the DataDDS.) The two parts are separated by this string:

+
+
+

Data:<CR><NL>

+
+
+

The DDS is modified according to any constraint expression that may have been +applied. That is, the returned DDS describes the returned data.

+
+
+

For example, consider a a request for data from a data set with a DDS like this:

+
+
+
+
Dataset {
+    Grid {
+      Array:
+        Int16 sst[time = 1857][lat = 89][lon = 180];
+      Maps:
+        Float64 time[time = 1857];
+        Float32 lat[lat = 89];
+        Float32 lon[lon = 180];
+    } sst;
+    Float64 time_bnds[time = 1857][nbnds = 2];
+} sst.mnmean.nc;
+
+
+
+

This is the DDS of a typical gridded dataset. Suppose, though, that you ask for only the time values of the data set. The DDS of the result will look like this:

+
+
+
+
Dataset {
+    Float64 time[time = 1857];
+} sst.mnmean.nc;
+
+
+
+

This DDS will be included in the DataDDS return, ahead of the encoded array of 1857 64-bit time values.

+
+
+

For more information about sampling OPeNDAP data sets, see the section +below about constraint expressions.

+
+
+ + + + + +
+
Note
+
+A request for data from an OPeNDAP client will generally make three different service requests: DAS, DDSD, and data. The prepackaged OPeNDAP +clients do this for you, so you may not be aware that three requests are made for each URL. +
+
+
+
+

4.3. Other Services

+
+

In addition to the data, DDS, and DAS an OPeNDAP server may provide +any or all of the services described in the sections that follow.

+
+
+

4.3.1. ASCII Service

+
+

This service returns an ASCII representation of the requested data. This +can make the data available to a wide variety of standard web browsers. +This service is activated when the server receives a URL ending with .asc or .ascii.

+
+
+

Note that unlike the data response, the ASCII response does not contain +a DDS for the returned data. Instead it just returns the simple text +message.

+
+
+ + + + + +
+
Note
+
+While ASCII is fine for moving small amounts of data, it generally is best to move data in binary whenever possible becuase servers can generate binary data more quickly than ASCII data, and binary data is more compact. You can then process locally if you need ASCII. To process binary data, you could use getdap if you retrieve DAP2 binary response (.dods); getdap4 if you retrieve a DAP4 binary response; or ncdump for a NetCDF3 or NetCDF4 binary response. +
+
+
+

The Quick Start Guide contains examples of the ASCII response.

+
+
+
+

4.3.2. Info Service

+
+

The Info service formats information from a data set’s DAS and DDS into +a single HTML document suitable for viewing in a web browser. The +returned document may include information about both the data server +itself (such as server functions implemented) and the dataset +referenced in the URL. The server administrator determines what +information is returned in response to such a request. The services is +activated by a URL ending in .info.

+
+ +
+
+

4.3.3. WWW Interface Service

+
+

The WWW service is another way to browse a server’s data interactively. +You can use a browser to look at an individual data file, or a +directory of files (or "files" since a server may contain logical +entities that look like files).

+
+
+

The server uses a data set’s DDS and DAS to construct a web form you can +use to construct a URL that subsamples the data set (using a +constraint expression). You can copy the +resulting URL into another browser, or use one of the buttons on the +form to download data.

+
+
+
+Reynolds ifh +
+
Figure 4. OPeNDAP Server Data Access Form
+
+
+

If a server receives a URL that either ends in a slash (/) or +contents.html, it returns a web page that looks like a standard web +browser’s directory view.

+
+
+
+Test.oopendap.org directory view +
+
Figure 5. Sample Directory View
+
+
+

Each link in the directory view opens up the WWW service version of that +data.

+
+
+

The Quick Start Guide +contains more information about browsing OPeNDAP data interactively.

+
+
+
+

4.3.4. Version Service

+
+

This service returns the version information for the OPeNDAP server +software running on the server. This service is triggered by a URL +ending with .ver. The return is a short text message containing the +relevant version numbers.

+
+
+
+

4.3.5. DDX

+
+

The DDX is an XML version of the DAS and DDS, combined. It is triggered +by a URL ending with .ddx. You can find the schema for the DDX at +http://xml.opendap.org/dap/dap2.xsd.

+
+
+

The DDX is designed to contain data, too, but this is not yet implemented. You will see an empty dataBLOB element at the end of each +DDX, which will eventually hold returned data.

+
+
+

The DDX response can be modified with a constraint expression. Like the DDS, the +DDX will describe only the data actually returned.

+
+
+

The DDX is the nucleus of +what becomes version 4 of the DAP.

+
+
+
+

4.3.6. THREDDS

+
+

Some OPeNDAP servers (for example, go to Hyrax, the +server supplied by the OPeNDAP group) can make sensible replies to +requests for THREDDS catalog information. This can serve to "advertise" +a server’s data by having it appear in catalogs accumulated by THREDDS +browsers. Go to the UCAR +THREDDS Data Server site for more information.

+
+
+
+
+

4.4. Constraint Expressions

+
+

Using OPeNDAP, you can subsample the data you are looking at. That is, you can request an entire data file or just a small piece of it.

+
+
+ + + + + +
+
Note
+
+The syntax on this subsection corresponds to the DAP2 implementation of OPeNDAP. We are migrating content into the documentation to also include extensive DAP4 information. For now, further information on DAP4 syntax can be inspected on the DAP4 Specification. +
+
+
+

4.4.1. Selecting Data: Using Constraint Expressions

+
+

The URL such as this one…​

+
+
+
+
http://test.opendap.org/dap/data/nc/sst.mnmean.nc.gz
+
+
+
+

…​refers to the entire dataset contained in the mnmean.nc file. A user +may also choose to sample the dataset simply by modifying the submitted URL. The constraint expression attached to the URL directs +that the data set specified by the first part of the URL be sampled to +select only the data of interest from a dataset.

+
+
+ + + + + +
+
Caution
+
+An OPeNDAP data set can contain an extraordinary amount of +data. You almost certainly do not want to make an unconstrained +request to a data set without knowing something about it. Familiarize +yourself with the DDS and DAS before asking for data. +
+
+
+

Because the expression modifies the URL used to access data, this works +even for programs that do not have a built-in way to accomplish such +selections. This can vastly reduce the amount of data a program needs to +process and thus reduce the network load of transmitting the given data to the client.

+
+
+
+

4.4.2. Constraint Expression Syntax

+
+

A constraint expression is appended to the target URL following a question mark. Consider the following two examples, one for a Grid and another for a Sequence.

+
+
+

Consider first the Array with URL

+
+
+
+
http://test.opendap.org/dap/data/nc/sst.mnmean.nc.gz
+
+
+
+

We can request single variables, and subsetting by index or values.

+
+
+

…​/nc/sst.mnmean.nc.gz?sst[3][4][5] Click here for sample output.

+
+
+ + + + + +
+
Note
+
+Constraint expressions are specified within the HTTP query portion of the URL. Because the syntax for constraint expressions involves characters that are not allowed on URLs, these characters must be escaped before being passed to the server. As a result, escaping of characters must then take place on the client side of the request. In the example above, the constraint expression that is being sent to the server is ?sst%5B3%5D%5B4%5D%5B5%5D . +
+
+
+

…​/nc/sst.mnmean.nc.gz?sst[0:1][13:16][103:105] +Click here for sample output.

+
+
+

…​/nc/sst.mnmean.nc.gz?geogrid(sst,62,206,56,210,"19722<time<19755") +Click here for sample output.

+
+
+

In all the examples above, only the variable sst was returned. To include the coordinate variables we have to explicitly include them in the constraint expression. For example

+
+
+

…​/nc/sst.mnmean.nc.gz?lat[4],lon[5],time[3],sst[3][4][5] Click here to see output

+
+
+ + + + + +
+
Note
+
+Even though the array sst index ordering is: time, lat and lon, the coordinates are explicitly defined in the order lat, lon and time on the URL. This is because that is how these variables appear on the DAP Response Form. Including the variables in a different order will not result in an error, but it can lead to a slow response and performance. To get a better performance, we recommend to extract the URL interactively from the DAP Response Form when possible. For more see below under projections. +
+
+
+

Consider now a Sequence with URL

+
+
+
+
http://test.opendap.org/dap/data/ff/gsodock.dat
+
+
+
+

…​/ff/gsodock.dat?URI_GSO-Dock.Time,URI_GSO-Dock.Sea_Temp +Click here for sample output.

+
+
+

…​/ff/gsodock.dat?URI_GSO-Dock.Time,URI_GSO-Dock.Sea_Temp&URI_GSO-Dock.Time<35234.1 +Click here for sample output.

+
+
+

…​/ff/gsodock.dat?URI_GSO-Dock.Time,URI_GSO-Dock.Sea_Temp&URI_GSO-Dock.Time<35234.1&URI_GSO-Dock.Sea_Temp<18 +Click here for sample input.

+
+
+

Now that we have build some intuition about constraint expressions in the DAP2, we move to formally define them. A constraint expression consists of two parts: a projection and a +selection, separated by an ampersand (&). Either part may contain +several sub-expressions. Either part or both parts may be used.

+
+
+
+
...?proj_1,proj_2,...,proj_n&sel_1&sel_2&...&sel_m
+
+
+
+

A projection is simply a comma-separated list of the variables that are to be returned to the client. If an array is to be subsampled, the +projection specifies the manner in which the sampling is to be done. If the selection is omitted, all the variables in the projection list are +returned. If the projection is omitted, the entire dataset is returned, subject to the evaluation of the selection expression. The projection +can also include functional expressions of the form…​

+
+
+
+
...?function(arg_1,arg_2,...,arg_n)
+
+
+
+

…​where the arguments are variables from the dataset, scalar values, or other functions. (See the Constraint Expression Functions section in this guide.)

+
+
+

A selection expression leads with an ampersand and is a boolean expression of the form "variable operator variable", "variable operator value" or "function(arg_1,arg_2,…​,arg_n)", where…​

+
+
+
+
operator
+
+

Can be one of the relational operators listed in the table below.

+
+
variable
+
+

Can be any variable recorded in the dataset.

+
+
value
+
+

Can be any scalar, string, function, or list of numbers (Lists are denoted by comma-separated items enclosed in curly braces ,for example, \{3,11,4.5}.).

+
+
function
+
+

Is a function defined by the server to operate on variables or values, and to return a boolean value.

+
+
+
+
+

Each selection clause begins with an ampersand (&). You can think of +this as representing the "AND" boolean operation, but remember that it +is actually a prefix operator, not an infix operator. That is, it must always appear at the beginning of each selection clause. This means that a constraint expression that contains no projection clause +must still have an & in front of the first selection clause.

+
+
+

There is no limit on the number of selection clauses that can be +combined to create a compound constraint expression. Data that produces +a true (non-zero) value for the entire selection expression will be +included in the data returned to the client by the server. If only a +part of some data structure, such as a Sequence, satisfies the selection +criteria, then only that part will be returned.

+
+
+ + + + + +
+
Note
+
+Due to differences between data model paradigms, selection is not implemented for the OPeNDAP array data types, such as +Grid or Array. However, many OPeNDAP servers implement selection +functions you can use for the same effect. (See the Constraint Expression Functions section in this guide.) +
+
+
+
Simple Constraint Expression Examples
+

Consider the DDS below. This is the description of a dataset containing +station data including temperature, oxygen, and salinity. Each station +also contains 20 oxygen data points, taken at 20 fixed depths, used for calibration of the data.

+
+
+
Sample Data Descriptor
+
+
Dataset {
+   Sequence{
+      Int32 day;
+      Int32 month;
+      Int32 year;
+      Float64 lat;
+      Float64 lon;
+      Float64 O2cal[20];
+      Sequence{
+         Float64 press;
+         Float64 temp;
+         Float64 O2;
+         Float64 salt;
+      } cast;
+      String comments;
+   } station;
+} arabian-sea;
+
+
+
+

The following URL will return only the pressure and temperature pairs of this dataset. (Note that the constraint expression parser removes all +spaces, tabs, and newline characters before the expression is parsed.) +There is only a projection clause, without a selection, in this +constraint expression:

+
+
+
+
http://oceans.edu/jg/exp1O2/cruise?station.cast.press,station.cast.temp
+
+
+
+

We have assumed that the dataset was stored in the JGOFS format on the +remote host oceans.edu, in a file called explO2/cruise. For the sake of +brevity, from here on we will omit the first part of the URL so as to +concentrate on only the constraint expression.

+
+
+

If we only want to see pressure and temperature pairs below 500 meters deep, we can modify the constraint expression by adding a selection clause:

+
+
+
+
 ?station.cast.press,station.cast.temp&station.cast.press>500.0
+
+
+
+

In order to retrieve all of each cast that has any temperature reading +greater than 22 degrees, use the following:

+
+
+
+
 ?station.cast&station.cast.temp>22.0
+
+
+
+

Simple constraint expressions may be combined into compound expressions +by appending them to one another. To retrieve all stations west of 60 +degrees West and north of the equator:

+
+
+
+
 ?station&station.lat>0.0&station.lon<-60.0
+
+
+
+

As mentioned earler, the logical OR can be implemented using a list of scalars. The following expression will select only stations taken north of the equator in April, May, June, or July:

+
+
+
+
 ?station&station.lat>0.0&station.month={4,5,6,7}
+
+
+
+

If our dataset contained a field called monsoon-month, indicating the month in which monsoons happened that year, we could modify the last example search to include those months as follows:

+
+
+
+
 ?station&station.lat>O.O&station.month={4,5,6,7,station.monsoon-month}
+
+
+
+

In other words, a list can contain both values and other variables. If monsoon-month was itself a list of months, a search could be written as:

+
+
+
+
 ?station&station.lat>0.0&station.month=station.monsoon-month
+
+
+
+

For arrays and grids, there is a special way to select data within the projection clause. Suppose we want to see only the first five oxygen calibration points for each station. The constraint expression for this would be:

+
+
+
+
 ?station.02cal[0:4]
+
+
+
+

By specifying a stride value, we can also select a hyperslab of the oxygen calibration array:

+
+
+
+
 ?station.02cal[0:5:19]
+
+
+
+

This expression will return every fifth member of the 02cal array. In other words, the result will be a four-element array containing only the +first, sixth, eleventh, and sixteenth members of the 02cal array. Each +dimension of a multi-dimensional arrays may be subsampled in an +analogous way. The return value is an array of the same number of +dimensions as the sampled array, with each dimension size equal to the +number of elements selected from it.

+
+
+
+

4.4.3. Operators, Special Functions, and Data Types

+
+

The constraint expression syntax defines a number of operators for each +data type. These operators are listed below.

+
+
+ + + + + +
+
Note
+
+All the operators defined for the scalar base types are boolean +operators whose result depends on the specified comparison between its +arguments. +
+
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3. Constraint Expression Operators
ClassOperators

Simple Types

Byte, Int*, UInt*, Float*

< > = != ⇐ >=

String

= != ~=

URL

= != ~=

Compound Types

Array

[start:stop] [start:stride:stop]

Structure

.

Sequence

.

Grid

[start:stop] [start:stride:stop] .

+
+

Individual fields of type constructors may be accessed using the dot +(.) operator. If a structure s has two fields time and temperature, +then those fields may be accessed using s.time and s.temperature.

+
+
+

The ~= operator returns true when the character string on the left of +the operator matches the regular expression on the right. See Pattern Matching with Constraint Expressions in this guide for a discussion of regular expressions.

+
+
+

The array operator [] is used to subsample the given array. You can find +several examples of its use in the +Quick Start Guide: Peeking at Data.

+
+
+
+

4.4.4. Constraint Expression Functions

+
+

An OPeNDAP data server may define its own set of functions that may be +used in a constraint expression. For example, the oceans.edu data server +we have been imagining might define a sigma1() function to return the +density of the water at the given temperature, salinity, and pressure. A +query like the following would return all the stations containing water +samples whose density exceeded 1.0275g/cm3:

+
+
+
+
?station.cast&sigma1(station.cast.temp,
+                     station.cast.salt,
+                     station.cast.press)>27.5
+
+
+
+

Functions like this are not a standard part of the OPeNDAP +architecture and may vary from one server to another. A user may query +a server for a list of such functions by sending a URL with a constraint +expression that calls the "version()" function.

+
+
+

This will return a list of functions implemented. Call any of the +functions with no arguments to see a description of the arguments.

+
+
+

For example…​

+
+ +
+

and…​

+
+ +
+ + + + + +
+
Note
+
+When using functions, remember that a function used in a projection can return any value, but when used in a selection clause, it must either return a boolean value, or be part of a test that returns a boolean value. +
+
+
+
+

4.4.5. Pattern Matching with Constraint Expressions

+
+

There are three operators defined to compare one String data type to +another:

+
+
+
    +
  • +

    The = operator returns TRUE if its two input character strings +are identical.

    +
  • +
  • +

    The != operator returns TRUE if the Strings do not +match.

    +
  • +
  • +

    The ~= operator is provided that returns TRUE if the String +to the left of the operator matches the regular expression in the String on the right.

    +
  • +
+
+
+

A regular expression is simply a character string containing wildcard +characters that allow it to match patterns within a longer string. For +example, the following constraint expression might return all the +stations on the sample cruise on which a shark was sighted:

+
+
+
+
?station&station.comment~=".*shark.*"
+
+
+
+

Most characters in a regular expression match themselves. That is, an +"f" in a regular expression matches an "f" in the target string. There +are several special characters, however, that provide more sophisticated +pattern-matching capabilities.

+
+
+
+
"."
+
+

The period matches any single character except a newline.

+
+
* + ?
+
+

These are postfix operators, which indicate to try to match the +preceding regular expression repetitively (as many times as possible). +Thus, o* matches any number of o’s. The operators differ in that o* +also matches zero o’s, o+ matches only a series of one or more o’s, +and o? matches only zero or one o.

+
+
"[ …​ ]"
+
+

Define a "character set," which begins with [ and is terminated by ]. +In the simplest case, the characters between the two brackets are what +this set can match. For example, [Ss] matches either an upper or +lower case s. Brackets can also contain character ranges, so [0-9] +matches all the numerals. If the first character within the brackets +is a caret ( ), the expression will only match characters that do not +appear in the brackets. For example, [ 0-9]* matches only character +strings that contain no numerals.

+
+
^$
+
+

These are special characters that match the empty string at the +beginning or end of a line.

+
+
\|
+
+

These two characters define a logical OR between the largest possible +expression on either side of the operator. So, for example, the string +Endeavor\|Oceanus matches either Endeavor or Oceanus. The scope of the +OR can be contained with the grouping operators, \( and \).

+
+
\( \)
+
+

These are used to group a series of characters into an expression, or for the OR function. For example, \(abc\)* matches zero or more repetitions of the string abc2.

+
+
+
+
+

There are several more special characters and several other features of +the characters described here, but they are beyond the scope of this +guide. The OPeNDAP regular expression syntax is the same as that used in +the Emacs editor. See the documentation for Emacs for a complete +description of all the pattern- matching capabilities of regular +expressions.

+
+
+
+

4.4.6. Optimizing the Query

+
+

Using the tools provided by OPeNDAP, a user can buil elaborate and sophisticated constraint expressions that will return precisely the data he or she wants. However, as the complexity of a constraint expression increases, so does the time necessary to process the expression. There are some techniques for optimizing the evaluation of a constraint that will ease the load on the server and provide faster replies to OPeNDAP dataset queries.

+
+
+

The OPeNDAP constraint expression evaluator uses a "lazy evaluation" +algorithm. This means that the sub-clauses of the selection clause are +evaluated in order and parsing halts when any sub-clause returns FALSE. +Consider a constraint expression that looks like this:

+
+
+
+
 ?station&station.cast.O2>15.0&station.cast.temp>22.0
+
+
+
+

If the server encounters a station with no oxygen values over 15.0, it does not bother to look at the temperature records at all. The first sub- clause evaluates FALSE, so the second clause is never even parsed.

+
+
+

A careful user may use this feature to his or her advantage. In the example above, the order of the clauses does not really matter; there +are the same number of temperature and oxygen measurements at each +station. However, consider the following expression:

+
+
+
+
 ?station&station.cast.O2>15.0&station.month={3,4,5}
+
+
+
+

For each station there is only one month value and many +oxygen values. Passing a constraint expression like this one will force +the server to sort through all the oxygen data for each station (which +could be in the thousands of points), only to throw the data away when +it finds that the requested month does not match the month value stored +in the station data. This would be far better done with the clauses +reversed:

+
+
+
+
 ?station&station.month={3,4,5}&station.cast.O2>15.0
+
+
+
+

This expression will evaluate much more quickly because unwanted +stations may be quickly discarded by the first sub-clause of the +selection. The server will only examine each oxygen value in the station +if it already knows that the station might be worth keeping.

+
+
+

This sort of optimization becomes even more important when one of the +clauses contains a URL. In general, any selection sub-clause containing +a URL should be left to the end of the selection. This way, the OPeNDAP +server will only be forced to go to the network for data if absolutely +necessary to evaluate the constraint expression.

+
+
+
+
+
+
+

5. OPeNDAP Server (Hyrax)

+
+
+

This section provides information about the structure of the OPeNDAP server, including a closer look at the server software provided by the OPeNDAP group itself. People involved in providing data to OPeNDAP users should read this before looking at the documentation for the server they will install.

+
+
+

5.1. The OPeNDAP Server

+
+

Any server that responds to the messages described in +OPeNDAP Messages using the +OPeNDAP Data Model is an OPeNDAP server. The messages and the data model are published standards, available to anyone.

+
+
+

In addition to publishing and maintaining the +standards described here, the OPeNDAP group maintains a server that complies with the +standard. Go to the Hyrax guide for additional information..

+
+
+

5.1.1. Hyrax

+
+

Hyrax, the modular OPeNDAP server, C and Java NetCDF data storage formats. Because Hyrax is modular, it can be outfitted to serve the particular needs of your data without weighing down performance with features you do not need.

+
+
+
How Hyrax Works
+
+

The Hyrax server is actually a combination of +two distinct servers, running on the same machine or on two machines +connected with a very fast link. One server serves as the user-facing +"front end" to the system while the other provides the "engine room", +optimized to turn around requests quickly.

+
+
+

The front end server is called the OPeNDAP Lightweight Front +end Server (OLFS). It receives requests for data and services in +multiple formats and forms, and is meant to be as "user friendly" as a +server can be. It also handles chores such as authentication and +authorization-checking and responding to catalog and bot requests. It +can also construct complex data requests from multiple requests from its +parner server.

+
+
+
+HyraxArchitecture +
+
+
+

This "engine room" server, called the Back End Server (BES), does +only one thing: it provides data. It is designed to do it fast. It handles +the compute-intensive parts of processing an OPeNDAP client request for +data. This results in higher performance for small requests while not +penalizing the larger requests.

+
+
+

Separating the two roles allows several paths to optimizing a server, +while still resulting in higher performance for small requests. An OLFS +controlling multiple BES processes on a machine can process multiple +requests quicker because while one BES is occupied with retrieving its +data, another can be processing its data. An OLFS controlling BES +processes on multiple machines can implement a rudimentary +load-balancing scheme to protect servers from overload. What’s more, +compute-intensive clients can optimize their processes further by +sending requests directly to the BES.

+
+
+
+
Installing Hyrax
+
+

The two parts of Hyrax are installed by +the same script. However, because they are discrete, they may require +different kinds of attention from an administrator. Testing OLFS +requires a working BES, so it is best to start the post-unpacking +process with the BES.

+
+
+
Installing BES
+

The BES is a standalone server. Its installation involves parking its +code somewhere to be run as a daemon and configuring your system to +execute it.

+
+
+

After that, there are several configuration options that you will need +to address by installing software on your computer and by editing the +Hyrax configuration file, +called bes.xml. Details of these options are in the Hyrax documentation, but following are the +decisions you’ll have to make:

+
+
+
+
What kind of data
+
+

Hyrax is equipped to serve data stored in C and Java netCDF file formats. Each different format requires +its own handler, and your computer must have shared libraries +containing these handlers. For example, in order to serve +netCDF data, the netCDF handler library must be available to Hyrax, +and identified in its +configuration file].The +handlers are shared libraries and are installed separately. Find +instructions under +Loading Modules in the Hyrax BES configuration documentation.

+
+
Where the data lives
+
+

A server equipped to serve data must be able to find that data. Lines in the bes.xml file identify the disk location of your data files. Hyrax can provide a limited amount of browsing capacity to users, through its WWW interface. Access is specified by identifying directories where data resides. See Pointing_to_data in the Hyrax BES configuration documentation.

+
+
What kinds of services
+
+

Along with simply supplying data, Hyrax can supply several different services, including serving the data as ASCII values, and the form-driven WWW interface. The bes.xml file is used to specify the list of services. The drivers for these services are installed as part of the default installation of Hyrax, but they need to be chosen and identified in bes.xml. See instructions at Loading Handlers.

+
+
+
+
+

Once these three tasks are accomplished and data is moved into the +appropriate directories, your server should be ready to provide data to +all comers, but specifically to its OLFS.

+
+
+
The FreeForm Module
+

One of the shared libraries to use for serving data is called the +FreeForm module. This module allows you to serve data in fairly +arbitrary formats by writing a format description file to sit alongside +your data file. If you have data that is not in one of the supported file +formats, consider writing format descriptions using FreeForm and +serving the data that way.

+
+
+
Installing OLFS
+

The OLFS is a Java servlet, so its installation involves installing the +Tomcat servlet infrastructure and then configuring that with the OLFS. +There are four configuration files, but unless your’s is an unusual case, +you will likely have to look at only two of them. See +Hyrax OLFS Configuration.

+
+
+

Use the +olfs.xml +file to specify these important features of the OLFS operation:

+
+
+
+
Address of BES
+
+

The OLFS is the front door to data from the BES. Use the olfs.xml file to identify where to find this server. See the instructions for the BESManager.

+
+
Dispatch handlers
+
+

The OLFS "offers" the incoming URL to a series of "dispatch handlers" +until one accepts it and executes. This allows the OLFS to offer +directory and catalog services as well as data services and more. Use +the olfs.xml file to nominate the dispatch handlers (they come with +the OLFS and do not need to be separately installed). See +handler instructions for more.

+
+
Catalog requests
+
+

The OLFS can handle +THREDDS catalog +requests as well as directory requests, which are an older part of the DAP +standard that also involves data about a collection of data files. The +THREDDS information can be static (provided from a file) or dynamic +(generated by a review of the available data).

+
+
File access
+
+

You may have individual files you want served intact via this server. +These might include documentation of the data files or of the server. +See +File +Dispatch Handler instructions.

+
+
+
+
+

There are additional features, such as a bot blocker and a version +message as well as the experimental SOAP message handler. These are +also configured with +olfs.xml.

+
+
+

The other configuration file that you might need to edit is +catalog.xml, +briefly reviewed under THREDDS, below.

+
+
+
THREDDS
+

THREDDS is a +catalog standard for scientific data promoted by scientists at +UCAR. It allows

+
+
+

The default file will allow dynamic catalogs to be created and should +allow your server to respond to THREDDS requests properly. You may want to serve a static THREDDS catalog as well. This can be done by +editing the catalog.xml file, and you will find links to instructions for +that at Hyrax - THREDDS Configuration.

+
+
+
Multiple BES Configuration
+

You can configure a single OLFS to work with multiple BES instances. +This enables rudimentary load balancing the isolation of data on one server or another. See the +Hyrax configuration chapter.

+
+
+
+
+
+
+
+

6. OPeNDAP Client

+
+
+

This section presents information about the parts of the OPeNDAP client, including a review of the available client software, from within as well as outside the OPeNDAP group. Developers interested in creating new OPeNDAP clients, as well as users who want to convert a program to a network-aware OPeNDAP client should read this chapter.

+
+
+

The OPeNDAP client is the program that sends a message to an OPeNDAP +server in order to get some data, or other information.

+
+
+

An OPeNDAP client is usually just a data analysis application program +modified to become a web browser, somewhat like any other web browser +with which you may be familiar. A web browser can only display the data +it receives, however. What makes an OPeNDAP client different from +other web browsers is that once the data has been received from an +OPeNDAP server, the OPeNDAP client application can perform computations with it.

+
+
+

Like a web browser, an OPeNDAP client accepts a URL from a user, and +sends a message to that address, asking for the information specified in +the the URL. Unlike a typical web browser, an OPeNDAP client will not +know what to do with data returned for a web page containing text and +pictures, but an OPeNDAP server will return scientific data that an +OPeNDAP client can understand and process.

+
+
+

There is a wide range of OPeNDAP clients available, and it should not be +hard to find one you can use. In fact, though it can become clumsy for advanced applications, you can use an ordinary web browser as a client to most OPeNDAP servers, making +use of the server’s WWW interface. +The Quick Start Guide contains several examples.

+
+
+

After a basic web browser, the simplest clients to use are likely to be +the programs you’re already using. If you use one of the popular data +analysis environments like Matlab or IDL, you can find a client command +you can incorporate into your environment to let you call OPeNDAP data +directly into your working data. If you use one of the netCDF-based +packages, like GrADS or Ferret, you can get a network-enabled version of +the program that will work with OPeNDAP URLs just as well as file names.

+
+
+

If none of those options work for you, there is a whole range of client +libraries you can use to develop a client of your own. Several of these +are supported by the OPeNDAP project, and there are others supported by other groups.

+
+
+

This page provides a list and very brief overview of the various +options, along with pointers to places you can find more information +about each one.

+
+
+

6.1. Clients

+
+

OPeNDAP clients come in a variety of forms. The simplest are web +browsers, who use the OPeNDAP +WWW interface and the ASCII +response to check out data sets and download data.

+
+
+

Beyond these, there are three categories of client. The first contains NetCDF Compliant +clients that you can use in conjunction with one of the popular data analysis +environments, the second is a collection of command-line clients useful +for scripting as well as testing, and the third contains a set of API +libraries you can use for developing your own client, or for converting +an existing body of code into an OPeNDAP client. These are reviewed in +that order below:

+
+
+

6.1.1. NetCDF Compliant Tools (e.g., Matlab, R, IDL, IDV, and Panoply)

+
+

Any tool that uses the C NetCDF API will work with OPeNDAP. For example, Matlab has built-in support for OPeNDAP; Matlab supported NetCDF calls can be used with DAP datasets. Other tools that are built on NetCDF API also read data from OPeNDAP servers. A free tool similar to Matlab, GNU Octave, is also supported. The R Project for Statistical Computing can also read data from OPeNDAP servers. The Ferret and +GrADS free data analysis packages both +support OPeNDAP. You can use these for dowloading OPeNDAP data and for +examining it afterwards. (There are limitations. For example, Ferret may not be able to read datasets served as Sequence data.)

+
+
+

Other tools, that are Java NetCDF compliant, also function with OPeNDAP clients; for example, IDV and Panoply.

+
+
+
Matlab
+
+

Matlab 2012a includes the netcdf 4.1.2 library with OPeNDAP support turned on. This means that any OPeNDAP-served dataset that can be read with common netcdf applications (Panoply, Ferret, GrADS, IDV, etc.) can now be read using Matlab.

+
+
+

The supported interface is based on the netCDF API, with some tweaks for Matlab’s scripting language. To get help on the netcdf interface, type 'help netcdf' at the Matlab prompt. The response is a summary with links to more information about netCDF suite of Matlab operations. Here is an example of a simple data access (note that the underlying file happens to be an HDF4 file, compressed with gzip - it could be anything OPeNDAP can serve):

+
+
+

To open a remote dataset, use its URL:

+
+
+
+
modis='http://test.opendap.org/dap/data/hdf/MOD08_D3.A2001153.003.2001207172930.hdf.gz';ncid = netcdf.open ( modis );
+
+
+
+

If you do not know what it contains, start by using the 'netcdf.inq' operation:

+
+
+
+
[numdims,numvars,numglobalatts,unlimdimid] = netcdf.inq(ncid);
+
+
+
+

How many variables are there?

+
+
+
+
>> numvars
+numvars = 666
+
+
+
+

Lets look at the fourth variable:

+
+
+
+
[name,xtype,dimids,natts] = netcdf.inqVar(ncid,3);
+>> name
+name = mod08.Data%20Fields.Scattering_Angle_Maximum
+
+
+
+

Now lets get values for 'Scattering_Angle_Maximum':

+
+
+
+
>> data = netcdf.getVar(ncid,3);
+>> data
+data =
+  Columns 1 through 22
+  -9999  11924  12044  12135  12226  12298  12386  12513  12619  12712  12820...
+  -9999  11942  12037  12128  12220  12313  12413  12518  12612  12720  12820...
+  -9999  11899  12019  12121  12214  12299  12418  12511  12621  12721  12823...
+...
+
+
+
+

How about subsetting and sampling those data? This pulls values at indices 2, 7 to indices 12, 15:

+
+
+
+
>> subsampled_data = netcdf.getVar(ncid, 3, [2,7],[10,8]);
+>> subsampled_data
+subsampled_data =
+  12511  12621  12721  12823  12916  13000  13077  13142
+  12521  12623  12727  12819  12909  12989  13055  13108
+  12524  12630  12724  12817  12900  12975  13032  13142
+  12525  12622  12721  12810  12889  12959  13056  13167
+  12533  12629  12725  12803  12878  12962  13071  13173
+  12533  12626  12712  12794  12875  12984  13091  13189
+  12531  12623  12705  12784  12889  12989  13106  13210
+  12523  12621  12708  12790  12896  13005  14806  13219
+  12529  12615  12938  12803  12911  13014  13117  13223
+  12525  12608  12711  12819  12914  13024  13124  13222
+
+
+
+

This quick demo just scratches the surface of what the inteface can do! And, of course, you can use it to read local files if you have those as well.

+
+
+
+
Panoply
+
+

Panoply plots geo-referenced and other arrays from netCDF, HDF, GRIB, and other datasets. With Panoply 4 (and later) you can Explore remote OpenDAP catalogs and open datasets served from them. For example, if you click File > Open > Open Remote Dataset and then enter http://test.opendap.org/opendap/hyrax/data/nc/coads_climatology.nc you will see this:

+
+
+
+Panoply +
+
Figure 6. An OPeNDAP Dataset Displayed in Panoply
+
+
+

If you then click, SEA SURFACE TEMPERATURE, you will see this:

+
+
+
+Panoply Graph +
+
Figure 7. Panoply Displaying OPeNDAP Data
+
+
+ + + + + +
+
Note
+
+Using the URL for the root of a server, you can open a dataset catalog and examine the entire contents of the server. +
+
+
+
+
+

6.1.2. Testing

+
+

There are a couple of command-line clients out there you can use, though +most people only use them for testing. Part of the libdap distribution +(the C interface) is a program called getdap, which takes an OPeNDAP +URL as a command-line argument and returns the reply to standard output. +This is typically used to check that the libdap C library is properly +compiled, but you can also use it to retrieve data.

+
+
+

Part of the OPeNDAP C library is a command-line client called octest. +This allows you to type commands to manipulate responses to an OPeNDAP +URL. Like the C++ test program, this can be construed as a test of the +library or a test of the servers, but it can also be used as a +command-line client, perhaps as an aid to automation.

+
+
+

Similar programs are part of the netCDF distribution. The ncdump program +outputs a "dump" of a netCDF file, and ncview provides a +better-formatted look at such a file. Since the standard netCDF library +can be linked to the OPeNDAP libraries, both these programs can be +readily aquired in their OPeNDAP-enabled form.

+
+
+

Here is a simple example, using the ncview program. This program simply +prints out the contents of a netCDF formatted data file, specified on +the command line, like this:

+
+
+
+
> ncdump fnocl.nc
+
+
+
+

Using OPeNDAP, this same function may be executed from any computer +connected to the Internet by substituting a URL for the filename above:

+
+
+
+
> ncdump http://dods.gso.uri.edu/cgi-bin/nc/data/fnocl.nc
+
+
+
+

Aside from the fact that the data is remote, and must be specified with +a URL, the program will seem to function in the same way it had with the +simple netCDF library (albeit somewhat more slowly due to having to make +network connections instead of local file operations).

+
+
+
+
netcdf fnocl {
+dimensions:
+    time_a = 16
+    lat = 17 ;
+    lon = 21 ;
+    time = 16 ;
+
+variables:
+    long u(time_a, lat, ion) ;
+        u:units = ``meter per second'' ;
+        u:long_name = ``Vector wind eastward component'' ;
+        u:missing_value = ``-32767'' ;
+        u:scale_factor = ``0.005'' ;
+    long v(time_a, lat, ion) ;
+        v:units = ``meter per second'' ;
+        v:long_name = ``Vector wind northward component'' ;
+        v:missing_value = ``-32767'' ;
+        v:scale_factor = ``0.005'' ;
+    double lat(lat) ;
+        lat:units = ``degree North'' ;
+    double lon(lon) ;
+        lon:units = ``degree East'' ;
+    double time(time) ;
+        time:units = ``hours from base_time'' ;
+
+// global attributes:
+        :base_time = ``88- 10-00:00:00'' ;
+        :title = ``FNOC UV wind components
+                           from 1988- 10 to 1988- 13.'' ;
+data:
+ u =
+  -1728, -2449, -3099, -3585, -3254, -2406, -1252,
+    662, 2483, 2910, 2819, 2946, 2745, 2734,
+  2931, 2601, 2139, 1845, 1754, 1897, 1854, -1686,
+...
+
+
+
+
+

6.1.3. Client Libraries

+
+

Several libraries exist that you can link with other software to create +an OPeNDAP client. Some of these are provided by the OPeNDAP project +itself, and some are projects of other groups.

+
+
+

The OPeNDAP libraries are functional equivalents of each other. They are +derived from separate code bases, but they do the same thing. They are +provided in different languages for the convenience of the implementer.

+
+
+
C++ Client Library
+
+

The http://opendap.org/download/libdap.html[C library], also called +libdap, was the original client implementation of the OPeNDAP protocol. +It provides classes to manage the connection between a client and a data +source, as well as classes for each of the data types, and the other +information (such as DAS and DDS) a client will encounter.

+
+
+

To use the library, you will need to provide implementations for some +abstract classes. Consult the libdap Overview for an introduction to the basic concepts behind the use of +this library. You will also find the +C++ library Reference +useful.

+
+
+
+
C Client Library
+
+

The OPeNDAP group supports a C library. The C library is in many ways a simpler library to use than +the C++ libdap, but it is not as flexible in other ways. Using the +library is straightforward, and you’ll find a file called +octutorial.html in the software release that provides a detailed example +of its use.

+
+
+
+
Java Client Library
+
+

The OPeNDAP group supports a +Java implementation of the +DAP. On the Java page, there are links to download the Java class +documentation.

+
+
+
+
netCDF API Library
+
+

The netCDF library deserves +special note. This is a drop-in replacement for the standard netCDF +library. (In fact, as of release 4.0, it is the standard netCDF +library.) This means that converting a program that depends on the +netCDF API to use OPeNDAP is as simple as re-linking with an updated +version of the netCDF library.

+
+
+

See the netCDF home page for information about how to use that library.

+
+
+
+
Python Library
+
+

Pydap is an implementation of the OPeNDAP client in +pure Python. This is tremendously useful for scripting complicated +applications with lots of download steps. This is not supported by the +OPeNDAP group, so please refer to the Pydap site for +more information about it.

+
+
+
+
JavaScript AJAX Client for DAP Services
+
+

This library is designed to enable URL based AJAX querying of DAP datasets.

+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/UserGuideComprehensive.pdf b/UserGuideComprehensive.pdf new file mode 100644 index 0000000..08b1b9f Binary files /dev/null and b/UserGuideComprehensive.pdf differ diff --git a/images/0_Editor_folding.png b/images/0_Editor_folding.png new file mode 100644 index 0000000..f531d21 Binary files /dev/null and b/images/0_Editor_folding.png differ diff --git a/images/0_GDB_Issues_with_shared_libs.png b/images/0_GDB_Issues_with_shared_libs.png new file mode 100644 index 0000000..7025015 Binary files /dev/null and b/images/0_GDB_Issues_with_shared_libs.png differ diff --git a/images/0_GDB_Suppres_auto_build_on_launch.png b/images/0_GDB_Suppres_auto_build_on_launch.png new file mode 100644 index 0000000..26b55bd Binary files /dev/null and b/images/0_GDB_Suppres_auto_build_on_launch.png differ diff --git a/images/0_Goto_includes_fir_project.png b/images/0_Goto_includes_fir_project.png new file mode 100644 index 0000000..3a5b4e0 Binary files /dev/null and b/images/0_Goto_includes_fir_project.png differ diff --git a/images/0_Import_Projects_2.png b/images/0_Import_Projects_2.png new file mode 100644 index 0000000..ea065ce Binary files /dev/null and b/images/0_Import_Projects_2.png differ diff --git a/images/0_Set_PATH_in_Eclipse.png b/images/0_Set_PATH_in_Eclipse.png new file mode 100644 index 0000000..23bf5f8 Binary files /dev/null and b/images/0_Set_PATH_in_Eclipse.png differ diff --git a/images/0_Set_autosave_on_build.png b/images/0_Set_autosave_on_build.png new file mode 100644 index 0000000..3850df5 Binary files /dev/null and b/images/0_Set_autosave_on_build.png differ diff --git a/images/0_make_target.png b/images/0_make_target.png new file mode 100644 index 0000000..b87a474 Binary files /dev/null and b/images/0_make_target.png differ diff --git a/images/1000px-ChunkedStreamReaderStateDiagram.png b/images/1000px-ChunkedStreamReaderStateDiagram.png new file mode 100644 index 0000000..edb020f Binary files /dev/null and b/images/1000px-ChunkedStreamReaderStateDiagram.png differ diff --git a/images/101px-DAP_4_DM_UML.png b/images/101px-DAP_4_DM_UML.png new file mode 100644 index 0000000..1912b13 Binary files /dev/null and b/images/101px-DAP_4_DM_UML.png differ diff --git a/images/101px-OLFS_current.png b/images/101px-OLFS_current.png new file mode 100644 index 0000000..74fccc2 Binary files /dev/null and b/images/101px-OLFS_current.png differ diff --git a/images/102px-DAP_4_DM_UML.png b/images/102px-DAP_4_DM_UML.png new file mode 100644 index 0000000..286ec4e Binary files /dev/null and b/images/102px-DAP_4_DM_UML.png differ diff --git a/images/102px-Reynolds_das.png b/images/102px-Reynolds_das.png new file mode 100644 index 0000000..83e0185 Binary files /dev/null and b/images/102px-Reynolds_das.png differ diff --git a/images/104px-Nest-attrtable.gif b/images/104px-Nest-attrtable.gif new file mode 100644 index 0000000..103abac Binary files /dev/null and b/images/104px-Nest-attrtable.gif differ diff --git a/images/106px-Reynolds_ifh.png b/images/106px-Reynolds_ifh.png new file mode 100644 index 0000000..c564bfd Binary files /dev/null and b/images/106px-Reynolds_ifh.png differ diff --git a/images/107px-Gsodock-html.png b/images/107px-Gsodock-html.png new file mode 100644 index 0000000..d5eb9a0 Binary files /dev/null and b/images/107px-Gsodock-html.png differ diff --git a/images/108px-DAP_2_DM_UML.png b/images/108px-DAP_2_DM_UML.png new file mode 100644 index 0000000..7e2370b Binary files /dev/null and b/images/108px-DAP_2_DM_UML.png differ diff --git a/images/110px-Hyrax_with_AMQP.png b/images/110px-Hyrax_with_AMQP.png new file mode 100644 index 0000000..0b37fa6 Binary files /dev/null and b/images/110px-Hyrax_with_AMQP.png differ diff --git a/images/115px-DAS.gif b/images/115px-DAS.gif new file mode 100644 index 0000000..040a0ea Binary files /dev/null and b/images/115px-DAS.gif differ diff --git a/images/118px-BuildingDDS.png b/images/118px-BuildingDDS.png new file mode 100644 index 0000000..b80bb06 Binary files /dev/null and b/images/118px-BuildingDDS.png differ diff --git a/images/1200px-CertAuth.png b/images/1200px-CertAuth.png new file mode 100644 index 0000000..186da05 Binary files /dev/null and b/images/1200px-CertAuth.png differ diff --git a/images/1200px-Hyrax-1.8-Catalog.png b/images/1200px-Hyrax-1.8-Catalog.png new file mode 100644 index 0000000..7c397bc Binary files /dev/null and b/images/1200px-Hyrax-1.8-Catalog.png differ diff --git a/images/1200px-Hyrax-2.0-Catalog.png b/images/1200px-Hyrax-2.0-Catalog.png new file mode 100644 index 0000000..13c3a25 Binary files /dev/null and b/images/1200px-Hyrax-2.0-Catalog.png differ diff --git a/images/1200px-OAuth2.png b/images/1200px-OAuth2.png new file mode 100644 index 0000000..6c0748b Binary files /dev/null and b/images/1200px-OAuth2.png differ diff --git a/images/1200px-WCS-UC1.1-ActivityDiagram.png b/images/1200px-WCS-UC1.1-ActivityDiagram.png new file mode 100644 index 0000000..1af988a Binary files /dev/null and b/images/1200px-WCS-UC1.1-ActivityDiagram.png differ diff --git a/images/1200px-WCS-Uc2.0.png b/images/1200px-WCS-Uc2.0.png new file mode 100644 index 0000000..ed63e20 Binary files /dev/null and b/images/1200px-WCS-Uc2.0.png differ diff --git a/images/1200px-WCS-Uc3.0.png b/images/1200px-WCS-Uc3.0.png new file mode 100644 index 0000000..8f8b210 Binary files /dev/null and b/images/1200px-WCS-Uc3.0.png differ diff --git a/images/120px-Attrtable.gif b/images/120px-Attrtable.gif new file mode 100644 index 0000000..a2eff70 Binary files /dev/null and b/images/120px-Attrtable.gif differ diff --git a/images/120px-Basic_PM_Window.png b/images/120px-Basic_PM_Window.png new file mode 100644 index 0000000..68c720c Binary files /dev/null and b/images/120px-Basic_PM_Window.png differ diff --git a/images/120px-BuildDASDDS.png b/images/120px-BuildDASDDS.png new file mode 100644 index 0000000..4c6eed5 Binary files /dev/null and b/images/120px-BuildDASDDS.png differ diff --git a/images/120px-BuildingDDS.png b/images/120px-BuildingDDS.png new file mode 100644 index 0000000..42b6266 Binary files /dev/null and b/images/120px-BuildingDDS.png differ diff --git a/images/120px-BuildonlyDDX.png b/images/120px-BuildonlyDDX.png new file mode 100644 index 0000000..d65a2fe Binary files /dev/null and b/images/120px-BuildonlyDDX.png differ diff --git a/images/120px-CertAuth.png b/images/120px-CertAuth.png new file mode 100644 index 0000000..d599742 Binary files /dev/null and b/images/120px-CertAuth.png differ diff --git a/images/120px-Check_paths.png b/images/120px-Check_paths.png new file mode 100644 index 0000000..e041a42 Binary files /dev/null and b/images/120px-Check_paths.png differ diff --git a/images/120px-ChunkedStreamReaderStateDiagram.png b/images/120px-ChunkedStreamReaderStateDiagram.png new file mode 100644 index 0000000..e19f104 Binary files /dev/null and b/images/120px-ChunkedStreamReaderStateDiagram.png differ diff --git a/images/120px-DAPAuthInteractive.png b/images/120px-DAPAuthInteractive.png new file mode 100644 index 0000000..8bc606f Binary files /dev/null and b/images/120px-DAPAuthInteractive.png differ diff --git a/images/120px-DescribeCoverage.png b/images/120px-DescribeCoverage.png new file mode 100644 index 0000000..9ca5a89 Binary files /dev/null and b/images/120px-DescribeCoverage.png differ diff --git a/images/120px-DirectoryView.png b/images/120px-DirectoryView.png new file mode 100644 index 0000000..7b4be3d Binary files /dev/null and b/images/120px-DirectoryView.png differ diff --git a/images/120px-Dm.png b/images/120px-Dm.png new file mode 100644 index 0000000..a49ed20 Binary files /dev/null and b/images/120px-Dm.png differ diff --git a/images/120px-Do_not_use_res.png b/images/120px-Do_not_use_res.png new file mode 100644 index 0000000..83715ad Binary files /dev/null and b/images/120px-Do_not_use_res.png differ diff --git a/images/120px-Edit_the_squid.conf_file.png b/images/120px-Edit_the_squid.conf_file.png new file mode 100644 index 0000000..ddfb527 Binary files /dev/null and b/images/120px-Edit_the_squid.conf_file.png differ diff --git a/images/120px-Ff1.jpg b/images/120px-Ff1.jpg new file mode 100644 index 0000000..de9e528 Binary files /dev/null and b/images/120px-Ff1.jpg differ diff --git a/images/120px-GSoC2011_300x200.png b/images/120px-GSoC2011_300x200.png new file mode 100644 index 0000000..142b118 Binary files /dev/null and b/images/120px-GSoC2011_300x200.png differ diff --git a/images/120px-GSoC2012_300x200.png b/images/120px-GSoC2012_300x200.png new file mode 100644 index 0000000..d432767 Binary files /dev/null and b/images/120px-GSoC2012_300x200.png differ diff --git a/images/120px-GSoC_2010_300x267px.jpg b/images/120px-GSoC_2010_300x267px.jpg new file mode 100644 index 0000000..68a5b23 Binary files /dev/null and b/images/120px-GSoC_2010_300x267px.jpg differ diff --git a/images/120px-Gateway_service.jpg b/images/120px-Gateway_service.jpg new file mode 100644 index 0000000..369e43d Binary files /dev/null and b/images/120px-Gateway_service.jpg differ diff --git a/images/120px-GetCoverage.png b/images/120px-GetCoverage.png new file mode 100644 index 0000000..3942237 Binary files /dev/null and b/images/120px-GetCoverage.png differ diff --git a/images/120px-Grid.gif b/images/120px-Grid.gif new file mode 100644 index 0000000..bbed3f4 Binary files /dev/null and b/images/120px-Grid.gif differ diff --git a/images/120px-Gridpts.gif b/images/120px-Gridpts.gif new file mode 100644 index 0000000..0bb913d Binary files /dev/null and b/images/120px-Gridpts.gif differ diff --git a/images/120px-Gsodock-das.png b/images/120px-Gsodock-das.png new file mode 100644 index 0000000..036de2f Binary files /dev/null and b/images/120px-Gsodock-das.png differ diff --git a/images/120px-Gsodock-dds.png b/images/120px-Gsodock-dds.png new file mode 100644 index 0000000..55c1acc Binary files /dev/null and b/images/120px-Gsodock-dds.png differ diff --git a/images/120px-Hai-Slide02.jpg b/images/120px-Hai-Slide02.jpg new file mode 100644 index 0000000..bef2348 Binary files /dev/null and b/images/120px-Hai-Slide02.jpg differ diff --git a/images/120px-Hai-Slide03.jpg b/images/120px-Hai-Slide03.jpg new file mode 100644 index 0000000..11453fb Binary files /dev/null and b/images/120px-Hai-Slide03.jpg differ diff --git a/images/120px-Hai-Slide04.jpg b/images/120px-Hai-Slide04.jpg new file mode 100644 index 0000000..1d339ba Binary files /dev/null and b/images/120px-Hai-Slide04.jpg differ diff --git a/images/120px-Hai-Slide05.jpg b/images/120px-Hai-Slide05.jpg new file mode 100644 index 0000000..d2b90f1 Binary files /dev/null and b/images/120px-Hai-Slide05.jpg differ diff --git a/images/120px-Hai-Slide06.jpg b/images/120px-Hai-Slide06.jpg new file mode 100644 index 0000000..2867158 Binary files /dev/null and b/images/120px-Hai-Slide06.jpg differ diff --git a/images/120px-Hai-Slide07.jpg b/images/120px-Hai-Slide07.jpg new file mode 100644 index 0000000..e533d08 Binary files /dev/null and b/images/120px-Hai-Slide07.jpg differ diff --git a/images/120px-Hai-Slide08.jpg b/images/120px-Hai-Slide08.jpg new file mode 100644 index 0000000..65a541d Binary files /dev/null and b/images/120px-Hai-Slide08.jpg differ diff --git a/images/120px-Hai-Slide09.jpg b/images/120px-Hai-Slide09.jpg new file mode 100644 index 0000000..29490d9 Binary files /dev/null and b/images/120px-Hai-Slide09.jpg differ diff --git a/images/120px-Hai-Slide10.jpg b/images/120px-Hai-Slide10.jpg new file mode 100644 index 0000000..d315679 Binary files /dev/null and b/images/120px-Hai-Slide10.jpg differ diff --git a/images/120px-Hai-Slide11.jpg b/images/120px-Hai-Slide11.jpg new file mode 100644 index 0000000..773b12f Binary files /dev/null and b/images/120px-Hai-Slide11.jpg differ diff --git a/images/120px-Hai-Slide12.jpg b/images/120px-Hai-Slide12.jpg new file mode 100644 index 0000000..766055e Binary files /dev/null and b/images/120px-Hai-Slide12.jpg differ diff --git a/images/120px-Hai-Slide13.jpg b/images/120px-Hai-Slide13.jpg new file mode 100644 index 0000000..b8d0ae1 Binary files /dev/null and b/images/120px-Hai-Slide13.jpg differ diff --git a/images/120px-Hai-Slide14.jpg b/images/120px-Hai-Slide14.jpg new file mode 100644 index 0000000..69827ad Binary files /dev/null and b/images/120px-Hai-Slide14.jpg differ diff --git a/images/120px-Hai-Slide15.jpg b/images/120px-Hai-Slide15.jpg new file mode 100644 index 0000000..a247205 Binary files /dev/null and b/images/120px-Hai-Slide15.jpg differ diff --git a/images/120px-Hai-Slide16.jpg b/images/120px-Hai-Slide16.jpg new file mode 100644 index 0000000..7d093ad Binary files /dev/null and b/images/120px-Hai-Slide16.jpg differ diff --git a/images/120px-Hai-Slide17.jpg b/images/120px-Hai-Slide17.jpg new file mode 100644 index 0000000..3689b7f Binary files /dev/null and b/images/120px-Hai-Slide17.jpg differ diff --git a/images/120px-Hai-Slide18.jpg b/images/120px-Hai-Slide18.jpg new file mode 100644 index 0000000..36a96b2 Binary files /dev/null and b/images/120px-Hai-Slide18.jpg differ diff --git a/images/120px-Hyrax-1.8-Catalog.png b/images/120px-Hyrax-1.8-Catalog.png new file mode 100644 index 0000000..c5cd420 Binary files /dev/null and b/images/120px-Hyrax-1.8-Catalog.png differ diff --git a/images/120px-Hyrax-2.0-Catalog.png b/images/120px-Hyrax-2.0-Catalog.png new file mode 100644 index 0000000..8e2416c Binary files /dev/null and b/images/120px-Hyrax-2.0-Catalog.png differ diff --git a/images/120px-HyraxArchitecture.jpg b/images/120px-HyraxArchitecture.jpg new file mode 100644 index 0000000..6ba0ea3 Binary files /dev/null and b/images/120px-HyraxArchitecture.jpg differ diff --git a/images/120px-HyraxWcsPrototype.png b/images/120px-HyraxWcsPrototype.png new file mode 100644 index 0000000..3a2bde7 Binary files /dev/null and b/images/120px-HyraxWcsPrototype.png differ diff --git a/images/120px-Iess_dat_asc.png b/images/120px-Iess_dat_asc.png new file mode 100644 index 0000000..5c9a69a Binary files /dev/null and b/images/120px-Iess_dat_asc.png differ diff --git a/images/120px-Iess_dat_das.png b/images/120px-Iess_dat_das.png new file mode 100644 index 0000000..1d879ef Binary files /dev/null and b/images/120px-Iess_dat_das.png differ diff --git a/images/120px-Iess_dat_dds.png b/images/120px-Iess_dat_dds.png new file mode 100644 index 0000000..c849ea5 Binary files /dev/null and b/images/120px-Iess_dat_dds.png differ diff --git a/images/120px-Iess_location_das.png b/images/120px-Iess_location_das.png new file mode 100644 index 0000000..37a79b6 Binary files /dev/null and b/images/120px-Iess_location_das.png differ diff --git a/images/120px-Iess_location_dds.png b/images/120px-Iess_location_dds.png new file mode 100644 index 0000000..6c44d16 Binary files /dev/null and b/images/120px-Iess_location_dds.png differ diff --git a/images/120px-Memory_stick_2.png b/images/120px-Memory_stick_2.png new file mode 100644 index 0000000..ce1fd59 Binary files /dev/null and b/images/120px-Memory_stick_2.png differ diff --git a/images/120px-NcML_Activity_diagram.png b/images/120px-NcML_Activity_diagram.png new file mode 100644 index 0000000..f6bac7b Binary files /dev/null and b/images/120px-NcML_Activity_diagram.png differ diff --git a/images/120px-Netcdf1.jpg b/images/120px-Netcdf1.jpg new file mode 100644 index 0000000..4240c6a Binary files /dev/null and b/images/120px-Netcdf1.jpg differ diff --git a/images/120px-Netcdf4.jpg b/images/120px-Netcdf4.jpg new file mode 100644 index 0000000..d12ac57 Binary files /dev/null and b/images/120px-Netcdf4.jpg differ diff --git a/images/120px-Noaa-logo.jpg b/images/120px-Noaa-logo.jpg new file mode 100644 index 0000000..ccded2d Binary files /dev/null and b/images/120px-Noaa-logo.jpg differ diff --git a/images/120px-Nsf-logo.png b/images/120px-Nsf-logo.png new file mode 100644 index 0000000..b0a2977 Binary files /dev/null and b/images/120px-Nsf-logo.png differ diff --git a/images/120px-OAuth2.png b/images/120px-OAuth2.png new file mode 100644 index 0000000..4bc75d2 Binary files /dev/null and b/images/120px-OAuth2.png differ diff --git a/images/120px-OLFS_new_AMQP.png b/images/120px-OLFS_new_AMQP.png new file mode 100644 index 0000000..b04d518 Binary files /dev/null and b/images/120px-OLFS_new_AMQP.png differ diff --git a/images/120px-OLFS_new_servlet.png b/images/120px-OLFS_new_servlet.png new file mode 100644 index 0000000..7359dac Binary files /dev/null and b/images/120px-OLFS_new_servlet.png differ diff --git a/images/120px-OPeNDAP-Logo_Large.png b/images/120px-OPeNDAP-Logo_Large.png new file mode 100644 index 0000000..f4a22cf Binary files /dev/null and b/images/120px-OPeNDAP-Logo_Large.png differ diff --git a/images/120px-Opendap_logo_masthead.gif b/images/120px-Opendap_logo_masthead.gif new file mode 100644 index 0000000..ab3e41d Binary files /dev/null and b/images/120px-Opendap_logo_masthead.gif differ diff --git a/images/120px-ParsingConstraintExpression.png b/images/120px-ParsingConstraintExpression.png new file mode 100644 index 0000000..516bcd9 Binary files /dev/null and b/images/120px-ParsingConstraintExpression.png differ diff --git a/images/120px-Ps_bathymetry.png b/images/120px-Ps_bathymetry.png new file mode 100644 index 0000000..e8934ad Binary files /dev/null and b/images/120px-Ps_bathymetry.png differ diff --git a/images/120px-Ps_bathymetry_index.png b/images/120px-Ps_bathymetry_index.png new file mode 100644 index 0000000..95470d9 Binary files /dev/null and b/images/120px-Ps_bathymetry_index.png differ diff --git a/images/120px-Ps_bathymetry_intermediate1.png b/images/120px-Ps_bathymetry_intermediate1.png new file mode 100644 index 0000000..22bb5dc Binary files /dev/null and b/images/120px-Ps_bathymetry_intermediate1.png differ diff --git a/images/120px-Ps_sst.png b/images/120px-Ps_sst.png new file mode 100644 index 0000000..c571e2b Binary files /dev/null and b/images/120px-Ps_sst.png differ diff --git a/images/120px-Ps_sst_index.png b/images/120px-Ps_sst_index.png new file mode 100644 index 0000000..99698e6 Binary files /dev/null and b/images/120px-Ps_sst_index.png differ diff --git a/images/120px-Ps_weather.png b/images/120px-Ps_weather.png new file mode 100644 index 0000000..cf60761 Binary files /dev/null and b/images/120px-Ps_weather.png differ diff --git a/images/120px-Ps_weather_index.png b/images/120px-Ps_weather_index.png new file mode 100644 index 0000000..ff91d62 Binary files /dev/null and b/images/120px-Ps_weather_index.png differ diff --git a/images/120px-Ps_weather_intermediate.png b/images/120px-Ps_weather_intermediate.png new file mode 100644 index 0000000..893ac70 Binary files /dev/null and b/images/120px-Ps_weather_intermediate.png differ diff --git a/images/120px-RDH_StaticClasses.png b/images/120px-RDH_StaticClasses.png new file mode 100644 index 0000000..bbddf16 Binary files /dev/null and b/images/120px-RDH_StaticClasses.png differ diff --git a/images/120px-REAP_Cataloging_Deployment.png b/images/120px-REAP_Cataloging_Deployment.png new file mode 100644 index 0000000..b0201ce Binary files /dev/null and b/images/120px-REAP_Cataloging_Deployment.png differ diff --git a/images/120px-Regular.jpg b/images/120px-Regular.jpg new file mode 100644 index 0000000..62a7f8e Binary files /dev/null and b/images/120px-Regular.jpg differ diff --git a/images/120px-Release_branching.png b/images/120px-Release_branching.png new file mode 100644 index 0000000..819c228 Binary files /dev/null and b/images/120px-Release_branching.png differ diff --git a/images/120px-Restart_none.png b/images/120px-Restart_none.png new file mode 100644 index 0000000..ff3c24b Binary files /dev/null and b/images/120px-Restart_none.png differ diff --git a/images/120px-Reynolds_dds.png b/images/120px-Reynolds_dds.png new file mode 100644 index 0000000..1f64116 Binary files /dev/null and b/images/120px-Reynolds_dds.png differ diff --git a/images/120px-Reynolds_ifh.png b/images/120px-Reynolds_ifh.png new file mode 100644 index 0000000..830a247 Binary files /dev/null and b/images/120px-Reynolds_ifh.png differ diff --git a/images/120px-Reynolds_ifh_Action.png b/images/120px-Reynolds_ifh_Action.png new file mode 100644 index 0000000..1da5cba Binary files /dev/null and b/images/120px-Reynolds_ifh_Action.png differ diff --git a/images/120px-Reynolds_sst.png b/images/120px-Reynolds_sst.png new file mode 100644 index 0000000..2283637 Binary files /dev/null and b/images/120px-Reynolds_sst.png differ diff --git a/images/120px-Reynolds_sst_geogrid.png b/images/120px-Reynolds_sst_geogrid.png new file mode 100644 index 0000000..dc368c5 Binary files /dev/null and b/images/120px-Reynolds_sst_geogrid.png differ diff --git a/images/120px-Reynolds_sst_linear_scale_geogrid.png b/images/120px-Reynolds_sst_linear_scale_geogrid.png new file mode 100644 index 0000000..2092e2e Binary files /dev/null and b/images/120px-Reynolds_sst_linear_scale_geogrid.png differ diff --git a/images/120px-Reynolds_time_vector.png b/images/120px-Reynolds_time_vector.png new file mode 100644 index 0000000..d91c7aa Binary files /dev/null and b/images/120px-Reynolds_time_vector.png differ diff --git a/images/120px-Screen_Shot_2013-09-12_at_2.00.11_PM.png b/images/120px-Screen_Shot_2013-09-12_at_2.00.11_PM.png new file mode 100644 index 0000000..40d044d Binary files /dev/null and b/images/120px-Screen_Shot_2013-09-12_at_2.00.11_PM.png differ diff --git a/images/120px-Screen_Shot_2013-09-12_at_2.00.20_PM.png b/images/120px-Screen_Shot_2013-09-12_at_2.00.20_PM.png new file mode 100644 index 0000000..2cef8df Binary files /dev/null and b/images/120px-Screen_Shot_2013-09-12_at_2.00.20_PM.png differ diff --git a/images/120px-Screen_Shot_2014-08-11_at_12.34.19_PM.png b/images/120px-Screen_Shot_2014-08-11_at_12.34.19_PM.png new file mode 100644 index 0000000..3cf4399 Binary files /dev/null and b/images/120px-Screen_Shot_2014-08-11_at_12.34.19_PM.png differ diff --git a/images/120px-ServiceDescriptionPrototype-01.png b/images/120px-ServiceDescriptionPrototype-01.png new file mode 100644 index 0000000..d3ef322 Binary files /dev/null and b/images/120px-ServiceDescriptionPrototype-01.png differ diff --git a/images/120px-Squid_1.png b/images/120px-Squid_1.png new file mode 100644 index 0000000..9c4aa79 Binary files /dev/null and b/images/120px-Squid_1.png differ diff --git a/images/120px-Squid_2.png b/images/120px-Squid_2.png new file mode 100644 index 0000000..7c729e4 Binary files /dev/null and b/images/120px-Squid_2.png differ diff --git a/images/120px-Squid_3.png b/images/120px-Squid_3.png new file mode 100644 index 0000000..1b0a0c7 Binary files /dev/null and b/images/120px-Squid_3.png differ diff --git a/images/120px-Ss_datasetlist.png b/images/120px-Ss_datasetlist.png new file mode 100644 index 0000000..545bacd Binary files /dev/null and b/images/120px-Ss_datasetlist.png differ diff --git a/images/120px-Ss_gcmd.png b/images/120px-Ss_gcmd.png new file mode 100644 index 0000000..9f961d8 Binary files /dev/null and b/images/120px-Ss_gcmd.png differ diff --git a/images/120px-Ss_geospatial.png b/images/120px-Ss_geospatial.png new file mode 100644 index 0000000..af19a4f Binary files /dev/null and b/images/120px-Ss_geospatial.png differ diff --git a/images/120px-Ss_navigation.png b/images/120px-Ss_navigation.png new file mode 100644 index 0000000..fd39a49 Binary files /dev/null and b/images/120px-Ss_navigation.png differ diff --git a/images/120px-Ss_retrieval.png b/images/120px-Ss_retrieval.png new file mode 100644 index 0000000..a7320c9 Binary files /dev/null and b/images/120px-Ss_retrieval.png differ diff --git a/images/120px-Ss_view_plot.png b/images/120px-Ss_view_plot.png new file mode 100644 index 0000000..3af0231 Binary files /dev/null and b/images/120px-Ss_view_plot.png differ diff --git a/images/120px-Test.oopendap.org_directory_view.png b/images/120px-Test.oopendap.org_directory_view.png new file mode 100644 index 0000000..897285a Binary files /dev/null and b/images/120px-Test.oopendap.org_directory_view.png differ diff --git a/images/120px-TopDir.png b/images/120px-TopDir.png new file mode 100644 index 0000000..ea37de9 Binary files /dev/null and b/images/120px-TopDir.png differ diff --git a/images/120px-TopDir2.png b/images/120px-TopDir2.png new file mode 100644 index 0000000..6db2549 Binary files /dev/null and b/images/120px-TopDir2.png differ diff --git a/images/120px-VM_snapshots.png b/images/120px-VM_snapshots.png new file mode 100644 index 0000000..77a6c69 Binary files /dev/null and b/images/120px-VM_snapshots.png differ diff --git a/images/120px-WCS-UC1.0-ActivityDiagram.png b/images/120px-WCS-UC1.0-ActivityDiagram.png new file mode 100644 index 0000000..4de545b Binary files /dev/null and b/images/120px-WCS-UC1.0-ActivityDiagram.png differ diff --git a/images/120px-WCS-UC1.1-ActivityDiagram.png b/images/120px-WCS-UC1.1-ActivityDiagram.png new file mode 100644 index 0000000..6f57f02 Binary files /dev/null and b/images/120px-WCS-UC1.1-ActivityDiagram.png differ diff --git a/images/120px-WCS-Uc2.0.png b/images/120px-WCS-Uc2.0.png new file mode 100644 index 0000000..36f3761 Binary files /dev/null and b/images/120px-WCS-Uc2.0.png differ diff --git a/images/120px-WCS-Uc3.0.png b/images/120px-WCS-Uc3.0.png new file mode 100644 index 0000000..ae050e8 Binary files /dev/null and b/images/120px-WCS-Uc3.0.png differ diff --git a/images/120px-WCS_packages_high_level.png b/images/120px-WCS_packages_high_level.png new file mode 100644 index 0000000..7d0678a Binary files /dev/null and b/images/120px-WCS_packages_high_level.png differ diff --git a/images/1275px-DAPAuthClientCerts.png b/images/1275px-DAPAuthClientCerts.png new file mode 100644 index 0000000..60365a2 Binary files /dev/null and b/images/1275px-DAPAuthClientCerts.png differ diff --git a/images/1275px-DAPAuthInteractive.png b/images/1275px-DAPAuthInteractive.png new file mode 100644 index 0000000..b979099 Binary files /dev/null and b/images/1275px-DAPAuthInteractive.png differ diff --git a/images/1280px-BuildingDDS.png b/images/1280px-BuildingDDS.png new file mode 100644 index 0000000..981d8ca Binary files /dev/null and b/images/1280px-BuildingDDS.png differ diff --git a/images/1280px-ParsingConstraintExpression.png b/images/1280px-ParsingConstraintExpression.png new file mode 100644 index 0000000..0dab0dc Binary files /dev/null and b/images/1280px-ParsingConstraintExpression.png differ diff --git a/images/1280px-RDH_StaticClasses.png b/images/1280px-RDH_StaticClasses.png new file mode 100644 index 0000000..ce80d5b Binary files /dev/null and b/images/1280px-RDH_StaticClasses.png differ diff --git a/images/135px-Noaa-logo.jpg b/images/135px-Noaa-logo.jpg new file mode 100644 index 0000000..1054cc5 Binary files /dev/null and b/images/135px-Noaa-logo.jpg differ diff --git a/images/143px-Nsf-logo.png b/images/143px-Nsf-logo.png new file mode 100644 index 0000000..9b1bd5b Binary files /dev/null and b/images/143px-Nsf-logo.png differ diff --git a/images/1500px-ChunkedStreamReaderStateDiagram.png b/images/1500px-ChunkedStreamReaderStateDiagram.png new file mode 100644 index 0000000..0fcbc0b Binary files /dev/null and b/images/1500px-ChunkedStreamReaderStateDiagram.png differ diff --git a/images/1700px-DAPAuthClientCerts.png b/images/1700px-DAPAuthClientCerts.png new file mode 100644 index 0000000..90d66e6 Binary files /dev/null and b/images/1700px-DAPAuthClientCerts.png differ diff --git a/images/1700px-DAPAuthInteractive.png b/images/1700px-DAPAuthInteractive.png new file mode 100644 index 0000000..9d930cb Binary files /dev/null and b/images/1700px-DAPAuthInteractive.png differ diff --git a/images/180px-DAP4_DataDDX_Design_1.png b/images/180px-DAP4_DataDDX_Design_1.png new file mode 100644 index 0000000..2df7407 Binary files /dev/null and b/images/180px-DAP4_DataDDX_Design_1.png differ diff --git a/images/180px-Gateway_service.jpg b/images/180px-Gateway_service.jpg new file mode 100644 index 0000000..161ef79 Binary files /dev/null and b/images/180px-Gateway_service.jpg differ diff --git a/images/180px-HyraxArchitecture.jpg b/images/180px-HyraxArchitecture.jpg new file mode 100644 index 0000000..f21707e Binary files /dev/null and b/images/180px-HyraxArchitecture.jpg differ diff --git a/images/180px-Hyrax_with_AMQP.png b/images/180px-Hyrax_with_AMQP.png new file mode 100644 index 0000000..88858b8 Binary files /dev/null and b/images/180px-Hyrax_with_AMQP.png differ diff --git a/images/180px-Noaa-logo.jpg b/images/180px-Noaa-logo.jpg new file mode 100644 index 0000000..b1ab3ae Binary files /dev/null and b/images/180px-Noaa-logo.jpg differ diff --git a/images/180px-VM_snapshots.png b/images/180px-VM_snapshots.png new file mode 100644 index 0000000..df9e443 Binary files /dev/null and b/images/180px-VM_snapshots.png differ diff --git a/images/1_Add_directory_workspace_path.png b/images/1_Add_directory_workspace_path.png new file mode 100644 index 0000000..5e74855 Binary files /dev/null and b/images/1_Add_directory_workspace_path.png differ diff --git a/images/1_Add_the_prefix_var_to_project.png b/images/1_Add_the_prefix_var_to_project.png new file mode 100644 index 0000000..6976884 Binary files /dev/null and b/images/1_Add_the_prefix_var_to_project.png differ diff --git a/images/1_GDB_Issues_cont.png b/images/1_GDB_Issues_cont.png new file mode 100644 index 0000000..915fc59 Binary files /dev/null and b/images/1_GDB_Issues_cont.png differ diff --git a/images/1_configure_new_make_target.png b/images/1_configure_new_make_target.png new file mode 100644 index 0000000..3061f02 Binary files /dev/null and b/images/1_configure_new_make_target.png differ diff --git a/images/1_editor_folding.png b/images/1_editor_folding.png new file mode 100644 index 0000000..b4928ce Binary files /dev/null and b/images/1_editor_folding.png differ diff --git a/images/2007-02-DevelopersMeeting.pdf b/images/2007-02-DevelopersMeeting.pdf new file mode 100644 index 0000000..6a8f141 Binary files /dev/null and b/images/2007-02-DevelopersMeeting.pdf differ diff --git a/images/20070323204650!TopDir.png b/images/20070323204650!TopDir.png new file mode 100644 index 0000000..0a2094a Binary files /dev/null and b/images/20070323204650!TopDir.png differ diff --git a/images/20070323210933!TopDir2.png b/images/20070323210933!TopDir2.png new file mode 100644 index 0000000..2aa3091 Binary files /dev/null and b/images/20070323210933!TopDir2.png differ diff --git a/images/20081031163724!Test.oopendap.org_directory_view.png b/images/20081031163724!Test.oopendap.org_directory_view.png new file mode 100644 index 0000000..42af817 Binary files /dev/null and b/images/20081031163724!Test.oopendap.org_directory_view.png differ diff --git a/images/20090414195927!BuildDASDDS.png b/images/20090414195927!BuildDASDDS.png new file mode 100644 index 0000000..d2f191c Binary files /dev/null and b/images/20090414195927!BuildDASDDS.png differ diff --git a/images/20090414200709!BuildonlyDDX.png b/images/20090414200709!BuildonlyDDX.png new file mode 100644 index 0000000..d2f191c Binary files /dev/null and b/images/20090414200709!BuildonlyDDX.png differ diff --git a/images/20090427192206!REAP_Cataloging_Deployment.png b/images/20090427192206!REAP_Cataloging_Deployment.png new file mode 100644 index 0000000..bd06092 Binary files /dev/null and b/images/20090427192206!REAP_Cataloging_Deployment.png differ diff --git a/images/20090430224618!REAP_Cataloging_Deployment.png b/images/20090430224618!REAP_Cataloging_Deployment.png new file mode 100644 index 0000000..f604437 Binary files /dev/null and b/images/20090430224618!REAP_Cataloging_Deployment.png differ diff --git a/images/20090505224959!BuildingDDS.png b/images/20090505224959!BuildingDDS.png new file mode 100644 index 0000000..a86db6d Binary files /dev/null and b/images/20090505224959!BuildingDDS.png differ diff --git a/images/20090505225553!BuildingDDS.png b/images/20090505225553!BuildingDDS.png new file mode 100644 index 0000000..c598bdb Binary files /dev/null and b/images/20090505225553!BuildingDDS.png differ diff --git a/images/20090505230355!BuildingDDS.png b/images/20090505230355!BuildingDDS.png new file mode 100644 index 0000000..2959b03 Binary files /dev/null and b/images/20090505230355!BuildingDDS.png differ diff --git a/images/20090505231402!BuildingDDS.png b/images/20090505231402!BuildingDDS.png new file mode 100644 index 0000000..2959b03 Binary files /dev/null and b/images/20090505231402!BuildingDDS.png differ diff --git a/images/20090506143828!Reynolds_dds.png b/images/20090506143828!Reynolds_dds.png new file mode 100644 index 0000000..aa5e0c2 Binary files /dev/null and b/images/20090506143828!Reynolds_dds.png differ diff --git a/images/20090506160134!Reynolds_das.png b/images/20090506160134!Reynolds_das.png new file mode 100644 index 0000000..4322cd3 Binary files /dev/null and b/images/20090506160134!Reynolds_das.png differ diff --git a/images/20090506173048!RDH_StaticClasses.png b/images/20090506173048!RDH_StaticClasses.png new file mode 100644 index 0000000..c992025 Binary files /dev/null and b/images/20090506173048!RDH_StaticClasses.png differ diff --git a/images/20090506202245!RDH_ActivityDiagram.png b/images/20090506202245!RDH_ActivityDiagram.png new file mode 100644 index 0000000..c301ad8 Binary files /dev/null and b/images/20090506202245!RDH_ActivityDiagram.png differ diff --git a/images/20090506220120!BuildingDDS.png b/images/20090506220120!BuildingDDS.png new file mode 100644 index 0000000..c45eac2 Binary files /dev/null and b/images/20090506220120!BuildingDDS.png differ diff --git a/images/20090506220154!ParsingConstraintExpression.png b/images/20090506220154!ParsingConstraintExpression.png new file mode 100644 index 0000000..2c4c937 Binary files /dev/null and b/images/20090506220154!ParsingConstraintExpression.png differ diff --git a/images/20090506220232!RDH_StaticClasses.png b/images/20090506220232!RDH_StaticClasses.png new file mode 100644 index 0000000..6d3f206 Binary files /dev/null and b/images/20090506220232!RDH_StaticClasses.png differ diff --git a/images/20090506220616!RDH_StaticClasses.png b/images/20090506220616!RDH_StaticClasses.png new file mode 100644 index 0000000..7a04251 Binary files /dev/null and b/images/20090506220616!RDH_StaticClasses.png differ diff --git a/images/20090522203606!DAP_4_DM_UML.png b/images/20090522203606!DAP_4_DM_UML.png new file mode 100644 index 0000000..a3a325d Binary files /dev/null and b/images/20090522203606!DAP_4_DM_UML.png differ diff --git a/images/20090611225155!DAP_4_DM_UML.png b/images/20090611225155!DAP_4_DM_UML.png new file mode 100644 index 0000000..09519e4 Binary files /dev/null and b/images/20090611225155!DAP_4_DM_UML.png differ diff --git a/images/20090611225614!DAP_4_DM_UML.png b/images/20090611225614!DAP_4_DM_UML.png new file mode 100644 index 0000000..48b70ee Binary files /dev/null and b/images/20090611225614!DAP_4_DM_UML.png differ diff --git a/images/20090812192222!DAP4_DataDDX_Design_2.png b/images/20090812192222!DAP4_DataDDX_Design_2.png new file mode 100644 index 0000000..4c8401f Binary files /dev/null and b/images/20090812192222!DAP4_DataDDX_Design_2.png differ diff --git a/images/20090812193112!DAP4_DataDDX_Design_2.png b/images/20090812193112!DAP4_DataDDX_Design_2.png new file mode 100644 index 0000000..0662321 Binary files /dev/null and b/images/20090812193112!DAP4_DataDDX_Design_2.png differ diff --git a/images/20090812193134!DAP4_DataDDX_Design_1.png b/images/20090812193134!DAP4_DataDDX_Design_1.png new file mode 100644 index 0000000..3a31202 Binary files /dev/null and b/images/20090812193134!DAP4_DataDDX_Design_1.png differ diff --git a/images/20090814185029!Reynolds_time_vector.png b/images/20090814185029!Reynolds_time_vector.png new file mode 100644 index 0000000..25558a5 Binary files /dev/null and b/images/20090814185029!Reynolds_time_vector.png differ diff --git a/images/20090814185416!Reynolds_sst.png b/images/20090814185416!Reynolds_sst.png new file mode 100644 index 0000000..54f26b0 Binary files /dev/null and b/images/20090814185416!Reynolds_sst.png differ diff --git a/images/20090814195927!Reynolds_sst_geogrid.png b/images/20090814195927!Reynolds_sst_geogrid.png new file mode 100644 index 0000000..e2e04b1 Binary files /dev/null and b/images/20090814195927!Reynolds_sst_geogrid.png differ diff --git a/images/20090825211138!Reynolds_ifh.png b/images/20090825211138!Reynolds_ifh.png new file mode 100644 index 0000000..899a3a4 Binary files /dev/null and b/images/20090825211138!Reynolds_ifh.png differ diff --git a/images/20090907225714!Reynolds_ifh_Action.png b/images/20090907225714!Reynolds_ifh_Action.png new file mode 100644 index 0000000..88d0837 Binary files /dev/null and b/images/20090907225714!Reynolds_ifh_Action.png differ diff --git a/images/20090907230344!Reynolds_ifh_Action.png b/images/20090907230344!Reynolds_ifh_Action.png new file mode 100644 index 0000000..27985a6 Binary files /dev/null and b/images/20090907230344!Reynolds_ifh_Action.png differ diff --git a/images/20090908000337!Test.oopendap.org_directory_view.png b/images/20090908000337!Test.oopendap.org_directory_view.png new file mode 100644 index 0000000..42af817 Binary files /dev/null and b/images/20090908000337!Test.oopendap.org_directory_view.png differ diff --git a/images/20090915191639!Unlinked.png b/images/20090915191639!Unlinked.png new file mode 100644 index 0000000..32ec1f4 Binary files /dev/null and b/images/20090915191639!Unlinked.png differ diff --git a/images/20090925183454!Connect_proposed_asynchronous_processing.png b/images/20090925183454!Connect_proposed_asynchronous_processing.png new file mode 100644 index 0000000..01b69e4 Binary files /dev/null and b/images/20090925183454!Connect_proposed_asynchronous_processing.png differ diff --git a/images/20090925184439!Connect_proposed_asynchronous_processing.png b/images/20090925184439!Connect_proposed_asynchronous_processing.png new file mode 100644 index 0000000..01b69e4 Binary files /dev/null and b/images/20090925184439!Connect_proposed_asynchronous_processing.png differ diff --git a/images/20090925184500!Connect_synchronous_processing.png b/images/20090925184500!Connect_synchronous_processing.png new file mode 100644 index 0000000..01b69e4 Binary files /dev/null and b/images/20090925184500!Connect_synchronous_processing.png differ diff --git a/images/20091001180520!Unlinked.png b/images/20091001180520!Unlinked.png new file mode 100644 index 0000000..1ae0824 Binary files /dev/null and b/images/20091001180520!Unlinked.png differ diff --git a/images/20091001180640!Linked.png b/images/20091001180640!Linked.png new file mode 100644 index 0000000..bd1f005 Binary files /dev/null and b/images/20091001180640!Linked.png differ diff --git a/images/20091001180905!Linked.png b/images/20091001180905!Linked.png new file mode 100644 index 0000000..1b653f1 Binary files /dev/null and b/images/20091001180905!Linked.png differ diff --git a/images/200px-BuildDASDDS.png b/images/200px-BuildDASDDS.png new file mode 100644 index 0000000..2512e29 Binary files /dev/null and b/images/200px-BuildDASDDS.png differ diff --git a/images/200px-BuildonlyDDX.png b/images/200px-BuildonlyDDX.png new file mode 100644 index 0000000..de485d0 Binary files /dev/null and b/images/200px-BuildonlyDDX.png differ diff --git a/images/200px-DirectoryView.png b/images/200px-DirectoryView.png new file mode 100644 index 0000000..d074732 Binary files /dev/null and b/images/200px-DirectoryView.png differ diff --git a/images/200px-Edit_the_squid.conf_file.png b/images/200px-Edit_the_squid.conf_file.png new file mode 100644 index 0000000..7989836 Binary files /dev/null and b/images/200px-Edit_the_squid.conf_file.png differ diff --git a/images/200px-Memory_stick_2.png b/images/200px-Memory_stick_2.png new file mode 100644 index 0000000..9b93add Binary files /dev/null and b/images/200px-Memory_stick_2.png differ diff --git a/images/200px-Screen_Shot_2013-09-12_at_2.00.11_PM.png b/images/200px-Screen_Shot_2013-09-12_at_2.00.11_PM.png new file mode 100644 index 0000000..da8e1e6 Binary files /dev/null and b/images/200px-Screen_Shot_2013-09-12_at_2.00.11_PM.png differ diff --git a/images/200px-Screen_Shot_2013-09-12_at_2.00.20_PM.png b/images/200px-Screen_Shot_2013-09-12_at_2.00.20_PM.png new file mode 100644 index 0000000..5ebe4a2 Binary files /dev/null and b/images/200px-Screen_Shot_2013-09-12_at_2.00.20_PM.png differ diff --git a/images/200px-Squid_1.png b/images/200px-Squid_1.png new file mode 100644 index 0000000..dd0777f Binary files /dev/null and b/images/200px-Squid_1.png differ diff --git a/images/200px-Squid_2.png b/images/200px-Squid_2.png new file mode 100644 index 0000000..900272f Binary files /dev/null and b/images/200px-Squid_2.png differ diff --git a/images/200px-Squid_3.png b/images/200px-Squid_3.png new file mode 100644 index 0000000..0395a99 Binary files /dev/null and b/images/200px-Squid_3.png differ diff --git a/images/20110914190030!OAuth2.png b/images/20110914190030!OAuth2.png new file mode 100644 index 0000000..9fc6720 Binary files /dev/null and b/images/20110914190030!OAuth2.png differ diff --git a/images/20120411233758!Hyrax-2.0-Catalog.png b/images/20120411233758!Hyrax-2.0-Catalog.png new file mode 100644 index 0000000..cdec3fe Binary files /dev/null and b/images/20120411233758!Hyrax-2.0-Catalog.png differ diff --git a/images/20120412013818!Hyrax-2.0-Catalog.png b/images/20120412013818!Hyrax-2.0-Catalog.png new file mode 100644 index 0000000..db76103 Binary files /dev/null and b/images/20120412013818!Hyrax-2.0-Catalog.png differ diff --git a/images/20120412013902!Hyrax-2.0-Catalog.png b/images/20120412013902!Hyrax-2.0-Catalog.png new file mode 100644 index 0000000..9197b08 Binary files /dev/null and b/images/20120412013902!Hyrax-2.0-Catalog.png differ diff --git a/images/20120412015328!Hyrax-2.0-Catalog.png b/images/20120412015328!Hyrax-2.0-Catalog.png new file mode 100644 index 0000000..688b2aa Binary files /dev/null and b/images/20120412015328!Hyrax-2.0-Catalog.png differ diff --git a/images/20120412015414!Hyrax-1.8-Catalog.png b/images/20120412015414!Hyrax-1.8-Catalog.png new file mode 100644 index 0000000..f49f58b Binary files /dev/null and b/images/20120412015414!Hyrax-1.8-Catalog.png differ diff --git a/images/20120823045143!ServiceDescriptionPrototype-01.png b/images/20120823045143!ServiceDescriptionPrototype-01.png new file mode 100644 index 0000000..741a4cd Binary files /dev/null and b/images/20120823045143!ServiceDescriptionPrototype-01.png differ diff --git a/images/20120823045610!ServiceDescriptionPrototype-01.png b/images/20120823045610!ServiceDescriptionPrototype-01.png new file mode 100644 index 0000000..c939802 Binary files /dev/null and b/images/20120823045610!ServiceDescriptionPrototype-01.png differ diff --git a/images/20140811195300!Screen_Shot_2014-08-11_at_12.34.19_PM.png b/images/20140811195300!Screen_Shot_2014-08-11_at_12.34.19_PM.png new file mode 100644 index 0000000..0d9d4af Binary files /dev/null and b/images/20140811195300!Screen_Shot_2014-08-11_at_12.34.19_PM.png differ diff --git a/images/20141206143916!URSApplicationPending.png b/images/20141206143916!URSApplicationPending.png new file mode 100644 index 0000000..e955f82 Binary files /dev/null and b/images/20141206143916!URSApplicationPending.png differ diff --git a/images/20141216135848!UrsApproveApplication.png b/images/20141216135848!UrsApproveApplication.png new file mode 100644 index 0000000..d5010b1 Binary files /dev/null and b/images/20141216135848!UrsApproveApplication.png differ diff --git a/images/250px-Basic_PM_Window.png b/images/250px-Basic_PM_Window.png new file mode 100644 index 0000000..a9a1caf Binary files /dev/null and b/images/250px-Basic_PM_Window.png differ diff --git a/images/250px-Check_paths.png b/images/250px-Check_paths.png new file mode 100644 index 0000000..09e325e Binary files /dev/null and b/images/250px-Check_paths.png differ diff --git a/images/250px-Dependencies_first.png b/images/250px-Dependencies_first.png new file mode 100644 index 0000000..d63e9c6 Binary files /dev/null and b/images/250px-Dependencies_first.png differ diff --git a/images/250px-Do_not_use_res.png b/images/250px-Do_not_use_res.png new file mode 100644 index 0000000..05b2639 Binary files /dev/null and b/images/250px-Do_not_use_res.png differ diff --git a/images/250px-Restart_none.png b/images/250px-Restart_none.png new file mode 100644 index 0000000..4f7f286 Binary files /dev/null and b/images/250px-Restart_none.png differ diff --git a/images/270px-DAP4_DataDDX_Design_1.png b/images/270px-DAP4_DataDDX_Design_1.png new file mode 100644 index 0000000..1fc6e6f Binary files /dev/null and b/images/270px-DAP4_DataDDX_Design_1.png differ diff --git a/images/270px-Gateway_service.jpg b/images/270px-Gateway_service.jpg new file mode 100644 index 0000000..ac6e8e2 Binary files /dev/null and b/images/270px-Gateway_service.jpg differ diff --git a/images/270px-HyraxArchitecture.jpg b/images/270px-HyraxArchitecture.jpg new file mode 100644 index 0000000..c3751a1 Binary files /dev/null and b/images/270px-HyraxArchitecture.jpg differ diff --git a/images/270px-Hyrax_with_AMQP.png b/images/270px-Hyrax_with_AMQP.png new file mode 100644 index 0000000..07e6395 Binary files /dev/null and b/images/270px-Hyrax_with_AMQP.png differ diff --git a/images/270px-VM_snapshots.png b/images/270px-VM_snapshots.png new file mode 100644 index 0000000..a82dead Binary files /dev/null and b/images/270px-VM_snapshots.png differ diff --git a/images/2_Result_of_adding_workspace_path.png b/images/2_Result_of_adding_workspace_path.png new file mode 100644 index 0000000..c8f4ae7 Binary files /dev/null and b/images/2_Result_of_adding_workspace_path.png differ diff --git a/images/2_Set_PATH_in_the_project.png b/images/2_Set_PATH_in_the_project.png new file mode 100644 index 0000000..ae62e3c Binary files /dev/null and b/images/2_Set_PATH_in_the_project.png differ diff --git a/images/2_Setup_the_debug_configuration.png b/images/2_Setup_the_debug_configuration.png new file mode 100644 index 0000000..bfe5ff4 Binary files /dev/null and b/images/2_Setup_the_debug_configuration.png differ diff --git a/images/2_Use_New_Project_Wizard.png b/images/2_Use_New_Project_Wizard.png new file mode 100644 index 0000000..c853569 Binary files /dev/null and b/images/2_Use_New_Project_Wizard.png differ diff --git a/images/2_editor_folding.png b/images/2_editor_folding.png new file mode 100644 index 0000000..d8e67c7 Binary files /dev/null and b/images/2_editor_folding.png differ diff --git a/images/300px-BuildDASDDS.png b/images/300px-BuildDASDDS.png new file mode 100644 index 0000000..c0b0a0e Binary files /dev/null and b/images/300px-BuildDASDDS.png differ diff --git a/images/300px-BuildonlyDDX.png b/images/300px-BuildonlyDDX.png new file mode 100644 index 0000000..147c5e9 Binary files /dev/null and b/images/300px-BuildonlyDDX.png differ diff --git a/images/300px-Connect_proposed_asynchronous_processing.png b/images/300px-Connect_proposed_asynchronous_processing.png new file mode 100644 index 0000000..59fc574 Binary files /dev/null and b/images/300px-Connect_proposed_asynchronous_processing.png differ diff --git a/images/300px-Connect_synchronous_processing.png b/images/300px-Connect_synchronous_processing.png new file mode 100644 index 0000000..f0c6f95 Binary files /dev/null and b/images/300px-Connect_synchronous_processing.png differ diff --git a/images/300px-DirectoryView.png b/images/300px-DirectoryView.png new file mode 100644 index 0000000..9d4eb98 Binary files /dev/null and b/images/300px-DirectoryView.png differ diff --git a/images/300px-Edit_the_squid.conf_file.png b/images/300px-Edit_the_squid.conf_file.png new file mode 100644 index 0000000..35da2b0 Binary files /dev/null and b/images/300px-Edit_the_squid.conf_file.png differ diff --git a/images/300px-HyraxArchitecture.jpg b/images/300px-HyraxArchitecture.jpg new file mode 100644 index 0000000..5897636 Binary files /dev/null and b/images/300px-HyraxArchitecture.jpg differ diff --git a/images/300px-Memory_stick_2.png b/images/300px-Memory_stick_2.png new file mode 100644 index 0000000..69a00fc Binary files /dev/null and b/images/300px-Memory_stick_2.png differ diff --git a/images/300px-OPeNDAP-Logo_Large.png b/images/300px-OPeNDAP-Logo_Large.png new file mode 100644 index 0000000..d252ccd Binary files /dev/null and b/images/300px-OPeNDAP-Logo_Large.png differ diff --git a/images/300px-Screen_Shot_2013-09-12_at_2.00.11_PM.png b/images/300px-Screen_Shot_2013-09-12_at_2.00.11_PM.png new file mode 100644 index 0000000..c832cc7 Binary files /dev/null and b/images/300px-Screen_Shot_2013-09-12_at_2.00.11_PM.png differ diff --git a/images/300px-Screen_Shot_2013-09-12_at_2.00.20_PM.png b/images/300px-Screen_Shot_2013-09-12_at_2.00.20_PM.png new file mode 100644 index 0000000..6a1c7fa Binary files /dev/null and b/images/300px-Screen_Shot_2013-09-12_at_2.00.20_PM.png differ diff --git a/images/300px-Squid_1.png b/images/300px-Squid_1.png new file mode 100644 index 0000000..f6c3738 Binary files /dev/null and b/images/300px-Squid_1.png differ diff --git a/images/300px-Squid_2.png b/images/300px-Squid_2.png new file mode 100644 index 0000000..5b693e1 Binary files /dev/null and b/images/300px-Squid_2.png differ diff --git a/images/300px-Squid_3.png b/images/300px-Squid_3.png new file mode 100644 index 0000000..102f4ce Binary files /dev/null and b/images/300px-Squid_3.png differ diff --git a/images/360px-DAP4_DataDDX_Design_1.png b/images/360px-DAP4_DataDDX_Design_1.png new file mode 100644 index 0000000..7982d1c Binary files /dev/null and b/images/360px-DAP4_DataDDX_Design_1.png differ diff --git a/images/360px-Gateway_service.jpg b/images/360px-Gateway_service.jpg new file mode 100644 index 0000000..78cc1cb Binary files /dev/null and b/images/360px-Gateway_service.jpg differ diff --git a/images/360px-HyraxArchitecture.jpg b/images/360px-HyraxArchitecture.jpg new file mode 100644 index 0000000..8274fd9 Binary files /dev/null and b/images/360px-HyraxArchitecture.jpg differ diff --git a/images/360px-Hyrax_with_AMQP.png b/images/360px-Hyrax_with_AMQP.png new file mode 100644 index 0000000..0a2bb0d Binary files /dev/null and b/images/360px-Hyrax_with_AMQP.png differ diff --git a/images/360px-VM_snapshots.png b/images/360px-VM_snapshots.png new file mode 100644 index 0000000..3c46bb5 Binary files /dev/null and b/images/360px-VM_snapshots.png differ diff --git a/images/375px-Basic_PM_Window.png b/images/375px-Basic_PM_Window.png new file mode 100644 index 0000000..158dbff Binary files /dev/null and b/images/375px-Basic_PM_Window.png differ diff --git a/images/375px-Check_paths.png b/images/375px-Check_paths.png new file mode 100644 index 0000000..c419a8c Binary files /dev/null and b/images/375px-Check_paths.png differ diff --git a/images/375px-Dependencies_first.png b/images/375px-Dependencies_first.png new file mode 100644 index 0000000..1310bf2 Binary files /dev/null and b/images/375px-Dependencies_first.png differ diff --git a/images/375px-Do_not_use_res.png b/images/375px-Do_not_use_res.png new file mode 100644 index 0000000..aed1eaa Binary files /dev/null and b/images/375px-Do_not_use_res.png differ diff --git a/images/375px-Restart_none.png b/images/375px-Restart_none.png new file mode 100644 index 0000000..4c01c7c Binary files /dev/null and b/images/375px-Restart_none.png differ diff --git a/images/3_Add_filesystem_path.png b/images/3_Add_filesystem_path.png new file mode 100644 index 0000000..1737db0 Binary files /dev/null and b/images/3_Add_filesystem_path.png differ diff --git a/images/3_Debug_config_dialog.png b/images/3_Debug_config_dialog.png new file mode 100644 index 0000000..b941902 Binary files /dev/null and b/images/3_Debug_config_dialog.png differ diff --git a/images/3_Existing_Code_Makefile.png b/images/3_Existing_Code_Makefile.png new file mode 100644 index 0000000..edab68a Binary files /dev/null and b/images/3_Existing_Code_Makefile.png differ diff --git a/images/400px-BES_Handler_class_diagram.png b/images/400px-BES_Handler_class_diagram.png new file mode 100644 index 0000000..828e3b7 Binary files /dev/null and b/images/400px-BES_Handler_class_diagram.png differ diff --git a/images/400px-BES_Handler_class_diagram_detailed.png b/images/400px-BES_Handler_class_diagram_detailed.png new file mode 100644 index 0000000..6ece29d Binary files /dev/null and b/images/400px-BES_Handler_class_diagram_detailed.png differ diff --git a/images/400px-BuildDASDDS.png b/images/400px-BuildDASDDS.png new file mode 100644 index 0000000..e243f58 Binary files /dev/null and b/images/400px-BuildDASDDS.png differ diff --git a/images/400px-BuildonlyDDX.png b/images/400px-BuildonlyDDX.png new file mode 100644 index 0000000..347d038 Binary files /dev/null and b/images/400px-BuildonlyDDX.png differ diff --git a/images/400px-DAP_2_DM_UML.png b/images/400px-DAP_2_DM_UML.png new file mode 100644 index 0000000..6fcab83 Binary files /dev/null and b/images/400px-DAP_2_DM_UML.png differ diff --git a/images/400px-DirectoryView.png b/images/400px-DirectoryView.png new file mode 100644 index 0000000..0031e93 Binary files /dev/null and b/images/400px-DirectoryView.png differ diff --git a/images/400px-Edit_the_squid.conf_file.png b/images/400px-Edit_the_squid.conf_file.png new file mode 100644 index 0000000..d329435 Binary files /dev/null and b/images/400px-Edit_the_squid.conf_file.png differ diff --git a/images/400px-Memory_stick_2.png b/images/400px-Memory_stick_2.png new file mode 100644 index 0000000..78b863c Binary files /dev/null and b/images/400px-Memory_stick_2.png differ diff --git a/images/400px-NcML_Activity_diagram.png b/images/400px-NcML_Activity_diagram.png new file mode 100644 index 0000000..263e0bd Binary files /dev/null and b/images/400px-NcML_Activity_diagram.png differ diff --git a/images/400px-NcML_Object_diagram_1.png b/images/400px-NcML_Object_diagram_1.png new file mode 100644 index 0000000..8366bde Binary files /dev/null and b/images/400px-NcML_Object_diagram_1.png differ diff --git a/images/400px-NcML_XML_Parsing_state_diagram_1.png b/images/400px-NcML_XML_Parsing_state_diagram_1.png new file mode 100644 index 0000000..4912d20 Binary files /dev/null and b/images/400px-NcML_XML_Parsing_state_diagram_1.png differ diff --git a/images/400px-OLFS_current.png b/images/400px-OLFS_current.png new file mode 100644 index 0000000..3621993 Binary files /dev/null and b/images/400px-OLFS_current.png differ diff --git a/images/400px-RDH_ActivityDiagram.png b/images/400px-RDH_ActivityDiagram.png new file mode 100644 index 0000000..ed45a9c Binary files /dev/null and b/images/400px-RDH_ActivityDiagram.png differ diff --git a/images/400px-REAP_Cataloging_Deployment.png b/images/400px-REAP_Cataloging_Deployment.png new file mode 100644 index 0000000..d407e56 Binary files /dev/null and b/images/400px-REAP_Cataloging_Deployment.png differ diff --git a/images/400px-Squid_1.png b/images/400px-Squid_1.png new file mode 100644 index 0000000..398db76 Binary files /dev/null and b/images/400px-Squid_1.png differ diff --git a/images/400px-Squid_2.png b/images/400px-Squid_2.png new file mode 100644 index 0000000..927c1d0 Binary files /dev/null and b/images/400px-Squid_2.png differ diff --git a/images/400px-Squid_3.png b/images/400px-Squid_3.png new file mode 100644 index 0000000..44f0eb3 Binary files /dev/null and b/images/400px-Squid_3.png differ diff --git a/images/400px-THREDDS-Search.png b/images/400px-THREDDS-Search.png new file mode 100644 index 0000000..bf9e585 Binary files /dev/null and b/images/400px-THREDDS-Search.png differ diff --git a/images/400px-WCS_packages_high_level.png b/images/400px-WCS_packages_high_level.png new file mode 100644 index 0000000..dc0fefe Binary files /dev/null and b/images/400px-WCS_packages_high_level.png differ diff --git a/images/404px-ServiceDescriptionPrototype-01.png b/images/404px-ServiceDescriptionPrototype-01.png new file mode 100644 index 0000000..3b6d3e8 Binary files /dev/null and b/images/404px-ServiceDescriptionPrototype-01.png differ diff --git a/images/440px-OLFS_new_AMQP.png b/images/440px-OLFS_new_AMQP.png new file mode 100644 index 0000000..c8c374b Binary files /dev/null and b/images/440px-OLFS_new_AMQP.png differ diff --git a/images/440px-OLFS_new_servlet.png b/images/440px-OLFS_new_servlet.png new file mode 100644 index 0000000..b988ac2 Binary files /dev/null and b/images/440px-OLFS_new_servlet.png differ diff --git a/images/450px-HyraxArchitecture.jpg b/images/450px-HyraxArchitecture.jpg new file mode 100644 index 0000000..1015661 Binary files /dev/null and b/images/450px-HyraxArchitecture.jpg differ diff --git a/images/450px-OPeNDAP-Logo_Large.png b/images/450px-OPeNDAP-Logo_Large.png new file mode 100644 index 0000000..8141b02 Binary files /dev/null and b/images/450px-OPeNDAP-Logo_Large.png differ diff --git a/images/461px-RDH_ActivityDiagram.png b/images/461px-RDH_ActivityDiagram.png new file mode 100644 index 0000000..c8c693c Binary files /dev/null and b/images/461px-RDH_ActivityDiagram.png differ diff --git a/images/478px-THREDDS-Search.png b/images/478px-THREDDS-Search.png new file mode 100644 index 0000000..31d94aa Binary files /dev/null and b/images/478px-THREDDS-Search.png differ diff --git a/images/479px-THREDDS-Search.png b/images/479px-THREDDS-Search.png new file mode 100644 index 0000000..0538559 Binary files /dev/null and b/images/479px-THREDDS-Search.png differ diff --git a/images/486px-Reynolds_das.png b/images/486px-Reynolds_das.png new file mode 100644 index 0000000..4680ab4 Binary files /dev/null and b/images/486px-Reynolds_das.png differ diff --git a/images/492px-Dependencies_first.png b/images/492px-Dependencies_first.png new file mode 100644 index 0000000..c3ca6a4 Binary files /dev/null and b/images/492px-Dependencies_first.png differ diff --git a/images/495px-BuildonlyDDX.png b/images/495px-BuildonlyDDX.png new file mode 100644 index 0000000..90f152a Binary files /dev/null and b/images/495px-BuildonlyDDX.png differ diff --git a/images/496px-BuildonlyDDX.png b/images/496px-BuildonlyDDX.png new file mode 100644 index 0000000..5bf135c Binary files /dev/null and b/images/496px-BuildonlyDDX.png differ diff --git a/images/496px-DAP4_DataDDX_Design_1.png b/images/496px-DAP4_DataDDX_Design_1.png new file mode 100644 index 0000000..6031338 Binary files /dev/null and b/images/496px-DAP4_DataDDX_Design_1.png differ diff --git a/images/497px-DAP_4_DM_UML.png b/images/497px-DAP_4_DM_UML.png new file mode 100644 index 0000000..65f032f Binary files /dev/null and b/images/497px-DAP_4_DM_UML.png differ diff --git a/images/4_Setup_The_Project.png b/images/4_Setup_The_Project.png new file mode 100644 index 0000000..1cabafc Binary files /dev/null and b/images/4_Setup_The_Project.png differ diff --git a/images/4_Use_legacy_launcing_with_Eclipse_4.4.png b/images/4_Use_legacy_launcing_with_Eclipse_4.4.png new file mode 100644 index 0000000..00a7aa8 Binary files /dev/null and b/images/4_Use_legacy_launcing_with_Eclipse_4.4.png differ diff --git a/images/500px-Basic_PM_Window.png b/images/500px-Basic_PM_Window.png new file mode 100644 index 0000000..11a6d79 Binary files /dev/null and b/images/500px-Basic_PM_Window.png differ diff --git a/images/500px-Check_paths.png b/images/500px-Check_paths.png new file mode 100644 index 0000000..9b0d3e0 Binary files /dev/null and b/images/500px-Check_paths.png differ diff --git a/images/500px-Dependencies_first.png b/images/500px-Dependencies_first.png new file mode 100644 index 0000000..fb78e9f Binary files /dev/null and b/images/500px-Dependencies_first.png differ diff --git a/images/500px-Do_not_use_res.png b/images/500px-Do_not_use_res.png new file mode 100644 index 0000000..6f1be32 Binary files /dev/null and b/images/500px-Do_not_use_res.png differ diff --git a/images/500px-Iess_dat_asc.png b/images/500px-Iess_dat_asc.png new file mode 100644 index 0000000..f758fb6 Binary files /dev/null and b/images/500px-Iess_dat_asc.png differ diff --git a/images/500px-Iess_dat_das.png b/images/500px-Iess_dat_das.png new file mode 100644 index 0000000..a137385 Binary files /dev/null and b/images/500px-Iess_dat_das.png differ diff --git a/images/500px-Iess_dat_dds.png b/images/500px-Iess_dat_dds.png new file mode 100644 index 0000000..e8b6b52 Binary files /dev/null and b/images/500px-Iess_dat_dds.png differ diff --git a/images/500px-Iess_location_das.png b/images/500px-Iess_location_das.png new file mode 100644 index 0000000..d82e5b0 Binary files /dev/null and b/images/500px-Iess_location_das.png differ diff --git a/images/500px-Iess_location_dds.png b/images/500px-Iess_location_dds.png new file mode 100644 index 0000000..bcb2175 Binary files /dev/null and b/images/500px-Iess_location_dds.png differ diff --git a/images/500px-Restart_none.png b/images/500px-Restart_none.png new file mode 100644 index 0000000..5730e25 Binary files /dev/null and b/images/500px-Restart_none.png differ diff --git a/images/504px-OLFS_current.png b/images/504px-OLFS_current.png new file mode 100644 index 0000000..cf0e744 Binary files /dev/null and b/images/504px-OLFS_current.png differ diff --git a/images/57px-Unlinked.png b/images/57px-Unlinked.png new file mode 100644 index 0000000..a7f0ca9 Binary files /dev/null and b/images/57px-Unlinked.png differ diff --git a/images/58px-Unlinked.png b/images/58px-Unlinked.png new file mode 100644 index 0000000..453e7e6 Binary files /dev/null and b/images/58px-Unlinked.png differ diff --git a/images/5_Debugger_tab_should_look_like.png b/images/5_Debugger_tab_should_look_like.png new file mode 100644 index 0000000..2b6a345 Binary files /dev/null and b/images/5_Debugger_tab_should_look_like.png differ diff --git a/images/5_Probably_reindex.png b/images/5_Probably_reindex.png new file mode 100644 index 0000000..1573352 Binary files /dev/null and b/images/5_Probably_reindex.png differ diff --git a/images/5_Switch_To_Cpp_Perspective.png b/images/5_Switch_To_Cpp_Perspective.png new file mode 100644 index 0000000..35d8e94 Binary files /dev/null and b/images/5_Switch_To_Cpp_Perspective.png differ diff --git a/images/600px-BES_Handler_class_diagram.png b/images/600px-BES_Handler_class_diagram.png new file mode 100644 index 0000000..53b0579 Binary files /dev/null and b/images/600px-BES_Handler_class_diagram.png differ diff --git a/images/600px-BES_Handler_class_diagram_detailed.png b/images/600px-BES_Handler_class_diagram_detailed.png new file mode 100644 index 0000000..8480cf2 Binary files /dev/null and b/images/600px-BES_Handler_class_diagram_detailed.png differ diff --git a/images/600px-CertAuth.png b/images/600px-CertAuth.png new file mode 100644 index 0000000..e0dca67 Binary files /dev/null and b/images/600px-CertAuth.png differ diff --git a/images/600px-HyraxArchitecture.jpg b/images/600px-HyraxArchitecture.jpg new file mode 100644 index 0000000..7343a86 Binary files /dev/null and b/images/600px-HyraxArchitecture.jpg differ diff --git a/images/600px-NcML_Activity_diagram.png b/images/600px-NcML_Activity_diagram.png new file mode 100644 index 0000000..84b5db0 Binary files /dev/null and b/images/600px-NcML_Activity_diagram.png differ diff --git a/images/600px-NcML_Object_diagram_1.png b/images/600px-NcML_Object_diagram_1.png new file mode 100644 index 0000000..0db6e90 Binary files /dev/null and b/images/600px-NcML_Object_diagram_1.png differ diff --git a/images/600px-NcML_XML_Parsing_state_diagram_1.png b/images/600px-NcML_XML_Parsing_state_diagram_1.png new file mode 100644 index 0000000..985004e Binary files /dev/null and b/images/600px-NcML_XML_Parsing_state_diagram_1.png differ diff --git a/images/600px-OAuth2.png b/images/600px-OAuth2.png new file mode 100644 index 0000000..0031c6b Binary files /dev/null and b/images/600px-OAuth2.png differ diff --git a/images/600px-OPeNDAP-Logo_Large.png b/images/600px-OPeNDAP-Logo_Large.png new file mode 100644 index 0000000..36724fc Binary files /dev/null and b/images/600px-OPeNDAP-Logo_Large.png differ diff --git a/images/600px-OpenIDSequenceDiagram.png b/images/600px-OpenIDSequenceDiagram.png new file mode 100644 index 0000000..fdafeb8 Binary files /dev/null and b/images/600px-OpenIDSequenceDiagram.png differ diff --git a/images/600px-RDH_ActivityDiagram.png b/images/600px-RDH_ActivityDiagram.png new file mode 100644 index 0000000..b67f00b Binary files /dev/null and b/images/600px-RDH_ActivityDiagram.png differ diff --git a/images/600px-REAP_Cataloging_Deployment.png b/images/600px-REAP_Cataloging_Deployment.png new file mode 100644 index 0000000..a28ae85 Binary files /dev/null and b/images/600px-REAP_Cataloging_Deployment.png differ diff --git a/images/600px-THREDDS-Search.png b/images/600px-THREDDS-Search.png new file mode 100644 index 0000000..5f69d26 Binary files /dev/null and b/images/600px-THREDDS-Search.png differ diff --git a/images/600px-WCS-UC1.0-ActivityDiagram.png b/images/600px-WCS-UC1.0-ActivityDiagram.png new file mode 100644 index 0000000..f4c8a45 Binary files /dev/null and b/images/600px-WCS-UC1.0-ActivityDiagram.png differ diff --git a/images/600px-WCS-UC1.1-ActivityDiagram.png b/images/600px-WCS-UC1.1-ActivityDiagram.png new file mode 100644 index 0000000..6ea543f Binary files /dev/null and b/images/600px-WCS-UC1.1-ActivityDiagram.png differ diff --git a/images/600px-WCS-Uc2.0.png b/images/600px-WCS-Uc2.0.png new file mode 100644 index 0000000..1987169 Binary files /dev/null and b/images/600px-WCS-Uc2.0.png differ diff --git a/images/600px-WCS-Uc3.0.png b/images/600px-WCS-Uc3.0.png new file mode 100644 index 0000000..4d965fc Binary files /dev/null and b/images/600px-WCS-Uc3.0.png differ diff --git a/images/600px-WCS_packages_high_level.png b/images/600px-WCS_packages_high_level.png new file mode 100644 index 0000000..0ddcb84 Binary files /dev/null and b/images/600px-WCS_packages_high_level.png differ diff --git a/images/608px-NcML_Activity_diagram.png b/images/608px-NcML_Activity_diagram.png new file mode 100644 index 0000000..7fbf70d Binary files /dev/null and b/images/608px-NcML_Activity_diagram.png differ diff --git a/images/609px-ParsingConstraintExpression.png b/images/609px-ParsingConstraintExpression.png new file mode 100644 index 0000000..8fd27bd Binary files /dev/null and b/images/609px-ParsingConstraintExpression.png differ diff --git a/images/610px-ParsingConstraintExpression.png b/images/610px-ParsingConstraintExpression.png new file mode 100644 index 0000000..5776fbe Binary files /dev/null and b/images/610px-ParsingConstraintExpression.png differ diff --git a/images/620px-WCS_packages_high_level.png b/images/620px-WCS_packages_high_level.png new file mode 100644 index 0000000..96a2387 Binary files /dev/null and b/images/620px-WCS_packages_high_level.png differ diff --git a/images/621px-WCS_packages_high_level.png b/images/621px-WCS_packages_high_level.png new file mode 100644 index 0000000..84a0a5a Binary files /dev/null and b/images/621px-WCS_packages_high_level.png differ diff --git a/images/640px-BuildingDDS.png b/images/640px-BuildingDDS.png new file mode 100644 index 0000000..5e93af1 Binary files /dev/null and b/images/640px-BuildingDDS.png differ diff --git a/images/640px-HyraxWcsPrototype.png b/images/640px-HyraxWcsPrototype.png new file mode 100644 index 0000000..54fbf83 Binary files /dev/null and b/images/640px-HyraxWcsPrototype.png differ diff --git a/images/640px-ParsingConstraintExpression.png b/images/640px-ParsingConstraintExpression.png new file mode 100644 index 0000000..eaad58b Binary files /dev/null and b/images/640px-ParsingConstraintExpression.png differ diff --git a/images/640px-RDH_StaticClasses.png b/images/640px-RDH_StaticClasses.png new file mode 100644 index 0000000..94e3e63 Binary files /dev/null and b/images/640px-RDH_StaticClasses.png differ diff --git a/images/653px-Ss_view_plot.png b/images/653px-Ss_view_plot.png new file mode 100644 index 0000000..36abec4 Binary files /dev/null and b/images/653px-Ss_view_plot.png differ diff --git a/images/660px-OLFS_new_AMQP.png b/images/660px-OLFS_new_AMQP.png new file mode 100644 index 0000000..9685e14 Binary files /dev/null and b/images/660px-OLFS_new_AMQP.png differ diff --git a/images/660px-OLFS_new_servlet.png b/images/660px-OLFS_new_servlet.png new file mode 100644 index 0000000..bf74b90 Binary files /dev/null and b/images/660px-OLFS_new_servlet.png differ diff --git a/images/675px-HyraxWcsPrototype.png b/images/675px-HyraxWcsPrototype.png new file mode 100644 index 0000000..6bb7b4a Binary files /dev/null and b/images/675px-HyraxWcsPrototype.png differ diff --git a/images/675px-Netcdf1.jpg b/images/675px-Netcdf1.jpg new file mode 100644 index 0000000..0d63c80 Binary files /dev/null and b/images/675px-Netcdf1.jpg differ diff --git a/images/676px-HyraxWcsPrototype.png b/images/676px-HyraxWcsPrototype.png new file mode 100644 index 0000000..8900caf Binary files /dev/null and b/images/676px-HyraxWcsPrototype.png differ diff --git a/images/680px-Reynolds_ifh.png b/images/680px-Reynolds_ifh.png new file mode 100644 index 0000000..4e57a55 Binary files /dev/null and b/images/680px-Reynolds_ifh.png differ diff --git a/images/68px-DDS.gif b/images/68px-DDS.gif new file mode 100644 index 0000000..0d3b129 Binary files /dev/null and b/images/68px-DDS.gif differ diff --git a/images/697px-REAP_Cataloging_Deployment.png b/images/697px-REAP_Cataloging_Deployment.png new file mode 100644 index 0000000..4367e83 Binary files /dev/null and b/images/697px-REAP_Cataloging_Deployment.png differ diff --git a/images/6_The_New_Project.png b/images/6_The_New_Project.png new file mode 100644 index 0000000..daac629 Binary files /dev/null and b/images/6_The_New_Project.png differ diff --git a/images/6_warning_gone.png b/images/6_warning_gone.png new file mode 100644 index 0000000..e7ed26e Binary files /dev/null and b/images/6_warning_gone.png differ diff --git a/images/712px-BuildDASDDS.png b/images/712px-BuildDASDDS.png new file mode 100644 index 0000000..7e3b31f Binary files /dev/null and b/images/712px-BuildDASDDS.png differ diff --git a/images/713px-Netcdf4.jpg b/images/713px-Netcdf4.jpg new file mode 100644 index 0000000..9aea3be Binary files /dev/null and b/images/713px-Netcdf4.jpg differ diff --git a/images/714px-Netcdf4.jpg b/images/714px-Netcdf4.jpg new file mode 100644 index 0000000..355253a Binary files /dev/null and b/images/714px-Netcdf4.jpg differ diff --git a/images/738px-Restart_none.png b/images/738px-Restart_none.png new file mode 100644 index 0000000..f28f7a8 Binary files /dev/null and b/images/738px-Restart_none.png differ diff --git a/images/739px-Restart_none.png b/images/739px-Restart_none.png new file mode 100644 index 0000000..fffd658 Binary files /dev/null and b/images/739px-Restart_none.png differ diff --git a/images/742px-Basic_PM_Window.png b/images/742px-Basic_PM_Window.png new file mode 100644 index 0000000..e274cfe Binary files /dev/null and b/images/742px-Basic_PM_Window.png differ diff --git a/images/742px-Check_paths.png b/images/742px-Check_paths.png new file mode 100644 index 0000000..907efcb Binary files /dev/null and b/images/742px-Check_paths.png differ diff --git a/images/743px-Check_paths.png b/images/743px-Check_paths.png new file mode 100644 index 0000000..b7ddbc8 Binary files /dev/null and b/images/743px-Check_paths.png differ diff --git a/images/750px-Iess_dat_asc.png b/images/750px-Iess_dat_asc.png new file mode 100644 index 0000000..dd81718 Binary files /dev/null and b/images/750px-Iess_dat_asc.png differ diff --git a/images/750px-Iess_dat_das.png b/images/750px-Iess_dat_das.png new file mode 100644 index 0000000..4cfb845 Binary files /dev/null and b/images/750px-Iess_dat_das.png differ diff --git a/images/750px-Iess_dat_dds.png b/images/750px-Iess_dat_dds.png new file mode 100644 index 0000000..207550b Binary files /dev/null and b/images/750px-Iess_dat_dds.png differ diff --git a/images/750px-Iess_location_das.png b/images/750px-Iess_location_das.png new file mode 100644 index 0000000..a113f3c Binary files /dev/null and b/images/750px-Iess_location_das.png differ diff --git a/images/750px-Iess_location_dds.png b/images/750px-Iess_location_dds.png new file mode 100644 index 0000000..d8ccb60 Binary files /dev/null and b/images/750px-Iess_location_dds.png differ diff --git a/images/751px-Do_not_use_res.png b/images/751px-Do_not_use_res.png new file mode 100644 index 0000000..246e329 Binary files /dev/null and b/images/751px-Do_not_use_res.png differ diff --git a/images/768px-Ss_gcmd.png b/images/768px-Ss_gcmd.png new file mode 100644 index 0000000..8592865 Binary files /dev/null and b/images/768px-Ss_gcmd.png differ diff --git a/images/76px-Unlinked.gif b/images/76px-Unlinked.gif new file mode 100644 index 0000000..17d4625 Binary files /dev/null and b/images/76px-Unlinked.gif differ diff --git a/images/78px-Linked.png b/images/78px-Linked.png new file mode 100644 index 0000000..8ad6864 Binary files /dev/null and b/images/78px-Linked.png differ diff --git a/images/800px-BES_Handler_class_diagram.png b/images/800px-BES_Handler_class_diagram.png new file mode 100644 index 0000000..7361e33 Binary files /dev/null and b/images/800px-BES_Handler_class_diagram.png differ diff --git a/images/800px-BES_Handler_class_diagram_detailed.png b/images/800px-BES_Handler_class_diagram_detailed.png new file mode 100644 index 0000000..c42e57c Binary files /dev/null and b/images/800px-BES_Handler_class_diagram_detailed.png differ diff --git a/images/800px-BuildingDDS.png b/images/800px-BuildingDDS.png new file mode 100644 index 0000000..18efcdc Binary files /dev/null and b/images/800px-BuildingDDS.png differ diff --git a/images/800px-CertAuth.png b/images/800px-CertAuth.png new file mode 100644 index 0000000..c987f60 Binary files /dev/null and b/images/800px-CertAuth.png differ diff --git a/images/800px-ChunkedStreamReaderStateDiagram.png b/images/800px-ChunkedStreamReaderStateDiagram.png new file mode 100644 index 0000000..76b538f Binary files /dev/null and b/images/800px-ChunkedStreamReaderStateDiagram.png differ diff --git a/images/800px-DAPAuthInteractive.png b/images/800px-DAPAuthInteractive.png new file mode 100644 index 0000000..e018017 Binary files /dev/null and b/images/800px-DAPAuthInteractive.png differ diff --git a/images/800px-DescribeCoverage.png b/images/800px-DescribeCoverage.png new file mode 100644 index 0000000..5f457c5 Binary files /dev/null and b/images/800px-DescribeCoverage.png differ diff --git a/images/800px-Dm.png b/images/800px-Dm.png new file mode 100644 index 0000000..cb71e57 Binary files /dev/null and b/images/800px-Dm.png differ diff --git a/images/800px-Gateway_service.jpg b/images/800px-Gateway_service.jpg new file mode 100644 index 0000000..1fbc4e8 Binary files /dev/null and b/images/800px-Gateway_service.jpg differ diff --git a/images/800px-GetCoverage.png b/images/800px-GetCoverage.png new file mode 100644 index 0000000..7840555 Binary files /dev/null and b/images/800px-GetCoverage.png differ diff --git a/images/800px-Hyrax-1.8-Catalog.png b/images/800px-Hyrax-1.8-Catalog.png new file mode 100644 index 0000000..d67a44a Binary files /dev/null and b/images/800px-Hyrax-1.8-Catalog.png differ diff --git a/images/800px-Hyrax-2.0-Catalog.png b/images/800px-Hyrax-2.0-Catalog.png new file mode 100644 index 0000000..c32dae8 Binary files /dev/null and b/images/800px-Hyrax-2.0-Catalog.png differ diff --git a/images/800px-Iess_location_das.png b/images/800px-Iess_location_das.png new file mode 100644 index 0000000..7446596 Binary files /dev/null and b/images/800px-Iess_location_das.png differ diff --git a/images/800px-Iess_location_dds.png b/images/800px-Iess_location_dds.png new file mode 100644 index 0000000..bb88d79 Binary files /dev/null and b/images/800px-Iess_location_dds.png differ diff --git a/images/800px-Memory_stick_2.png b/images/800px-Memory_stick_2.png new file mode 100644 index 0000000..b21d9e0 Binary files /dev/null and b/images/800px-Memory_stick_2.png differ diff --git a/images/800px-NcML_Activity_diagram.png b/images/800px-NcML_Activity_diagram.png new file mode 100644 index 0000000..021c057 Binary files /dev/null and b/images/800px-NcML_Activity_diagram.png differ diff --git a/images/800px-NcML_Object_diagram_1.png b/images/800px-NcML_Object_diagram_1.png new file mode 100644 index 0000000..c8851fe Binary files /dev/null and b/images/800px-NcML_Object_diagram_1.png differ diff --git a/images/800px-NcML_XML_Parsing_state_diagram_1.png b/images/800px-NcML_XML_Parsing_state_diagram_1.png new file mode 100644 index 0000000..e72d5aa Binary files /dev/null and b/images/800px-NcML_XML_Parsing_state_diagram_1.png differ diff --git a/images/800px-OAuth2.png b/images/800px-OAuth2.png new file mode 100644 index 0000000..a9f1f62 Binary files /dev/null and b/images/800px-OAuth2.png differ diff --git a/images/800px-OLFS_new_servlet.png b/images/800px-OLFS_new_servlet.png new file mode 100644 index 0000000..ad02c40 Binary files /dev/null and b/images/800px-OLFS_new_servlet.png differ diff --git a/images/800px-OPeNDAP-Logo_Large.png b/images/800px-OPeNDAP-Logo_Large.png new file mode 100644 index 0000000..8853d33 Binary files /dev/null and b/images/800px-OPeNDAP-Logo_Large.png differ diff --git a/images/800px-Ps_bathymetry.png b/images/800px-Ps_bathymetry.png new file mode 100644 index 0000000..324593b Binary files /dev/null and b/images/800px-Ps_bathymetry.png differ diff --git a/images/800px-RDH_ActivityDiagram.png b/images/800px-RDH_ActivityDiagram.png new file mode 100644 index 0000000..03865a1 Binary files /dev/null and b/images/800px-RDH_ActivityDiagram.png differ diff --git a/images/800px-RDH_StaticClasses.png b/images/800px-RDH_StaticClasses.png new file mode 100644 index 0000000..e6ddf57 Binary files /dev/null and b/images/800px-RDH_StaticClasses.png differ diff --git a/images/800px-REAP_Cataloging_Deployment.png b/images/800px-REAP_Cataloging_Deployment.png new file mode 100644 index 0000000..51258a8 Binary files /dev/null and b/images/800px-REAP_Cataloging_Deployment.png differ diff --git a/images/800px-Ss_geospatial.png b/images/800px-Ss_geospatial.png new file mode 100644 index 0000000..3c255ec Binary files /dev/null and b/images/800px-Ss_geospatial.png differ diff --git a/images/800px-Ss_retrieval.png b/images/800px-Ss_retrieval.png new file mode 100644 index 0000000..9a39503 Binary files /dev/null and b/images/800px-Ss_retrieval.png differ diff --git a/images/800px-THREDDS-Search.png b/images/800px-THREDDS-Search.png new file mode 100644 index 0000000..85e4a22 Binary files /dev/null and b/images/800px-THREDDS-Search.png differ diff --git a/images/800px-WCS-UC1.0-ActivityDiagram.png b/images/800px-WCS-UC1.0-ActivityDiagram.png new file mode 100644 index 0000000..85e3c6a Binary files /dev/null and b/images/800px-WCS-UC1.0-ActivityDiagram.png differ diff --git a/images/800px-WCS-UC1.1-ActivityDiagram.png b/images/800px-WCS-UC1.1-ActivityDiagram.png new file mode 100644 index 0000000..58fca8b Binary files /dev/null and b/images/800px-WCS-UC1.1-ActivityDiagram.png differ diff --git a/images/800px-WCS-Uc2.0.png b/images/800px-WCS-Uc2.0.png new file mode 100644 index 0000000..8b90ba5 Binary files /dev/null and b/images/800px-WCS-Uc2.0.png differ diff --git a/images/800px-WCS-Uc3.0.png b/images/800px-WCS-Uc3.0.png new file mode 100644 index 0000000..61506d8 Binary files /dev/null and b/images/800px-WCS-Uc3.0.png differ diff --git a/images/800px-WCS_packages_high_level.png b/images/800px-WCS_packages_high_level.png new file mode 100644 index 0000000..dc7cca5 Binary files /dev/null and b/images/800px-WCS_packages_high_level.png differ diff --git a/images/81px-ServiceDescriptionPrototype-01.png b/images/81px-ServiceDescriptionPrototype-01.png new file mode 100644 index 0000000..d568655 Binary files /dev/null and b/images/81px-ServiceDescriptionPrototype-01.png differ diff --git a/images/850px-DAPAuthClientCerts.png b/images/850px-DAPAuthClientCerts.png new file mode 100644 index 0000000..6659563 Binary files /dev/null and b/images/850px-DAPAuthClientCerts.png differ diff --git a/images/850px-DAPAuthInteractive.png b/images/850px-DAPAuthInteractive.png new file mode 100644 index 0000000..6be6311 Binary files /dev/null and b/images/850px-DAPAuthInteractive.png differ diff --git a/images/89px-Server_state_diagram.jpg b/images/89px-Server_state_diagram.jpg new file mode 100644 index 0000000..f4a36e9 Binary files /dev/null and b/images/89px-Server_state_diagram.jpg differ diff --git a/images/900px-CertAuth.png b/images/900px-CertAuth.png new file mode 100644 index 0000000..d8c80da Binary files /dev/null and b/images/900px-CertAuth.png differ diff --git a/images/900px-OAuth2.png b/images/900px-OAuth2.png new file mode 100644 index 0000000..4aabfca Binary files /dev/null and b/images/900px-OAuth2.png differ diff --git a/images/900px-WCS-UC1.0-ActivityDiagram.png b/images/900px-WCS-UC1.0-ActivityDiagram.png new file mode 100644 index 0000000..879e06b Binary files /dev/null and b/images/900px-WCS-UC1.0-ActivityDiagram.png differ diff --git a/images/900px-WCS-UC1.1-ActivityDiagram.png b/images/900px-WCS-UC1.1-ActivityDiagram.png new file mode 100644 index 0000000..ce711e1 Binary files /dev/null and b/images/900px-WCS-UC1.1-ActivityDiagram.png differ diff --git a/images/900px-WCS-Uc2.0.png b/images/900px-WCS-Uc2.0.png new file mode 100644 index 0000000..c54b3c9 Binary files /dev/null and b/images/900px-WCS-Uc2.0.png differ diff --git a/images/900px-WCS-Uc3.0.png b/images/900px-WCS-Uc3.0.png new file mode 100644 index 0000000..589abf9 Binary files /dev/null and b/images/900px-WCS-Uc3.0.png differ diff --git a/images/90px-Connect_proposed_asynchronous_processing.png b/images/90px-Connect_proposed_asynchronous_processing.png new file mode 100644 index 0000000..6bb1082 Binary files /dev/null and b/images/90px-Connect_proposed_asynchronous_processing.png differ diff --git a/images/90px-Noaa-logo.jpg b/images/90px-Noaa-logo.jpg new file mode 100644 index 0000000..7ef9039 Binary files /dev/null and b/images/90px-Noaa-logo.jpg differ diff --git a/images/92px-RDH_ActivityDiagram.png b/images/92px-RDH_ActivityDiagram.png new file mode 100644 index 0000000..30e2df7 Binary files /dev/null and b/images/92px-RDH_ActivityDiagram.png differ diff --git a/images/93px-Connect_synchronous_processing.png b/images/93px-Connect_synchronous_processing.png new file mode 100644 index 0000000..58ad595 Binary files /dev/null and b/images/93px-Connect_synchronous_processing.png differ diff --git a/images/94px-REAP_Cataloging_Deployment.png b/images/94px-REAP_Cataloging_Deployment.png new file mode 100644 index 0000000..d8b2ba3 Binary files /dev/null and b/images/94px-REAP_Cataloging_Deployment.png differ diff --git a/images/95px-Nasa-logo.jpg b/images/95px-Nasa-logo.jpg new file mode 100644 index 0000000..050a320 Binary files /dev/null and b/images/95px-Nasa-logo.jpg differ diff --git a/images/95px-Nsf-logo.png b/images/95px-Nsf-logo.png new file mode 100644 index 0000000..77c168d Binary files /dev/null and b/images/95px-Nsf-logo.png differ diff --git a/images/960px-BuildingDDS.png b/images/960px-BuildingDDS.png new file mode 100644 index 0000000..195c5c2 Binary files /dev/null and b/images/960px-BuildingDDS.png differ diff --git a/images/960px-HyraxWcsPrototype.png b/images/960px-HyraxWcsPrototype.png new file mode 100644 index 0000000..bdd5ce5 Binary files /dev/null and b/images/960px-HyraxWcsPrototype.png differ diff --git a/images/960px-ParsingConstraintExpression.png b/images/960px-ParsingConstraintExpression.png new file mode 100644 index 0000000..cc655d6 Binary files /dev/null and b/images/960px-ParsingConstraintExpression.png differ diff --git a/images/960px-RDH_StaticClasses.png b/images/960px-RDH_StaticClasses.png new file mode 100644 index 0000000..5b85a8d Binary files /dev/null and b/images/960px-RDH_StaticClasses.png differ diff --git a/images/96px-THREDDS-Search.png b/images/96px-THREDDS-Search.png new file mode 100644 index 0000000..c0d174c Binary files /dev/null and b/images/96px-THREDDS-Search.png differ diff --git a/images/97px-Reynolds_das.png b/images/97px-Reynolds_das.png new file mode 100644 index 0000000..c176109 Binary files /dev/null and b/images/97px-Reynolds_das.png differ diff --git a/images/98px-Dependencies_first.png b/images/98px-Dependencies_first.png new file mode 100644 index 0000000..f7b12ab Binary files /dev/null and b/images/98px-Dependencies_first.png differ diff --git a/images/99px-BuildonlyDDX.png b/images/99px-BuildonlyDDX.png new file mode 100644 index 0000000..089d141 Binary files /dev/null and b/images/99px-BuildonlyDDX.png differ diff --git a/images/99px-DAP4_DataDDX_Design_1.png b/images/99px-DAP4_DataDDX_Design_1.png new file mode 100644 index 0000000..e0ed524 Binary files /dev/null and b/images/99px-DAP4_DataDDX_Design_1.png differ diff --git a/images/99px-DAP4_DataDDX_Design_2.png b/images/99px-DAP4_DataDDX_Design_2.png new file mode 100644 index 0000000..694342e Binary files /dev/null and b/images/99px-DAP4_DataDDX_Design_2.png differ diff --git a/images/99px-DAP_4_DM_UML.png b/images/99px-DAP_4_DM_UML.png new file mode 100644 index 0000000..b864f24 Binary files /dev/null and b/images/99px-DAP_4_DM_UML.png differ diff --git a/images/ATLAS03_ConstrainedDMR.png b/images/ATLAS03_ConstrainedDMR.png new file mode 100644 index 0000000..04cabea Binary files /dev/null and b/images/ATLAS03_ConstrainedDMR.png differ diff --git a/images/AVHRRPathfinder-Example.png b/images/AVHRRPathfinder-Example.png new file mode 100644 index 0000000..900ff29 Binary files /dev/null and b/images/AVHRRPathfinder-Example.png differ diff --git a/images/Add_Existing_Repo.png b/images/Add_Existing_Repo.png new file mode 100644 index 0000000..eae0b30 Binary files /dev/null and b/images/Add_Existing_Repo.png differ diff --git a/images/Aggregation_Sequnece.png b/images/Aggregation_Sequnece.png new file mode 100644 index 0000000..f7f19f6 Binary files /dev/null and b/images/Aggregation_Sequnece.png differ diff --git a/images/Aggregation_component.png b/images/Aggregation_component.png new file mode 100644 index 0000000..5912329 Binary files /dev/null and b/images/Aggregation_component.png differ diff --git a/images/Arch.gif b/images/Arch.gif new file mode 100644 index 0000000..cbc36be Binary files /dev/null and b/images/Arch.gif differ diff --git a/images/Attrtable.gif b/images/Attrtable.gif new file mode 100644 index 0000000..464bc0b Binary files /dev/null and b/images/Attrtable.gif differ diff --git a/images/BES_Handler_class_diagram.png b/images/BES_Handler_class_diagram.png new file mode 100644 index 0000000..773106d Binary files /dev/null and b/images/BES_Handler_class_diagram.png differ diff --git a/images/BES_Handler_class_diagram_detailed.png b/images/BES_Handler_class_diagram_detailed.png new file mode 100644 index 0000000..6f334de Binary files /dev/null and b/images/BES_Handler_class_diagram_detailed.png differ diff --git a/images/BES_chunking_7_1.jpg b/images/BES_chunking_7_1.jpg new file mode 100644 index 0000000..ccb1a95 Binary files /dev/null and b/images/BES_chunking_7_1.jpg differ diff --git a/images/Basic_PM_Window.png b/images/Basic_PM_Window.png new file mode 100644 index 0000000..54159e6 Binary files /dev/null and b/images/Basic_PM_Window.png differ diff --git a/images/Besctl-01.jpg b/images/Besctl-01.jpg new file mode 100644 index 0000000..1972e2d Binary files /dev/null and b/images/Besctl-01.jpg differ diff --git a/images/BuildDASDDS.png b/images/BuildDASDDS.png new file mode 100644 index 0000000..d2f191c Binary files /dev/null and b/images/BuildDASDDS.png differ diff --git a/images/BuildingDDS.png b/images/BuildingDDS.png new file mode 100644 index 0000000..2c61830 Binary files /dev/null and b/images/BuildingDDS.png differ diff --git a/images/BuildonlyDDX.png b/images/BuildonlyDDX.png new file mode 100644 index 0000000..c56cc50 Binary files /dev/null and b/images/BuildonlyDDX.png differ diff --git a/images/COPYING.txt b/images/COPYING.txt new file mode 100644 index 0000000..b6f92f3 --- /dev/null +++ b/images/COPYING.txt @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/images/CertAuth.png b/images/CertAuth.png new file mode 100644 index 0000000..5f93c66 Binary files /dev/null and b/images/CertAuth.png differ diff --git a/images/Check_paths.png b/images/Check_paths.png new file mode 100644 index 0000000..686f5a6 Binary files /dev/null and b/images/Check_paths.png differ diff --git a/images/ChunkedStreamReaderStateDiagram.png b/images/ChunkedStreamReaderStateDiagram.png new file mode 100644 index 0000000..7e4488d Binary files /dev/null and b/images/ChunkedStreamReaderStateDiagram.png differ diff --git a/images/Client-arch1.gif b/images/Client-arch1.gif new file mode 100644 index 0000000..81d0bb2 Binary files /dev/null and b/images/Client-arch1.gif differ diff --git a/images/Client-arch2.gif b/images/Client-arch2.gif new file mode 100644 index 0000000..6c69fde Binary files /dev/null and b/images/Client-arch2.gif differ diff --git a/images/Client_state_diagram.jpg b/images/Client_state_diagram.jpg new file mode 100644 index 0000000..2105970 Binary files /dev/null and b/images/Client_state_diagram.jpg differ diff --git a/images/Communication_flow.jpg b/images/Communication_flow.jpg new file mode 100644 index 0000000..4ac28ed Binary files /dev/null and b/images/Communication_flow.jpg differ diff --git a/images/Connect.gif b/images/Connect.gif new file mode 100644 index 0000000..10e0dbf Binary files /dev/null and b/images/Connect.gif differ diff --git a/images/Connect_proposed_asynchronous_processing.png b/images/Connect_proposed_asynchronous_processing.png new file mode 100644 index 0000000..561a05f Binary files /dev/null and b/images/Connect_proposed_asynchronous_processing.png differ diff --git a/images/Connect_synchronous_processing.png b/images/Connect_synchronous_processing.png new file mode 100644 index 0000000..253c0a1 Binary files /dev/null and b/images/Connect_synchronous_processing.png differ diff --git a/images/DAP4_DataDDX_Design_1.png b/images/DAP4_DataDDX_Design_1.png new file mode 100644 index 0000000..f24ac43 Binary files /dev/null and b/images/DAP4_DataDDX_Design_1.png differ diff --git a/images/DAP4_DataDDX_Design_2.png b/images/DAP4_DataDDX_Design_2.png new file mode 100644 index 0000000..0662321 Binary files /dev/null and b/images/DAP4_DataDDX_Design_2.png differ diff --git a/images/DAP4vsDAP2.png b/images/DAP4vsDAP2.png new file mode 100644 index 0000000..f58364f Binary files /dev/null and b/images/DAP4vsDAP2.png differ diff --git a/images/DAPAuthClientCerts.png b/images/DAPAuthClientCerts.png new file mode 100644 index 0000000..cb77329 Binary files /dev/null and b/images/DAPAuthClientCerts.png differ diff --git a/images/DAPAuthInteractive.png b/images/DAPAuthInteractive.png new file mode 100644 index 0000000..a97305a Binary files /dev/null and b/images/DAPAuthInteractive.png differ diff --git a/images/DAP_2_DM_UML.png b/images/DAP_2_DM_UML.png new file mode 100644 index 0000000..d60d68f Binary files /dev/null and b/images/DAP_2_DM_UML.png differ diff --git a/images/DAP_4_ADM.jpg b/images/DAP_4_ADM.jpg new file mode 100644 index 0000000..88d486e Binary files /dev/null and b/images/DAP_4_ADM.jpg differ diff --git a/images/DAP_4_DM_UML.png b/images/DAP_4_DM_UML.png new file mode 100644 index 0000000..6b3903d Binary files /dev/null and b/images/DAP_4_DM_UML.png differ diff --git a/images/DAS.gif b/images/DAS.gif new file mode 100644 index 0000000..f8898da Binary files /dev/null and b/images/DAS.gif differ diff --git a/images/DDS.gif b/images/DDS.gif new file mode 100644 index 0000000..a825a21 Binary files /dev/null and b/images/DDS.gif differ diff --git a/images/DRF_ATLAS03.png b/images/DRF_ATLAS03.png new file mode 100644 index 0000000..73bc26b Binary files /dev/null and b/images/DRF_ATLAS03.png differ diff --git a/images/Dap4spec3nov03TODO.pdf b/images/Dap4spec3nov03TODO.pdf new file mode 100644 index 0000000..11a1bd3 Binary files /dev/null and b/images/Dap4spec3nov03TODO.pdf differ diff --git a/images/Dap_objectsdraft3nov03.pdf b/images/Dap_objectsdraft3nov03.pdf new file mode 100644 index 0000000..1feea2a Binary files /dev/null and b/images/Dap_objectsdraft3nov03.pdf differ diff --git a/images/DataDDS.gif b/images/DataDDS.gif new file mode 100644 index 0000000..24e4d9d Binary files /dev/null and b/images/DataDDS.gif differ diff --git a/images/Daymet_Daily_V4R1_Fig1.png b/images/Daymet_Daily_V4R1_Fig1.png new file mode 100644 index 0000000..1b08437 Binary files /dev/null and b/images/Daymet_Daily_V4R1_Fig1.png differ diff --git a/images/Dependencies_first.png b/images/Dependencies_first.png new file mode 100644 index 0000000..2590960 Binary files /dev/null and b/images/Dependencies_first.png differ diff --git a/images/DescribeCoverage.png b/images/DescribeCoverage.png new file mode 100644 index 0000000..a58f951 Binary files /dev/null and b/images/DescribeCoverage.png differ diff --git a/images/DirectoryView.png b/images/DirectoryView.png new file mode 100644 index 0000000..dd79571 Binary files /dev/null and b/images/DirectoryView.png differ diff --git a/images/Dm.png b/images/Dm.png new file mode 100644 index 0000000..5fd5daf Binary files /dev/null and b/images/Dm.png differ diff --git a/images/Do_not_use_res.png b/images/Do_not_use_res.png new file mode 100644 index 0000000..640893a Binary files /dev/null and b/images/Do_not_use_res.png differ diff --git a/images/ECOSTRESS-Example.png b/images/ECOSTRESS-Example.png new file mode 100644 index 0000000..bc23403 Binary files /dev/null and b/images/ECOSTRESS-Example.png differ diff --git a/images/EDL-Approve-Apps-Application-Authorize.png b/images/EDL-Approve-Apps-Application-Authorize.png new file mode 100644 index 0000000..edc4445 Binary files /dev/null and b/images/EDL-Approve-Apps-Application-Authorize.png differ diff --git a/images/EDL-Approve-Apps-Application-Search.png b/images/EDL-Approve-Apps-Application-Search.png new file mode 100644 index 0000000..b761100 Binary files /dev/null and b/images/EDL-Approve-Apps-Application-Search.png differ diff --git a/images/EDL-Approved-Apps.png b/images/EDL-Approved-Apps.png new file mode 100644 index 0000000..91f03b9 Binary files /dev/null and b/images/EDL-Approved-Apps.png differ diff --git a/images/EDL_Generate_Token_Page_1.png b/images/EDL_Generate_Token_Page_1.png new file mode 100644 index 0000000..bc66346 Binary files /dev/null and b/images/EDL_Generate_Token_Page_1.png differ diff --git a/images/EDL_Generate_Token_Page_2.png b/images/EDL_Generate_Token_Page_2.png new file mode 100644 index 0000000..0b480af Binary files /dev/null and b/images/EDL_Generate_Token_Page_2.png differ diff --git a/images/EDL_Profile_Page.png b/images/EDL_Profile_Page.png new file mode 100644 index 0000000..1d22cce Binary files /dev/null and b/images/EDL_Profile_Page.png differ diff --git a/images/Edit_interface.jpg b/images/Edit_interface.jpg new file mode 100644 index 0000000..0ea487f Binary files /dev/null and b/images/Edit_interface.jpg differ diff --git a/images/Edit_the_squid.conf_file.png b/images/Edit_the_squid.conf_file.png new file mode 100644 index 0000000..7fc4c7c Binary files /dev/null and b/images/Edit_the_squid.conf_file.png differ diff --git a/images/Ff1.jpg b/images/Ff1.jpg new file mode 100644 index 0000000..57aba9c Binary files /dev/null and b/images/Ff1.jpg differ diff --git a/images/GHRSST(PODAAC)-Example.png b/images/GHRSST(PODAAC)-Example.png new file mode 100644 index 0000000..94de247 Binary files /dev/null and b/images/GHRSST(PODAAC)-Example.png differ diff --git a/images/GHRSST(PODAAC)-MUR-Example.png b/images/GHRSST(PODAAC)-MUR-Example.png new file mode 100644 index 0000000..633222c Binary files /dev/null and b/images/GHRSST(PODAAC)-MUR-Example.png differ diff --git a/images/GSoC2011_300x200.png b/images/GSoC2011_300x200.png new file mode 100644 index 0000000..4d6263b Binary files /dev/null and b/images/GSoC2011_300x200.png differ diff --git a/images/GSoC2012_300x200.png b/images/GSoC2012_300x200.png new file mode 100644 index 0000000..28c188b Binary files /dev/null and b/images/GSoC2012_300x200.png differ diff --git a/images/GSoC2013_300x200.png b/images/GSoC2013_300x200.png new file mode 100644 index 0000000..ecf53ac Binary files /dev/null and b/images/GSoC2013_300x200.png differ diff --git a/images/GSoC_2010_300x267px.jpg b/images/GSoC_2010_300x267px.jpg new file mode 100644 index 0000000..d8ec5c3 Binary files /dev/null and b/images/GSoC_2010_300x267px.jpg differ diff --git a/images/Gateway_service.jpg b/images/Gateway_service.jpg new file mode 100644 index 0000000..291becc Binary files /dev/null and b/images/Gateway_service.jpg differ diff --git a/images/GetCoverage.png b/images/GetCoverage.png new file mode 100644 index 0000000..a6a19f3 Binary files /dev/null and b/images/GetCoverage.png differ diff --git a/images/Git_Repo_Perspective.png b/images/Git_Repo_Perspective.png new file mode 100644 index 0000000..42d90c8 Binary files /dev/null and b/images/Git_Repo_Perspective.png differ diff --git a/images/Grid.gif b/images/Grid.gif new file mode 100644 index 0000000..5d1cccb Binary files /dev/null and b/images/Grid.gif differ diff --git a/images/Grid.png b/images/Grid.png new file mode 100644 index 0000000..7fe5ba6 Binary files /dev/null and b/images/Grid.png differ diff --git a/images/Gridpts.gif b/images/Gridpts.gif new file mode 100644 index 0000000..77ad2d3 Binary files /dev/null and b/images/Gridpts.gif differ diff --git a/images/Gridpts.png b/images/Gridpts.png new file mode 100644 index 0000000..643137e Binary files /dev/null and b/images/Gridpts.png differ diff --git a/images/Gsodock-das.png b/images/Gsodock-das.png new file mode 100644 index 0000000..0a33236 Binary files /dev/null and b/images/Gsodock-das.png differ diff --git a/images/Gsodock-dds.png b/images/Gsodock-dds.png new file mode 100644 index 0000000..a3afc0a Binary files /dev/null and b/images/Gsodock-dds.png differ diff --git a/images/Gsodock-html.png b/images/Gsodock-html.png new file mode 100644 index 0000000..6774431 Binary files /dev/null and b/images/Gsodock-html.png differ diff --git a/images/Hai-Slide02.jpg b/images/Hai-Slide02.jpg new file mode 100644 index 0000000..806dc19 Binary files /dev/null and b/images/Hai-Slide02.jpg differ diff --git a/images/Hai-Slide03.jpg b/images/Hai-Slide03.jpg new file mode 100644 index 0000000..1961283 Binary files /dev/null and b/images/Hai-Slide03.jpg differ diff --git a/images/Hai-Slide04.jpg b/images/Hai-Slide04.jpg new file mode 100644 index 0000000..e4231fb Binary files /dev/null and b/images/Hai-Slide04.jpg differ diff --git a/images/Hai-Slide05.jpg b/images/Hai-Slide05.jpg new file mode 100644 index 0000000..b6d84e9 Binary files /dev/null and b/images/Hai-Slide05.jpg differ diff --git a/images/Hai-Slide06.jpg b/images/Hai-Slide06.jpg new file mode 100644 index 0000000..e7afec2 Binary files /dev/null and b/images/Hai-Slide06.jpg differ diff --git a/images/Hai-Slide07.jpg b/images/Hai-Slide07.jpg new file mode 100644 index 0000000..4af1957 Binary files /dev/null and b/images/Hai-Slide07.jpg differ diff --git a/images/Hai-Slide08.jpg b/images/Hai-Slide08.jpg new file mode 100644 index 0000000..1a5ab22 Binary files /dev/null and b/images/Hai-Slide08.jpg differ diff --git a/images/Hai-Slide09.jpg b/images/Hai-Slide09.jpg new file mode 100644 index 0000000..81b8c61 Binary files /dev/null and b/images/Hai-Slide09.jpg differ diff --git a/images/Hai-Slide10.jpg b/images/Hai-Slide10.jpg new file mode 100644 index 0000000..b489336 Binary files /dev/null and b/images/Hai-Slide10.jpg differ diff --git a/images/Hai-Slide11.jpg b/images/Hai-Slide11.jpg new file mode 100644 index 0000000..e9e8514 Binary files /dev/null and b/images/Hai-Slide11.jpg differ diff --git a/images/Hai-Slide12.jpg b/images/Hai-Slide12.jpg new file mode 100644 index 0000000..0ab7eb8 Binary files /dev/null and b/images/Hai-Slide12.jpg differ diff --git a/images/Hai-Slide13.jpg b/images/Hai-Slide13.jpg new file mode 100644 index 0000000..afbb388 Binary files /dev/null and b/images/Hai-Slide13.jpg differ diff --git a/images/Hai-Slide14.jpg b/images/Hai-Slide14.jpg new file mode 100644 index 0000000..a405b12 Binary files /dev/null and b/images/Hai-Slide14.jpg differ diff --git a/images/Hai-Slide15.jpg b/images/Hai-Slide15.jpg new file mode 100644 index 0000000..fa95c77 Binary files /dev/null and b/images/Hai-Slide15.jpg differ diff --git a/images/Hai-Slide16.jpg b/images/Hai-Slide16.jpg new file mode 100644 index 0000000..176fa13 Binary files /dev/null and b/images/Hai-Slide16.jpg differ diff --git a/images/Hai-Slide17.jpg b/images/Hai-Slide17.jpg new file mode 100644 index 0000000..086e9b4 Binary files /dev/null and b/images/Hai-Slide17.jpg differ diff --git a/images/Hai-Slide18.jpg b/images/Hai-Slide18.jpg new file mode 100644 index 0000000..d8d3b95 Binary files /dev/null and b/images/Hai-Slide18.jpg differ diff --git a/images/Hyrax-1.8-Catalog.png b/images/Hyrax-1.8-Catalog.png new file mode 100644 index 0000000..f1d11a8 Binary files /dev/null and b/images/Hyrax-1.8-Catalog.png differ diff --git a/images/Hyrax-2.0-Catalog.png b/images/Hyrax-2.0-Catalog.png new file mode 100644 index 0000000..a020145 Binary files /dev/null and b/images/Hyrax-2.0-Catalog.png differ diff --git a/images/HyraxArchitecture.jpg b/images/HyraxArchitecture.jpg new file mode 100644 index 0000000..5a16a65 Binary files /dev/null and b/images/HyraxArchitecture.jpg differ diff --git a/images/HyraxModuleIntegration-1.2.pdf b/images/HyraxModuleIntegration-1.2.pdf new file mode 100644 index 0000000..40d881a Binary files /dev/null and b/images/HyraxModuleIntegration-1.2.pdf differ diff --git a/images/HyraxWcsPrototype.png b/images/HyraxWcsPrototype.png new file mode 100644 index 0000000..1353080 Binary files /dev/null and b/images/HyraxWcsPrototype.png differ diff --git a/images/Hyrax_with_AMQP.png b/images/Hyrax_with_AMQP.png new file mode 100644 index 0000000..9aa07e5 Binary files /dev/null and b/images/Hyrax_with_AMQP.png differ diff --git a/images/IDV-LDAP.png b/images/IDV-LDAP.png new file mode 100644 index 0000000..5edc67a Binary files /dev/null and b/images/IDV-LDAP.png differ diff --git a/images/IDV-Shibboleth.png b/images/IDV-Shibboleth.png new file mode 100644 index 0000000..d93c7d1 Binary files /dev/null and b/images/IDV-Shibboleth.png differ diff --git a/images/IDVAuthDialog.png b/images/IDVAuthDialog.png new file mode 100644 index 0000000..2259224 Binary files /dev/null and b/images/IDVAuthDialog.png differ diff --git a/images/Iess_dat_asc.png b/images/Iess_dat_asc.png new file mode 100644 index 0000000..c7f1828 Binary files /dev/null and b/images/Iess_dat_asc.png differ diff --git a/images/Iess_dat_das.png b/images/Iess_dat_das.png new file mode 100644 index 0000000..c150d18 Binary files /dev/null and b/images/Iess_dat_das.png differ diff --git a/images/Iess_dat_dds.png b/images/Iess_dat_dds.png new file mode 100644 index 0000000..7a2649a Binary files /dev/null and b/images/Iess_dat_dds.png differ diff --git a/images/Iess_location_das.png b/images/Iess_location_das.png new file mode 100644 index 0000000..faf24fd Binary files /dev/null and b/images/Iess_location_das.png differ diff --git a/images/Iess_location_dds.png b/images/Iess_location_dds.png new file mode 100644 index 0000000..af7e62a Binary files /dev/null and b/images/Iess_location_dds.png differ diff --git a/images/Ifh-dir.gif b/images/Ifh-dir.gif new file mode 100644 index 0000000..349a23d Binary files /dev/null and b/images/Ifh-dir.gif differ diff --git a/images/Ifh.gif b/images/Ifh.gif new file mode 100644 index 0000000..a4fbc40 Binary files /dev/null and b/images/Ifh.gif differ diff --git a/images/Image-191216-061531.647.png b/images/Image-191216-061531.647.png new file mode 100644 index 0000000..8def03c Binary files /dev/null and b/images/Image-191216-061531.647.png differ diff --git a/images/Installfig1.gif b/images/Installfig1.gif new file mode 100644 index 0000000..88ca465 Binary files /dev/null and b/images/Installfig1.gif differ diff --git a/images/Installfig2.gif b/images/Installfig2.gif new file mode 100644 index 0000000..c4f4305 Binary files /dev/null and b/images/Installfig2.gif differ diff --git a/images/Instruction_options.png b/images/Instruction_options.png new file mode 100644 index 0000000..df07878 Binary files /dev/null and b/images/Instruction_options.png differ diff --git a/images/Instruction_plot.png b/images/Instruction_plot.png new file mode 100644 index 0000000..bfdefbb Binary files /dev/null and b/images/Instruction_plot.png differ diff --git a/images/Instruction_text.png b/images/Instruction_text.png new file mode 100644 index 0000000..9f525e2 Binary files /dev/null and b/images/Instruction_text.png differ diff --git a/images/Janee-hardy.pdf b/images/Janee-hardy.pdf new file mode 100644 index 0000000..dba7450 Binary files /dev/null and b/images/Janee-hardy.pdf differ diff --git a/images/Linked.png b/images/Linked.png new file mode 100644 index 0000000..4e4f1dd Binary files /dev/null and b/images/Linked.png differ diff --git a/images/MediaWikiRefCard.pdf b/images/MediaWikiRefCard.pdf new file mode 100644 index 0000000..1681399 Binary files /dev/null and b/images/MediaWikiRefCard.pdf differ diff --git a/images/Memory_stick_2.png b/images/Memory_stick_2.png new file mode 100644 index 0000000..e013a5f Binary files /dev/null and b/images/Memory_stick_2.png differ diff --git a/images/Migration_Fig_1.png b/images/Migration_Fig_1.png new file mode 100644 index 0000000..ba2d09a Binary files /dev/null and b/images/Migration_Fig_1.png differ diff --git a/images/Migration_Fig_2.png b/images/Migration_Fig_2.png new file mode 100644 index 0000000..11282f0 Binary files /dev/null and b/images/Migration_Fig_2.png differ diff --git a/images/Migration_Fig_3.png b/images/Migration_Fig_3.png new file mode 100644 index 0000000..6832276 Binary files /dev/null and b/images/Migration_Fig_3.png differ diff --git a/images/Nasa-logo.jpg b/images/Nasa-logo.jpg new file mode 100644 index 0000000..1d0bf87 Binary files /dev/null and b/images/Nasa-logo.jpg differ diff --git a/images/NcML_Activity_diagram.png b/images/NcML_Activity_diagram.png new file mode 100644 index 0000000..7a261c5 Binary files /dev/null and b/images/NcML_Activity_diagram.png differ diff --git a/images/NcML_Object_diagram_1.png b/images/NcML_Object_diagram_1.png new file mode 100644 index 0000000..e7f1eb2 Binary files /dev/null and b/images/NcML_Object_diagram_1.png differ diff --git a/images/NcML_XML_Parsing_state_diagram_1.png b/images/NcML_XML_Parsing_state_diagram_1.png new file mode 100644 index 0000000..467adfc Binary files /dev/null and b/images/NcML_XML_Parsing_state_diagram_1.png differ diff --git a/images/Nest-attrtable.gif b/images/Nest-attrtable.gif new file mode 100644 index 0000000..b603948 Binary files /dev/null and b/images/Nest-attrtable.gif differ diff --git a/images/NetCDF_OPeNDAP_Integration_Project_Ki....doc b/images/NetCDF_OPeNDAP_Integration_Project_Ki....doc new file mode 100644 index 0000000..a4c133b Binary files /dev/null and b/images/NetCDF_OPeNDAP_Integration_Project_Ki....doc differ diff --git a/images/Netcdf1.jpg b/images/Netcdf1.jpg new file mode 100644 index 0000000..f193aa5 Binary files /dev/null and b/images/Netcdf1.jpg differ diff --git a/images/Netcdf4.jpg b/images/Netcdf4.jpg new file mode 100644 index 0000000..c049b45 Binary files /dev/null and b/images/Netcdf4.jpg differ diff --git a/images/Noaa-logo.jpg b/images/Noaa-logo.jpg new file mode 100644 index 0000000..d8c023b Binary files /dev/null and b/images/Noaa-logo.jpg differ diff --git a/images/Nsf-logo.png b/images/Nsf-logo.png new file mode 100644 index 0000000..4285072 Binary files /dev/null and b/images/Nsf-logo.png differ diff --git a/images/OAuth2.png b/images/OAuth2.png new file mode 100644 index 0000000..a5e3b17 Binary files /dev/null and b/images/OAuth2.png differ diff --git a/images/OLFS_current.png b/images/OLFS_current.png new file mode 100644 index 0000000..d440c3b Binary files /dev/null and b/images/OLFS_current.png differ diff --git a/images/OLFS_new_AMQP.png b/images/OLFS_new_AMQP.png new file mode 100644 index 0000000..16a166d Binary files /dev/null and b/images/OLFS_new_AMQP.png differ diff --git a/images/OLFS_new_servlet.png b/images/OLFS_new_servlet.png new file mode 100644 index 0000000..4a88940 Binary files /dev/null and b/images/OLFS_new_servlet.png differ diff --git a/images/OPeNDAP-Logo_Large.png b/images/OPeNDAP-Logo_Large.png new file mode 100644 index 0000000..eb68eb3 Binary files /dev/null and b/images/OPeNDAP-Logo_Large.png differ diff --git a/images/OPeNDAP_nadeau_2.jpg b/images/OPeNDAP_nadeau_2.jpg new file mode 100644 index 0000000..68b3bb6 Binary files /dev/null and b/images/OPeNDAP_nadeau_2.jpg differ diff --git a/images/Once_Added.png b/images/Once_Added.png new file mode 100644 index 0000000..60ffd02 Binary files /dev/null and b/images/Once_Added.png differ diff --git a/images/OpenIDSequenceDiagram.png b/images/OpenIDSequenceDiagram.png new file mode 100644 index 0000000..efaeef5 Binary files /dev/null and b/images/OpenIDSequenceDiagram.png differ diff --git a/images/Opendap_logo_masthead.gif b/images/Opendap_logo_masthead.gif new file mode 100644 index 0000000..c4a4212 Binary files /dev/null and b/images/Opendap_logo_masthead.gif differ diff --git a/images/Orig-client.gif b/images/Orig-client.gif new file mode 100644 index 0000000..e5456b9 Binary files /dev/null and b/images/Orig-client.gif differ diff --git a/images/Panoply-LDAP.png b/images/Panoply-LDAP.png new file mode 100644 index 0000000..dffc434 Binary files /dev/null and b/images/Panoply-LDAP.png differ diff --git a/images/Panoply-NPE.png b/images/Panoply-NPE.png new file mode 100644 index 0000000..8bd5bae Binary files /dev/null and b/images/Panoply-NPE.png differ diff --git a/images/Panoply-Shibboleth.png b/images/Panoply-Shibboleth.png new file mode 100644 index 0000000..01f5c42 Binary files /dev/null and b/images/Panoply-Shibboleth.png differ diff --git a/images/Panoply.png b/images/Panoply.png new file mode 100644 index 0000000..ed3fe04 Binary files /dev/null and b/images/Panoply.png differ diff --git a/images/PanoplyAuthDialog.png b/images/PanoplyAuthDialog.png new file mode 100644 index 0000000..2694c02 Binary files /dev/null and b/images/PanoplyAuthDialog.png differ diff --git a/images/Panoply_Graph.png b/images/Panoply_Graph.png new file mode 100644 index 0000000..c7f779c Binary files /dev/null and b/images/Panoply_Graph.png differ diff --git a/images/ParsingConstraintExpression.png b/images/ParsingConstraintExpression.png new file mode 100644 index 0000000..7d1b440 Binary files /dev/null and b/images/ParsingConstraintExpression.png differ diff --git a/images/Perspective_Menu.png b/images/Perspective_Menu.png new file mode 100644 index 0000000..32d5577 Binary files /dev/null and b/images/Perspective_Menu.png differ diff --git a/images/Ps_bathymetry.png b/images/Ps_bathymetry.png new file mode 100644 index 0000000..e92ee42 Binary files /dev/null and b/images/Ps_bathymetry.png differ diff --git a/images/Ps_bathymetry_index.png b/images/Ps_bathymetry_index.png new file mode 100644 index 0000000..0d90b8e Binary files /dev/null and b/images/Ps_bathymetry_index.png differ diff --git a/images/Ps_bathymetry_intermediate1.png b/images/Ps_bathymetry_intermediate1.png new file mode 100644 index 0000000..1cf377e Binary files /dev/null and b/images/Ps_bathymetry_intermediate1.png differ diff --git a/images/Ps_sst.png b/images/Ps_sst.png new file mode 100644 index 0000000..892a7be Binary files /dev/null and b/images/Ps_sst.png differ diff --git a/images/Ps_sst_index.png b/images/Ps_sst_index.png new file mode 100644 index 0000000..8fff805 Binary files /dev/null and b/images/Ps_sst_index.png differ diff --git a/images/Ps_weather.png b/images/Ps_weather.png new file mode 100644 index 0000000..449e248 Binary files /dev/null and b/images/Ps_weather.png differ diff --git a/images/Ps_weather_index.png b/images/Ps_weather_index.png new file mode 100644 index 0000000..6c27afa Binary files /dev/null and b/images/Ps_weather_index.png differ diff --git a/images/Ps_weather_intermediate.png b/images/Ps_weather_intermediate.png new file mode 100644 index 0000000..0bfb15f Binary files /dev/null and b/images/Ps_weather_intermediate.png differ diff --git a/images/RDH_ActivityDiagram.png b/images/RDH_ActivityDiagram.png new file mode 100644 index 0000000..b1f91fe Binary files /dev/null and b/images/RDH_ActivityDiagram.png differ diff --git a/images/RDH_StaticClasses.png b/images/RDH_StaticClasses.png new file mode 100644 index 0000000..56df763 Binary files /dev/null and b/images/RDH_StaticClasses.png differ diff --git a/images/REAP_Cataloging_Deployment.png b/images/REAP_Cataloging_Deployment.png new file mode 100644 index 0000000..91dc74f Binary files /dev/null and b/images/REAP_Cataloging_Deployment.png differ diff --git a/images/Regular.jpg b/images/Regular.jpg new file mode 100644 index 0000000..c45b1a1 Binary files /dev/null and b/images/Regular.jpg differ diff --git a/images/Release_branching.png b/images/Release_branching.png new file mode 100644 index 0000000..fb14553 Binary files /dev/null and b/images/Release_branching.png differ diff --git a/images/Restart_none.png b/images/Restart_none.png new file mode 100644 index 0000000..3ec1ae6 Binary files /dev/null and b/images/Restart_none.png differ diff --git a/images/Reynolds_das.png b/images/Reynolds_das.png new file mode 100644 index 0000000..dbc5196 Binary files /dev/null and b/images/Reynolds_das.png differ diff --git a/images/Reynolds_dds.png b/images/Reynolds_dds.png new file mode 100644 index 0000000..533ffc9 Binary files /dev/null and b/images/Reynolds_dds.png differ diff --git a/images/Reynolds_dmr.png b/images/Reynolds_dmr.png new file mode 100644 index 0000000..f369a65 Binary files /dev/null and b/images/Reynolds_dmr.png differ diff --git a/images/Reynolds_dmr_sst.png b/images/Reynolds_dmr_sst.png new file mode 100644 index 0000000..b669fcf Binary files /dev/null and b/images/Reynolds_dmr_sst.png differ diff --git a/images/Reynolds_ifh.png b/images/Reynolds_ifh.png new file mode 100644 index 0000000..134a856 Binary files /dev/null and b/images/Reynolds_ifh.png differ diff --git a/images/Reynolds_ifh_Action.png b/images/Reynolds_ifh_Action.png new file mode 100644 index 0000000..091fe58 Binary files /dev/null and b/images/Reynolds_ifh_Action.png differ diff --git a/images/Reynolds_sst.png b/images/Reynolds_sst.png new file mode 100644 index 0000000..5500c8e Binary files /dev/null and b/images/Reynolds_sst.png differ diff --git a/images/Reynolds_sst_geogrid.png b/images/Reynolds_sst_geogrid.png new file mode 100644 index 0000000..34a2eb7 Binary files /dev/null and b/images/Reynolds_sst_geogrid.png differ diff --git a/images/Reynolds_sst_linear_scale_geogrid.png b/images/Reynolds_sst_linear_scale_geogrid.png new file mode 100644 index 0000000..7af595d Binary files /dev/null and b/images/Reynolds_sst_linear_scale_geogrid.png differ diff --git a/images/Reynolds_time_vector.png b/images/Reynolds_time_vector.png new file mode 100644 index 0000000..d93e669 Binary files /dev/null and b/images/Reynolds_time_vector.png differ diff --git a/images/SDCIprogress080401.pdf b/images/SDCIprogress080401.pdf new file mode 100644 index 0000000..1eacabf Binary files /dev/null and b/images/SDCIprogress080401.pdf differ diff --git a/images/Screen_Shot_2013-09-12_at_2.00.11_PM.png b/images/Screen_Shot_2013-09-12_at_2.00.11_PM.png new file mode 100644 index 0000000..a698d4d Binary files /dev/null and b/images/Screen_Shot_2013-09-12_at_2.00.11_PM.png differ diff --git a/images/Screen_Shot_2013-09-12_at_2.00.20_PM.png b/images/Screen_Shot_2013-09-12_at_2.00.20_PM.png new file mode 100644 index 0000000..0591f81 Binary files /dev/null and b/images/Screen_Shot_2013-09-12_at_2.00.20_PM.png differ diff --git a/images/Screen_Shot_2014-08-11_at_12.34.19_PM.png b/images/Screen_Shot_2014-08-11_at_12.34.19_PM.png new file mode 100644 index 0000000..065da7b Binary files /dev/null and b/images/Screen_Shot_2014-08-11_at_12.34.19_PM.png differ diff --git a/images/Semanticsandopendap.pdf b/images/Semanticsandopendap.pdf new file mode 100644 index 0000000..b18891d Binary files /dev/null and b/images/Semanticsandopendap.pdf differ diff --git a/images/Server_state_diagram.jpg b/images/Server_state_diagram.jpg new file mode 100644 index 0000000..0bac93f Binary files /dev/null and b/images/Server_state_diagram.jpg differ diff --git a/images/ServiceDescriptionPrototype-01.png b/images/ServiceDescriptionPrototype-01.png new file mode 100644 index 0000000..1923c66 Binary files /dev/null and b/images/ServiceDescriptionPrototype-01.png differ diff --git a/images/Sld_WZJ07b.pdf b/images/Sld_WZJ07b.pdf new file mode 100644 index 0000000..f37b09d Binary files /dev/null and b/images/Sld_WZJ07b.pdf differ diff --git a/images/Squid_1.png b/images/Squid_1.png new file mode 100644 index 0000000..8026fd5 Binary files /dev/null and b/images/Squid_1.png differ diff --git a/images/Squid_2.png b/images/Squid_2.png new file mode 100644 index 0000000..57df043 Binary files /dev/null and b/images/Squid_2.png differ diff --git a/images/Squid_3.png b/images/Squid_3.png new file mode 100644 index 0000000..1141945 Binary files /dev/null and b/images/Squid_3.png differ diff --git a/images/Ss_datasetlist.png b/images/Ss_datasetlist.png new file mode 100644 index 0000000..e23c6fe Binary files /dev/null and b/images/Ss_datasetlist.png differ diff --git a/images/Ss_gcmd.png b/images/Ss_gcmd.png new file mode 100644 index 0000000..8dcadbe Binary files /dev/null and b/images/Ss_gcmd.png differ diff --git a/images/Ss_geospatial.png b/images/Ss_geospatial.png new file mode 100644 index 0000000..c7ce989 Binary files /dev/null and b/images/Ss_geospatial.png differ diff --git a/images/Ss_navigation.png b/images/Ss_navigation.png new file mode 100644 index 0000000..24d5525 Binary files /dev/null and b/images/Ss_navigation.png differ diff --git a/images/Ss_retrieval.png b/images/Ss_retrieval.png new file mode 100644 index 0000000..c2dbb59 Binary files /dev/null and b/images/Ss_retrieval.png differ diff --git a/images/Ss_view_plot.png b/images/Ss_view_plot.png new file mode 100644 index 0000000..cae5540 Binary files /dev/null and b/images/Ss_view_plot.png differ diff --git a/images/Sst.mnmean.nc.das.gif b/images/Sst.mnmean.nc.das.gif new file mode 100644 index 0000000..0f2df92 Binary files /dev/null and b/images/Sst.mnmean.nc.das.gif differ diff --git a/images/Sst.mnmean.nc.dds.gif b/images/Sst.mnmean.nc.dds.gif new file mode 100644 index 0000000..e5a310f Binary files /dev/null and b/images/Sst.mnmean.nc.dds.gif differ diff --git a/images/THREDDS-Search.png b/images/THREDDS-Search.png new file mode 100644 index 0000000..87fbddd Binary files /dev/null and b/images/THREDDS-Search.png differ diff --git a/images/Test.oopendap.org_directory_view.png b/images/Test.oopendap.org_directory_view.png new file mode 100644 index 0000000..1a42d0f Binary files /dev/null and b/images/Test.oopendap.org_directory_view.png differ diff --git a/images/ToolsUI-GridView.png b/images/ToolsUI-GridView.png new file mode 100644 index 0000000..e8f9635 Binary files /dev/null and b/images/ToolsUI-GridView.png differ diff --git a/images/ToolsUI-LDAP.png b/images/ToolsUI-LDAP.png new file mode 100644 index 0000000..a25d0ae Binary files /dev/null and b/images/ToolsUI-LDAP.png differ diff --git a/images/ToolsUI-Shibboleth.png b/images/ToolsUI-Shibboleth.png new file mode 100644 index 0000000..5722af3 Binary files /dev/null and b/images/ToolsUI-Shibboleth.png differ diff --git a/images/ToolsUIAuthDialog.png b/images/ToolsUIAuthDialog.png new file mode 100644 index 0000000..269614c Binary files /dev/null and b/images/ToolsUIAuthDialog.png differ diff --git a/images/ToolsUI_405_Error.png b/images/ToolsUI_405_Error.png new file mode 100644 index 0000000..69e3b43 Binary files /dev/null and b/images/ToolsUI_405_Error.png differ diff --git a/images/TopDir.png b/images/TopDir.png new file mode 100644 index 0000000..62fd56b Binary files /dev/null and b/images/TopDir.png differ diff --git a/images/TopDir2.png b/images/TopDir2.png new file mode 100644 index 0000000..31a88d6 Binary files /dev/null and b/images/TopDir2.png differ diff --git a/images/Tutorial.png b/images/Tutorial.png new file mode 100644 index 0000000..9e67225 Binary files /dev/null and b/images/Tutorial.png differ diff --git a/images/URSApplicationPending.png b/images/URSApplicationPending.png new file mode 100644 index 0000000..795f618 Binary files /dev/null and b/images/URSApplicationPending.png differ diff --git a/images/Unlinked.gif b/images/Unlinked.gif new file mode 100644 index 0000000..0320a50 Binary files /dev/null and b/images/Unlinked.gif differ diff --git a/images/Unlinked.png b/images/Unlinked.png new file mode 100644 index 0000000..516fd36 Binary files /dev/null and b/images/Unlinked.png differ diff --git a/images/UrsApplicationSearch.png b/images/UrsApplicationSearch.png new file mode 100644 index 0000000..8be5142 Binary files /dev/null and b/images/UrsApplicationSearch.png differ diff --git a/images/UrsApproveApplication.png b/images/UrsApproveApplication.png new file mode 100644 index 0000000..41cad54 Binary files /dev/null and b/images/UrsApproveApplication.png differ diff --git a/images/UrsApprovedApplicationList.png b/images/UrsApprovedApplicationList.png new file mode 100644 index 0000000..7f4e729 Binary files /dev/null and b/images/UrsApprovedApplicationList.png differ diff --git a/images/Users.txt b/images/Users.txt new file mode 100644 index 0000000..8074436 --- /dev/null +++ b/images/Users.txt @@ -0,0 +1,53 @@ +benno = benno +brent = brent +carlw = carlw +caron = caron +ccancellieri = ccancellieri +chambj2 = chambj2 +christian = christian +cjm = cjm +crawl = crawl +cvs = cvs +cvsadm = cvsadm +dan = Dan Holloway +dbarseghian = dbarseghian +dbyrne = dbyrne +dmh = dmh +edavis = edavis +ethan = ethan +george = george +haibo = haibo +hyoklee = hyoklee +jchamber = jchamber +jdcorral = jdcorral +jehamby = jehamby +jgarcia = jgarcia +jimg = James Gallagher +joew = joew +kwoklin = kwoklin +mao = mao +mjohnson = mjohnson +mlandsfeld = mlandsfeld +msheremet = msheremet +muqun = muqun +ndp = ndp +ngodfrey = ngodfrey +paul = paul +pete = pete +pwest = pwest +rduncan = rduncan +reza = reza +rich = rich +rmorris = rmorris +root = root +schneide = schneide +smoe = smoe +szednik = szednik +tom = tom +tomfool = tomfool +tomss = tomss +valerie = valerie +warmerda = warmerda +webmaster = webmaster +xin = xin +yuan = yuan diff --git a/images/VM_snapshots.png b/images/VM_snapshots.png new file mode 100644 index 0000000..82682c5 Binary files /dev/null and b/images/VM_snapshots.png differ diff --git a/images/WCS-NoContents.png b/images/WCS-NoContents.png new file mode 100644 index 0000000..a079774 Binary files /dev/null and b/images/WCS-NoContents.png differ diff --git a/images/WCS-UC1.0-ActivityDiagram.png b/images/WCS-UC1.0-ActivityDiagram.png new file mode 100644 index 0000000..fcd6ae7 Binary files /dev/null and b/images/WCS-UC1.0-ActivityDiagram.png differ diff --git a/images/WCS-UC1.1-ActivityDiagram.png b/images/WCS-UC1.1-ActivityDiagram.png new file mode 100644 index 0000000..c39285d Binary files /dev/null and b/images/WCS-UC1.1-ActivityDiagram.png differ diff --git a/images/WCS-Uc2.0.png b/images/WCS-Uc2.0.png new file mode 100644 index 0000000..0b5566d Binary files /dev/null and b/images/WCS-Uc2.0.png differ diff --git a/images/WCS-Uc3.0.png b/images/WCS-Uc3.0.png new file mode 100644 index 0000000..b1c8c6a Binary files /dev/null and b/images/WCS-Uc3.0.png differ diff --git a/images/WCS_packages_high_level.png b/images/WCS_packages_high_level.png new file mode 100644 index 0000000..c29f1cb Binary files /dev/null and b/images/WCS_packages_high_level.png differ diff --git a/images/Winter-ESIP-2015_Web-Services-Performance-Panel.pdf b/images/Winter-ESIP-2015_Web-Services-Performance-Panel.pdf new file mode 100644 index 0000000..c88f7c7 Binary files /dev/null and b/images/Winter-ESIP-2015_Web-Services-Performance-Panel.pdf differ diff --git a/images/Wish.gif b/images/Wish.gif new file mode 100644 index 0000000..3257be9 Binary files /dev/null and b/images/Wish.gif differ diff --git a/images/area-chart.png b/images/area-chart.png new file mode 100644 index 0000000..f174386 Binary files /dev/null and b/images/area-chart.png differ diff --git a/images/bar-chart.png b/images/bar-chart.png new file mode 100644 index 0000000..ce7adee Binary files /dev/null and b/images/bar-chart.png differ diff --git a/images/bubble-chart.png b/images/bubble-chart.png new file mode 100644 index 0000000..eeca116 Binary files /dev/null and b/images/bubble-chart.png differ diff --git a/images/ditaa-example.png b/images/ditaa-example.png new file mode 100644 index 0000000..c5a4a4d Binary files /dev/null and b/images/ditaa-example.png differ diff --git a/images/duke.png b/images/duke.png new file mode 100644 index 0000000..08ea986 Binary files /dev/null and b/images/duke.png differ diff --git a/images/filesystem-tree-viewer-new.png b/images/filesystem-tree-viewer-new.png new file mode 100644 index 0000000..6fb5ef6 Binary files /dev/null and b/images/filesystem-tree-viewer-new.png differ diff --git a/images/filesystem-tree-viewer.png b/images/filesystem-tree-viewer.png new file mode 100644 index 0000000..9067cfc Binary files /dev/null and b/images/filesystem-tree-viewer.png differ diff --git a/images/ijug.svg b/images/ijug.svg new file mode 100644 index 0000000..f3b22e8 --- /dev/null +++ b/images/ijug.svg @@ -0,0 +1,30 @@ + + + + +Created by potrace 1.12, written by Peter Selinger 2001-2015 + + + + + + + + + + diff --git a/images/istanbul-jug-logo-brown.svg b/images/istanbul-jug-logo-brown.svg new file mode 100644 index 0000000..3c0d5ca --- /dev/null +++ b/images/istanbul-jug-logo-brown.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/images/kodcu.png b/images/kodcu.png new file mode 100644 index 0000000..cb29ec1 Binary files /dev/null and b/images/kodcu.png differ diff --git a/images/mathml-formula.png b/images/mathml-formula.png new file mode 100644 index 0000000..9907061 Binary files /dev/null and b/images/mathml-formula.png differ diff --git a/images/mathml-formula.svg b/images/mathml-formula.svg new file mode 100644 index 0000000..bb26ea7 --- /dev/null +++ b/images/mathml-formula.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/images/scatter-chart.png b/images/scatter-chart.png new file mode 100644 index 0000000..817302f Binary files /dev/null and b/images/scatter-chart.png differ diff --git a/images/secim-2014-line.png b/images/secim-2014-line.png new file mode 100644 index 0000000..5f8554a Binary files /dev/null and b/images/secim-2014-line.png differ diff --git a/images/secim-2014-pie.png b/images/secim-2014-pie.png new file mode 100644 index 0000000..a014ff1 Binary files /dev/null and b/images/secim-2014-pie.png differ diff --git a/images/stacked-area-chart.png b/images/stacked-area-chart.png new file mode 100644 index 0000000..25f50e0 Binary files /dev/null and b/images/stacked-area-chart.png differ diff --git a/images/stacked-bar-chart.png b/images/stacked-bar-chart.png new file mode 100644 index 0000000..780ed73 Binary files /dev/null and b/images/stacked-bar-chart.png differ diff --git a/images/tex-formula.png b/images/tex-formula.png new file mode 100644 index 0000000..cad9771 Binary files /dev/null and b/images/tex-formula.png differ diff --git a/images/tutorials/matlab_images/plot_1_a_quick_look.png b/images/tutorials/matlab_images/plot_1_a_quick_look.png new file mode 100644 index 0000000..7c35444 Binary files /dev/null and b/images/tutorials/matlab_images/plot_1_a_quick_look.png differ diff --git a/images/tutorials/matlab_images/plot_2_A_Better_plot.png b/images/tutorials/matlab_images/plot_2_A_Better_plot.png new file mode 100644 index 0000000..84df3dd Binary files /dev/null and b/images/tutorials/matlab_images/plot_2_A_Better_plot.png differ diff --git a/images/uml-diagram.png b/images/uml-diagram.png new file mode 100644 index 0000000..337f894 Binary files /dev/null and b/images/uml-diagram.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..b468bd3 --- /dev/null +++ b/index.html @@ -0,0 +1,593 @@ + + + + + + + + +OPeNDAP AsciiDoc site + + + + + +
+
+

Quick Start

+
+
+

The + QuickStart Guide + (PDF) + provides a overview of our software and its use

+
+
+
+
+

User Guide

+
+
+

The +UserGuide +(PDF) +provides general information about the OPeNDAP software, the two +versions of the Data Access Protocol (DAP) and information about +access to remote data made available using DAP.

+
+
+
+
+

Data Access Tutorials

+
+
+

The Data Access Tutorials +show how to use various software clients to access data using the DAP web API.

+
+
+
+
+

Client Authentication

+
+
+

Many institutions now require that you (or more accurately, your software client) +must authenticate before access to data will be permitted. This is notably true +for all NASA assets: Authentication is required for data access.

+
+ +
+
+
+

Hyrax Installation and Configuration Guide

+
+
+

The +Hyrax Installation and Configuration Guide +(PDF) +provides information about the Hyrax Data Server. In this guide you +will find a description of the server’s featrues and all of its +configuration parameters. Also described in teh guide are other web +services that Hyrax provides, including WMS and WCS.

+
+
+
+
+

Libdap library documentation

+
+
+

The libdap library documentation provides reference information for our +implementation of DAP2 and DAP4.

+
+
+
+
+

BES data server framework

+
+
+

The Back End Server (BES) is the modular framework used to build the data +access and manipulation layer of the Hyrax data server.

+
+
+
+
+

Notes about this repository

+
+
+

Building CommonMark from AsciiDoc

+
+

Quick note about coverting to CommonMark Markdown from AsciiDoc.

+
+
+

To convert to CM from adoc, use 'asciidoctor' and 'pandoc' like this:

+
+
+
+
asciidoctor -b docbook5 -o quick_start_hack QuickStart.adoc
+pandoc -f docbook -t commonmark -o quick_start.cm quick_start_hack
+
+
+
+
+

About opendap.github.io/documentation/

+
+

The https://opendap.github.io/documentation/ site is populated with HTML and PDF +documents that are automatically built any time an AsciiDoc file in +the documentation repo is updated on the master branch.

+
+
+

This page comes from the github.com/OPeNDAP/documentation +repository, but it contains links to other pages from other OPeNDAP +github documentation repositories (e.g., hyrax\_guide). To add new +documention from a new repo, first arrange to publish its content via +gh-pages and github.io and then link those pages here. See the +github.com/OPeNDAP/hyrax_guide repo and the entry above for +Master_Hyrax_Guide.html/pdf for an example.

+
+
+
+

Automatic github.io updates

+ +
+

Another take on the same sort of process - updating gh-pages from a +.travis.yml file - that does not use asciidoctor: +Automatically +Update GitHub Pages with Travis.

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/tutorials/ClientAuthentication.html b/tutorials/ClientAuthentication.html new file mode 100644 index 0000000..efdf60a --- /dev/null +++ b/tutorials/ClientAuthentication.html @@ -0,0 +1,2183 @@ + + + + + + + + +Authentication For DAP Clients + + + + + + + + + + + + + + + + + +
+
+

1. Overview

+
+
+

This document describes how to configure DAP clients to access data servers +that require users to be authenticated. The document is divided into four +sections. This Overview provides a brief introduction to the topic and some +background on commonly used clients. The remaining sections provide information +on three different authentication systems in use today: NASA’s Earthdata Login, +LDAP, and Shibboleth.

+
+
+

Many users access DAP servers using a browser as their primary software +interface. However, there is also a growing group of users that utilize either:

+
+
+
    +
  • +

    A "smart" tool. Where "smart" means that the tool understands how to interact +with a DAP service and construct DAP queries for data and use that in higher +level client side activities like GUI based graphs, image display, selection, +navigation, etc.

    +
  • +
  • +

    A command line tool such as "wget" or "curl" that can be used to extract data +from a DAP service, but the URL construction is left to the user or other software.

    +
  • +
+
+
+

In both these cases we want these client software applications to be able to +manage authentication. In the case of command line style tools, being able +to authenticate without a user interaction is important for automated work +flows.

+
+
+

1.1. Some DAP Data Access Clients

+
+

The collection of software clients discussed here have some remarkable +similarities in the way that they handle the client end of +authentication. The clients that present a GUI to the user (Panoply, IDV, and +ToolsUI) will open a dialog box and prompt the user for credentials when the +server requires user authentication. The rest of these clients listed here use +a file called .netrc to store credentials. The .netrc file is a simple text +file and is described in detail in Our friend, the .netrc file.

+
+
+

Some DAP client software applications (those that utilize one of UNIDATA’s +NetCDF libraries to provide remote data access) will use the .dodsrc file to +store important authentication related information. The .dodsrc file is a simple +text file and is typically located in the users home directory. See +ncdump, nccopy, Matlab, and other applications that use NetCDF-C +for more information about the .dodsrc file.

+
+
+

We tested each of the authentication steps on the folowing applications:

+
+
+
    +
  • +

    cURL (a.k.a. lib_curl or curl) +The cURL library provides the HTTP functionality for a surprisingly large part +the world wide web. The cURL library also has a command line application, curl, +that can be used to issue HTTP requests and collect the responses. It can be a +very powerful data access tool when used manually or in the scope of a larger +shell script.

    +
    +
      +
    • +

      Credentials: ~/.netrc

      +
    • +
    • +

      Uses ~/.dodsrc: no

      +
    • +
    +
    +
  • +
  • +

    ncdump, nccopy, netCDF4 +Python, Matlab, and other applications using NetCDF-C +The ncdump and nccopy command line applications are part of +the NetCDF-C +library and can be utilized to access DAP resources. This means we can use +ncdump and nccopy as an easy sanity check for authentication issues for +command line applications that uses the netCDF-C library. Because the netCDF-C +library is the software component that is performing the authentication, the +configuration steps outlined here should directly translate to any application +that uses netCDF-C. These steps were tested against netCDF-C version 4.9.0. +If you have a different version you may wish to visit Unidata for the related +documentation.

    +
    +
      +
    • +

      Credentials: ~/.netrc

      +
    • +
    • +

      Uses ~/.dodsrc: yes

      +
    • +
    +
    +
  • +
  • +

    Integrated Data Viewer (IDV) +The Integrated Data Viewer is GUI +driven data client that is based around the +CDM/NetCDF data model and utilizes that NetCDF-Java (and thus the Java DAP +implementation) to access remote DAP datasets. Because it has a GUI it can +retrieve (and cache for later) users credentials directly from the user. +Since IDV utilizes the Java-NetCDF library to access DAP resources then in +theory if it works for IDV then it should work for all the other clients that +use the Java-NetCDF library.

    +
    +
      +
    • +

      Credentials: GUI

      +
    • +
    • +

      Uses ~/.dodsrc: no

      +
    • +
    +
    +
  • +
  • +

    ToolsUI + +The ToolsUI application +is a simple is GUI driven data client that is based +around the CDM/NetCDF data model and utilizes that NetCDF-Java (and thus the +Java DAP implementation) to access remote DAP datasets. Because it has a GUI +it can retrieve (and cache for later) users credentials directly from the user.

    +
    +
      +
    • +

      Credentials: GUI

      +
    • +
    • +

      Uses ~/.dodsrc: no

      +
    • +
    +
    +
  • +
  • +

    Panoply +The Panoply application is a +sophisticated GUI driven data client that is based +around the CDM/NetCDF data model and utilizes that NetCDF-Java (and thus the +Java DAP implementation) to access remote DAP datasets. Because it has a GUI it +can retrieve (and cache for later) users credentials directly from the user.

    +
    +
      +
    • +

      Credentials: GUI

      +
    • +
    • +

      Uses ~/.dodsrc: no

      +
    • +
    +
    +
  • +
  • +

    PyDAP +The PyDAP python software package provides one +interface for python programs to read from OpenDAP servers (another is the +netCDF4 Python module, which uses the netCDF-C library to actually access data, +including data from OpenDAP servers).

    +
    +
      +
    • +

      Credentials: ~/.netrc

      +
    • +
    • +

      Uses ~/.dodsrc: no

      +
    • +
    +
    +
  • +
+
+
+
+

1.2. Our friend, the .netrc file

+
+

The ~/.netrc file (a file named .netrc located in your home directory, +aka ~) is the way in which many of the data access clients discussed +here expect (i.e., are coded) to access credentials to be used in an +authentication exchange.

+
+
+

Because the .netrc file name starts with a dot, it is a hidden file and +will not be visible in a standard directory listing. You can use the ls -a +command to see all files in a directory, including hidden files.

+
+
+

Add login credentials for various servers to the ~/.netrc file, associating each +set of credentials with the appropriate login endpoint. Here is an Earth Data +Login example:

+
+
+
+
machine urs.earthdata.nasa.gov
+	login your_edl_uid
+	password your_edl_password
+
+
+
+

And you can add more credentials and machines (aka single sign-on endpoints) as needed:

+
+
+
+
machine urs.earthdata.nasa.gov
+	login your_edl_uid
+	password your_edl_password
+
+machine sso.noaa.gov
+	login your_noaa_uid
+	password your_noaa_password
+
+machine some.ldap.service.edu
+	login your_ldap_uid
+	password your_ldap_password
+
+
+
+ + + + + +
+
Note
+
+It is crucial that the access permissions be set to allow reading and +writing only by the account owner. This can be done using the command: +chmod 600 ~/.netrc +If group or other are allowed any access to the ~/.netrc file the data +access client software will ignore (possibly silently) the ~/.netrc +file and authentication will fail. +
+
+
+
+
+
+

2. Earthdata Login (OAuth2)

+
+
+

Earthdata Login is a NASA implementation of an OAuth2 Single Sign-On service. +In order to access NASA held data you will need to:

+
+
+
    +
  1. +

    Obtain (for free) your own set of +Earthdata Login credentials.

    +
  2. +
  3. +

    Approve the DAP server application that is serving the data you want, as +described in the following section.

    +
  4. +
  5. +

    Use this guide to configure your DAP client of choice (curl, browser, +etc.) to utilize these credentials.

    +
  6. +
+
+
+

2.1. Setting Up Earthdata Login

+
+

2.1.1. Acquire Earthdata Login Credentials

+
+

Registering with Earthdata Login (EDL) and getting a +user account is free. Point you browser at the +Earthdata Login New User +page and do the stuff that needs the doing.

+
+
+
+

2.1.2. Approving The Hyrax OPeNDAP Service Application

+
+

Regardless of which software client you decide to employ, before you can access +any new Earthdata Login authenticated server you must first add that sever to +the list of Approved Applications in your Earthdata Login profile.

+
+
+

To do this you will need the Earthdata Login Application name (aka UID) under +which the DAP server is registered with Earthdata Login and your Earthdata +Login credentials.

+
+
+
    +
  • +

    With your browser, navigate to your +Earthdata Login profile page.

    +
  • +
  • +

    Click the Applications tab and select Authorized Applications from the +pull down menu.This will take you to the Approved Applications page.

    +
  • +
+
+
+
+Earthdata Login Approve Applications Page +
+
+
+

On the Approved Applications page:

+
+
+
    +
  • +

    At the bottom of the page click the Approve More Applications button. +This will display the Approve Applications page.

    +
  • +
+
+
+
+Earthdata Login Approve Applications Page +
+
+
+

In the search bar at the top of the page enter the name of the Hyrax OPeNDAP +service application, Hyrax in the cloud and then click the Search button, +this will bring you to the Earthdata Login Application Approval page:

+
+
+
+Earthdata Login Application Approval Page +
+
+
+
    +
  • +

    Click the Authorize button associated with the Hyrax in the cloud_ service. +You will be returned to the My Applications page where you should now see your +new application on the list of Approved Applications.

    +
  • +
+
+
+ + + + + +
+
Note
+
+The application named Hyrax in the cloud used in this example is the +only OPeNDAP service application running in the NASA cloud. There are many other +applications deployed in NASA and to use any of them with your EDL user account +you will have to authorize each application service in a similar manner +to Hyrax in the cloud +
+
+
+
+
+

2.2. cURL (a.k.a. lib_curl or curl)

+
+

You can use command line curl to retrieve EDL authenticated resources +using the following technique.

+
+
+

Create a ~/.netrc file as described in the .netrc section above

+
+
+

Edit the ~/.netrc file and associated your EDL credentials with the EDL +service endpoint utilized by your target DAP server:

+
+
+
+
machine urs.earthdata.nasa.gov
+	login your_edl_uid
+	password your_edl_password
+
+
+
+

If the configuration is correct you should now be able to retrieve a DDS object +in from the associated DAP service with the following curl command:

+
+
+
+
#!/bin/bash
+touch cookie_file
+curl -n -c cookie_file -b cookie_file -L --url https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds
+
+
+
+
+
What is happening here?
+
+

In this request cURL is both authenticating and +maintaining a session with the remote server (this is accomplished by telling +cURL to load and save cookies from the same file, cookie_file )

+
+
-n
+
+

This tells cURL to authenticate using the ~/.netrc file you +created/updated.

+
+
-c cookie_file
+
+

This tells cURL to stash cookies in the file cookie_file

+
+
-b cookie_file
+
+

This tells cURL to read cookies from the file cookie_file

+
+
-L
+
+

This option (aka --location) tells cURL to follow redirects, which is a +must for any Single Sign On (SSO) authentication flow, such as OAuth2.

+
+
+
+
+ + + + + +
+
Note
+
+Do not use the --location-trusted option. It will cause +cURL to spread user credentials to servers other than to which they were +associated. +
+
+
+
+
--url https://opendap.earthdata.nasa.gov/ …​
+
+

The desired URL, protected by +the Earthdata Login authentication flow.

+
+
+
+
+

In order to retrieve multiple URLs without re-authenticating you can use +multiple instances of the --url parameter:

+
+
+
+
#!/bin/bash
+curl -k -n -c cookie_file -b cookie_file -L \
+    --url https://opendap.earthdata.nasa.gov/ \
+    --url https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds \
+    --url https://opendap.earthdata.nasa.gov/hyrax/data/nc/coads_climatology.nc.dds
+
+
+
+

Or, since cURL is actually pretty smart about using cookies and such you can +also make multiple curl requests with the same cookies, and it won’t have to +reauthenticate with EDL once it’s authenticated the first time:

+
+
+
+
#!/bin/bash
+curl -k -n -c cookie_file -b cookie_file -L --url https://opendap.earthdata.nasa.gov/hyrax/
+curl -k -n -c cookie_file -b cookie_file -L --url https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds
+curl -k -n -c cookie_file -b cookie_file -L --url https://opendap.earthdata.nasa.gov/hyrax/data/nc/coads_climatology.nc.dds
+
+
+
+
+

2.3. wget

+
+

The wget documentation indicates that wget will automatically locate and +utilize the .netrc file that we created for curl.

+
+
+
+
Summary
+
+
+
    +
  • +

    Create a ~/.netrc file as described in the .netrc section above

    +
  • +
  • +

    Edit the ~/.netrc file and associate your EDL credentials with the +EDL service endpoint.

    +
  • +
+
+
+
+
+
+

And happily it appears to work, as long as the ~/.netrc file is in place.

+
+
+

Consider this wget command:

+
+
+
+
#!/bin/bash
+wget  --load-cookies cookie_file --save-cookies cookie_file --keep-session-cookie https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds
+
+
+
+
+
What is happening here?
+
+

In this request wget is both authenticating and +maintaining a session with the remote server (the latter is accomplished by telling +wget to load and save cookies from the same file, cookie_file)

+
+
--load-cookies cookie_file
+
+

Load cookies from the file "cookie_file"

+
+
--save-cookies cookie_file
+
+

Save cookies to the file "cookie_file"

+
+
--keep-session-cookie
+
+

Save session cookies.

+
+
https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds
+
+

The URL to retrieve.

+
+
+
+
+

Here’s the request:

+
+
+
+
#!/bin/bash
+touch cookie_file # Make sure the cookie file exists
+wget --load-cookies cookie_file --save-cookies cookie_file --keep-session-cookie  https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds
+
+
+
+

Here’s the output:

+
+
+
+
--2014-11-14 11:22:18--  https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds
+Connecting to opendap.earthdata.nasa.gov:443... connected.
+WARNING: cannot verify opendap.earthdata.nasa.gov's certificate, issued by `/C=US/ST=RI/L=Narragansett/O=OPeNDAP Inc./OU=Engineering/CN=opendap.earthdata.nasa.gov/emailAddress=support@opendap.org':
+  Self-signed certificate encountered.
+HTTP request sent, awaiting response... 302 Found
+Location: https://urs.earthdata.nasa.gov/oauth/authorize?app_type=401&client_id=04xHKVaNdYNzCBG6KB7-Ig&response_type=code&redirect_uri=https%3A%2F%2Fopendap.earthdata.nasa.gov%2Fopendap%2Flogin&state=aHR0cHM6Ly81NC4xNzIuOTcuNDcvb3BlbmRhcC9kYXRhL25jL2Zub2MxLm5jLmRkcw [following]
+--2014-11-14 11:22:19--  https://urs.earthdata.nasa.gov/oauth/authorize?app_type=401&client_id=04xHKVaNdYNzCBG6KB7-Ig&response_type=code&redirect_uri=https%3A%2F%2Fopendap.earthdata.nasa.gov%2Fopendap%2Flogin&state=aHR0cHM6Ly81NC4xNzIuOTcuNDcvb3BlbmRhcC9kYXRhL25jL2Zub2MxLm5jLmRkcw
+Resolving urs.earthdata.nasa.gov... 198.118.243.34, 2001:4d0:241a:4089::91
+Connecting to urs.earthdata.nasa.gov|198.118.243.34|:443... connected.
+WARNING: certificate common name `earthdata.nasa.gov' doesn't match requested host name `urs.earthdata.nasa.gov'.
+HTTP request sent, awaiting response... 401 Unauthorized
+Connecting to urs.earthdata.nasa.gov|198.118.243.34|:443... connected.
+WARNING: certificate common name `earthdata.nasa.gov' doesn't match requested host name `urs.earthdata.nasa.gov'.
+HTTP request sent, awaiting response... 302 Found
+Location: https://opendap.earthdata.nasa.gov/hyrax/login?code=a590cfc189783e29a7b8ab3ce1e0357618cbab3f590e7268a26e7ad1f7cf899d&state=aHR0cHM6Ly81NC4xNzIuOTcuNDcvb3BlbmRhcC9kYXRhL25jL2Zub2MxLm5jLmRkcw [following]
+--2014-11-14 11:22:20--  https://opendap.earthdata.nasa.gov/hyrax/login?code=a590cfc189783e29a7b8ab3ce1e0357618cbab3f590e7268a26e7ad1f7cf899d&state=aHR0cHM6Ly81NC4xNzIuOTcuNDcvb3BlbmRhcC9kYXRhL25jL2Zub2MxLm5jLmRkcw
+Connecting to opendap.earthdata.nasa.gov:443... connected.
+WARNING: cannot verify opendap.earthdata.nasa.gov's certificate, issued by `/C=US/ST=RI/L=Narragansett/O=OPeNDAP Inc./OU=Engineering/CN=opendap.earthdata.nasa.gov/emailAddress=support@opendap.org':
+  Self-signed certificate encountered.
+HTTP request sent, awaiting response... 302 Found
+Location: https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds [following]
+--2014-11-14 11:22:21--  https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds
+Connecting to opendap.earthdata.nasa.gov:443... connected.
+WARNING: cannot verify opendap.earthdata.nasa.gov's certificate, issued by `/C=US/ST=RI/L=Narragansett/O=OPeNDAP Inc./OU=Engineering/CN=opendap.earthdata.nasa.gov/emailAddress=support@opendap.org':
+  Self-signed certificate encountered.
+HTTP request sent, awaiting response... 200 OK
+Length: unspecified [text/plain]
+Saving to: `fnoc1.nc.dds'
+
+    [ <=> ] 197         --.-K/s   in 0s
+
+2014-11-14 11:22:22 (7.23 MB/s) - `fnoc1.nc.dds' saved [197]
+
+[spooky:olfs/testsuite/urs] ndp% more fnoc1.nc.dds
+Dataset {
+    Int16 u[time_a = 16][lat = 17][lon = 21];
+    Int16 v[time_a = 16][lat = 17][lon = 21];
+    Float32 lat[lat = 17];
+    Float32 lon[lon = 21];
+    Float32 time[time = 16];
+} fnoc1.nc;
+
+
+
+

It appears that wget correctly followed the first redirect to +urs.earthdata.nasa.gov, where the EDL server responded with +"401 Unauthorized" (thanks to the app_type=401 query parameter in the +redirect URL provided by the origin server). After getting the 401 wget +resubmits the request with the authentication credentials and the EDL server +accepts them and redirects wget back to the origin server to complete the +request.

+
+
+
+

2.4. ncdump, nccopy, Matlab, and other applications that use NetCDF-C

+
+

Applications built with one of UNIDATA’s NetCDF libraries may require, in +addition to a ~/.netrc file, a .dodsrc file to be present in the users home +directory in order for the application to successfully authenticate during +remote data access activities. +You can learn more about +the .dodsrc file at UNIDATA’s NetCDF and DAP2 page.

+
+
+
+
Summary
+
+
+
    +
  • +

    Create a ~/.netrc file as described in the .netrc section above

    +
  • +
  • +

    Edit the ~/.netrc file and associate your EDL credentials with the +EDL service endpoint.

    +
  • +
  • +

    Next create (as needed) and then edit the file ~/.dodsrc so that it tells DAP +clients to use the .netrc file for password information:

    +
  • +
+
+
+
+
+
+
+
HTTP.COOKIEJAR=/home/your_home_dir/cookie_file
+HTTP.NETRC=/home/your_home_dir/.netrc
+
+
+
+

Here is a typical .dodsrc file.

+
+
+
+
# OPeNDAP client configuration file. See the OPeNDAP
+# users guide for information.
+USE_CACHE=0
+# Cache and object size are given in megabytes (20 ==> 20Mb).
+MAX_CACHE_SIZE=20
+MAX_CACHED_OBJ=5
+IGNORE_EXPIRES=0
+CACHE_ROOT=/home/your_home_dir/.dods_cache/
+DEFAULT_EXPIRES=1
+ALWAYS_VALIDATE=1
+# Request servers compress responses if possible?
+# 1 (yes) or 0 (false).
+DEFLATE=1
+# Proxy configuration:
+# PROXY_SERVER=<protocol>,<[username:password@]host[:port]>
+# NO_PROXY_FOR=<protocol>,<host|domain>
+# AIS_DATABASE=<file or="" url="">
+
+# Earth Data Login and LDAP login information
+HTTP.COOKIEJAR=/home/your_home_dir/cookie_file
+HTTP.NETRC=/home/your_home_dir/.netrc
+
+
+
+
+
For other NeCDF-C built applications
+
+

+Check the version of the netCDF C library that the application uses; once they +have updated to 4.3.3.1 or later, authentication configuration should be the +same as this ncdump example. That is, both EDL and LDAP-backed +HTTP/S-Basic authentication should work by reading credentials from the .netrc +file given that the .dodsrc file is set to point to them. +

+
+
+
+
+ + + + + +
+
Note
+
+This was tested with the ncdump and nccopy command line applications +that come bundled with the netcdf-c library. This content was developed using +NetCDF-4.9.0. Previous versions may not work. +
+
+ +
+
+

2.5. Integrated Data Viewer (IDV)

+
+

We downloaded the +latest version of IDV (6.1u2 on 03/Apr/2023) and installed it on our local +system.

+
+
+

For EDL testing we utilized our AWS test service, configured to require EDL +authentication for all access of Hyrax.

+
+
+

In IDV we attempted to choose a new dataset by starting with the "Data" menu: +Data > Choose Data > From A Web Server

+
+
+

In the resulting pane we entered the AWS test service URL for our friend +coads_climatology.nc:

+
+ +
+

When we committed the edit (aka hit Enter) IDV popped up a dialog box that +indicated that the urs.earthdata.nasa.gov server wanted our credentials:

+
+
+
+IDV EDL Authentication Dialog +
+
+
+

We entered our EDL Name and Password, clicked the save password check box, +and clicked the OK button.

+
+
+

At this point IDV returned a Null Pointer Exception:

+
+
+
+
java.lang.NullPointerException
+  at ucar.unidata.data.DataManager.createDataSource(DataManager.java:1623)
+  at ucar.unidata.idv.IntegratedDataViewer.createDataSource(IntegratedDataViewer.java:1978)
+  at ucar.unidata.idv.IntegratedDataViewer.makeDataSource(IntegratedDataViewer.java:1895)
+  at ucar.unidata.idv.IntegratedDataViewer.makeDataSource(IntegratedDataViewer.java:1829)
+  at ucar.unidata.idv.IntegratedDataViewer.handleAction(IntegratedDataViewer.java:1671)
+  at ucar.unidata.idv.DefaultIdv.handleAction(DefaultIdv.java:116)
+  at ucar.unidata.idv.IntegratedDataViewer.handleAction(IntegratedDataViewer.java:1603)
+  at ucar.unidata.idv.chooser.UrlChooser.loadURLInner(UrlChooser.java:267)
+  at ucar.unidata.idv.chooser.UrlChooser.loadURL(UrlChooser.java:239)
+  at ucar.unidata.idv.chooser.UrlChooser.doLoadInThread(UrlChooser.java:286)
+  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
+  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
+  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
+  at java.lang.reflect.Method.invoke(Method.java:498)
+  at ucar.unidata.util.Misc$2.run(Misc.java:1215)
+  at ucar.unidata.util.Misc$3.run(Misc.java:1243)
+
+
+
+
+

2.6. ToolsUI

+
+

We downloaded the latest version of ToolsUI +(5.5.3 on 03/Apr/2023) and installed it on our local system. We launched ToolsUI using +the command line:

+
+
+
+
java -Xmx1g -jar toolsUI-5.5.3.jar
+
+
+
+

Summary: Authentication FAILED

+
+
+

For testing, we utilized our the NGAP Hyrax service, which requires EDL +authentication for all data access.

+
+
+

In ToolsUI we selected the Viewer tab, and entered the URL for our friend +fnoc1.nc:

+
+ +
+

When we committed the edit (aka hit Enter) ToolsUI popped up a dialog box that +indicated that the urs.earthdata.nasa.gov server wanted our credentials.

+
+
+
+ToolsUI EDL Authentication Dialog +
+
+
+

We entered our EDL credentials and clicked the OK button. After a few seconds

+
+
+

ToolsUI returned an error:

+
+
+
+
java.io.IOException: https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc is not a valid URL, return status=405
+
+
+
+
+ToolsUI_405_Error.png +
+
+
+
+

2.7. Panoply

+
+

We downloaded the latest version of Panoply +(5.2.5 on 04/Apr/2023) and installed it on our local system. We launched Panoply +(clicking its icon in our Applications folder)

+
+
+

Summary: Authentication FAILED

+
+
+

For testing, we utilized our AWS test service, configured to require EDL +authentication for all access of Hyrax.

+
+
+

From the File menu, we selected "Open Remote Dataset…​" and in the pop dialog +we entered the URL for our friend coads_climatology.nc:

+
+ +
+

When we committed the edit (aka hit Enter) Panoply popped up a dialog box that +indicated that the urs.earthdata.nasa.gov server wanted our credentials.

+
+
+
+Panoply EDL Authentication Dialog +
+
+
+

We entered them, clicked the save password check box, and clicked the OK +button.

+
+
+

Panoply returned a NUll Pointer exception

+
+
+
+Panoply NPE +
+
+
+
+

2.8. PyDAP

+
+

PyDAP includes an extension mechanism so that it can interact with +different kinds of authentication systems. This system is very flexible: we +were able to use it to add support for both LDAP and EDL using HTTP/S Basic +authentication.

+
+
+
+
Summary
+
+
+
    +
  • +

    Create a ~/.netrc file as described in the .netrc section above

    +
  • +
  • +

    Edit the ~/.netrc file and associate your EDL credentials with the +EDL service endpoint.

    +
  • +
+
+
+
+
+
+

Once the .netrc file is configured, start python, and then acquire data from +remote DAP services. +Here’s a python script that will open a PyDAP virtual connection to an +authenticated server if your ~/.netrc is in order for EDL:

+
+
+
+
# PyDAP uses the request() function and automagically discovers the
+# users credentials in ~/.netrc
+
+import pydap
+
+dataset_url="https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc"
+
+pydap_dataset = pydap.client.open_url(dataset_url, protocol="dap4")
+
+
+
+
+
+
+

3. LDAP

+
+
+

The Lightweight Directory Access Protocol (LDAP) can do many things. One of +those things is to Single Sign On (SSO) authentication service.

+
+
+

3.1. cURL (a.k.a. lib_curl or curl)

+
+

We were able to use command line curl to retrieve LDAP authenticated resources +using the following technique.

+
+
+
+
Summary
+
+
+
    +
  • +

    Create a ~/.netrc file as described in the .netrc section above

    +
  • +
  • +

    Edit the ~/.netrc file and associate your credentials with the LDAP service +endpoint.

    +
  • +
+
+
+
+
+
+

We could then access the top level directory of an LDAP authenticated +Hyrax server with the following curl command:

+
+
+
+
#!/bin/bash
+curl -k -n -c cookie_file -b cookie_file  --url https://some.ldap.tester/opendap
+
+
+
+
+
What is happening here?
+
+

In this request cURL is both authenticating and +maintaining a session with the remote server (this is accomplished by telling +cURL to load and save cookies from the same file, cookie_file )

+
+
-k
+
+

This tells curl to accept self-signed certificates. This is ok for +working with trusted (as in your own) "test" services but should be removed +for working with production systems. Because: Security, Chain-Of-Trust, etc.

+
+
-n
+
+

This tells curl to use that ~/.netrc file we created.

+
+
-c cookie_file
+
+

This tells curl to stash cookies in the file cookie_file

+
+
-b cookie_file
+
+

This tells curl to read cookies from the file cookie_file

+
+
--url https://130.56.244.153/opendap
+
+

The desired URL, protected LDAP +authentication.

+
+
+
+
+ + + + + +
+
Note
+
+That the credentials are sent with every request so secure transport is a +must if user accounts are to be protected. +
+
+
+
+

3.2. ncdump, nccopy, Matlab, Ferret, and other applications that are built on NetCDF-C

+
+

To configure nccopy and ncdump (and thus just about every client application +that uses netCDF C) for LDAP-back HTTP/S-Basic authentication, follow the same +exact procedure as outline above for EDL, except that in the .netrc file, use +the OpenDAP server’s machine name or IP number in place of the EDL +authentication site. Here’s a summary, with an example:

+
+
+
+
Summary
+
+
+
    +
  • +

    Create a ~/.netrc file as described in the .netrc section above

    +
  • +
  • +

    Edit the ~/.netrc file and associate your credentials with the LDAP service +endpoint.

    +
  • +
  • +

    Edit (create as needed) the ~/.dodsrc file so that it tells DAP clients to +use the ~/.netrc file for password information.

    +
  • +
+
+
+
+
+
+
+
HTTP.COOKIEJAR=/home/your_home_dir/cookie_file
+HTTP.NETRC=/home/your_home_dir/.netrc
+
+
+
+
+

3.3. Integrated Data Viewer (IDV)

+
+

For testing, we utilized an ANU/NCI puppet instance configured to require LDAP +authentication for all access of Hyrax.

+
+
+

In IDV we attempted to choose a new dataset by starting with the "Data" menu: +Data > Choose Data > From A Web Server

+
+
+

In the resulting pane we entered the LDAP test service URL for our friend +coads_climatology.nc:

+
+ +
+

When we committed the edit (aka hit Enter) IDV popped up a dialog box that +indicated that the 130.56.244.153 server wanted our credentials:

+
+
+
+IDV LDAP Authentication Dialog +
+
+
+

WE entered them, clicked the save password check box, and clicked the OK +button. IDV was then able to access the requested resource.

+
+
+
+

3.4. ToolsUI

+
+

Summary: Authentication Successful

+
+
+

For testing, WE utilized an ANU/NCI puppet instance configured to require LDAP +authentication for all access of Hyrax.

+
+
+

In ToolsUI selected the Viewer tab, and entered the LDAP test service URL for +our friend coads_climatology.nc:

+
+ +
+

When we committed the edit (aka hit Enter) ToolsUI popped up a dialog box that +indicated that the urs.earthdata.nasa.gov server wanted our credentials.

+
+
+
+ToolsUI LDAP Authentication Dialog +
+
+
+

We entered them and clicked the OK button. ToolsUI was then able to access +the requested resource.

+
+
+
+

3.5. Panoply

+
+

Summary: Authentication Successful

+
+
+

For testing, we utilized an ANU/NCI puppet instance configured to require LDAP +authentication for all access of Hyrax.

+
+
+

From the File menu, we selected "Open Remote Dataset…​" and in the pop dialog +we entered the URL for our friend coads_climatology.nc:

+
+ +
+

When we committed the edit (aka hit Enter) Panoply popped up a dialog box that +indicated that the urs.earthdata.nasa.gov server wanted our credentials.

+
+
+
+Panoply LDAP Authentication Dialog +
+
+
+

We entered them, clicked the save password check box, and clicked the OK +button. Panoply was then able to access the requested resource.

+
+
+
+

3.6. PyDAP

+
+

PyDAP includes an extension mechanism so that it can interact with +different kinds of authentication systems. This system is very flexible: we +were able to use it to add support for both LDAP and EDL using HTTP/S Basic +authentication. The same scheme could be used to add support for Shibboleth, +although it would take additional development work (described in general below).

+
+
+
+
Summary
+
+
+
    +
  • +

    Create a ~/.netrc file as described in the .netrc section above

    +
  • +
  • +

    Edit the ~/.netrc file and associate your EDL credentials with the +EDL service endpoint.

    +
  • +
+
+
+
+
+
+

Once the .netrc file is configured, start python, and then acquire data from +remote DAP services. +Here’s a python script that will open a PyDAP virtual connection to an +authenticated server if your ~/.netrc is in order for EDL:

+
+
+
+
# PyDAP uses the request() function and automagically discovers the
+# users credentials in ~/.netrc
+
+import pydap
+
+dataset_url="https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc"
+
+pydap_dataset = pydap.client.open_url(dataset_url, protocol="dap4")
+
+
+
+
+
+
+

4. Shibboleth

+
+
+

Shibboleth is a collection of open source tools that provide identity management +(aka authentication services) has fairly broad adoption globally. It is in use +at a number of UK and Australian institutions.

+
+
+

4.1. cURL (a.k.a. lib_curl or curl)

+
+

We were not able to use command line curl to retrieve Shibboleth authentication +resources using the .netrc technique described in the LDAP and EDL sections.

+
+
+

Analysis of the HTTP conversation between the idp.testshib.org server and +curl shows that curl correctly follows the series of 302 redirects issued to +it, first by the Apache service bound to the Hyrax server and then from the +idp.testshib.org server. In every request to the idp.testshib.org server the +curl client correctly offers the credentials via the HTTP Authorization +header:

+
+
+
+
0000: GET /idp/Authn/UserPassword HTTP/1.1
+0026: Authorization: Basic bXlzZWxmOm15c2VsZg==
+0051: User-Agent: curl/7.21.4 (universal-apple-darwin11.0) libcurl/7.2
+0091: 1.4 OpenSSL/0.9.8z zlib/1.2.5
+00b0: Host: idp.testshib.org
+00c8: Accept: */*
+00d5: Cookie: _idp_authn_lc_key=efbb6e2a9d893b47fb802ed575329ce69c101b
+0115: 3ea8beb6744fab64fc406c358f; JSESSIONID=5A1731EDE00613B13803968CF
+0155: AF06284
+015e:
+
+
+
+

But the Shibboleth system doesn’t respond to them. This may be a simple +configuration issue on the Shibboleth end, or it could be that the Shibboleth +protocol specifically forbids accepting credentials via HTTP Authorization +headers.

+
+
+
+

4.2. ncdump and nccopy

+
+

At the time of this writing the ncdump application and the NetCDF library do +not support authentication using the Shibboleth ECP profile.

+
+
+
+

4.3. Integrated Data Viewer (IDV)

+
+

Summary: Failed To Authenticate

+
+
+

For Shibboleth testing we utilized an AWS VM, configured to require Shibboleth +authentication for all access of Hyrax.

+
+
+

In IDV we attempted to choose a new dataset by starting with the "Data" menu: +Data > Choose Data > From A Web Server

+
+
+

In the resulting pane we entered the AWS VM service URL for our friend +coads_climatology.nc:

+
+ +
+

When we committed the edit (aka hit Enter) IDV popped up a dialog box that +indicated that there was an error loading the data:

+
+
+
+IDV Shibboleth Authentication Failure Dialog +
+
+
+
+

4.4. ToolsUI

+
+

Summary: Failed To Authenticate

+
+
+

For Shibboleth testing we utilized an AWS VM, configured to require Shibboleth +authentication for all access of Hyrax.

+
+
+

In ToolsUI selected the Viewer tab, and entered the AWS test service URL +for our friend coads_climatology.nc:

+
+ +
+

When we committed the edit (aka hit Enter) ToolsUI popped up a dialog box that +indicated that there was an error loading the data:

+
+
+
+ToolsUI Shibboleth Authentication Failure +
+
+
+
+

4.5. Panoply

+
+

Summary: Failed To Authenticate

+
+
+

For Shibboleth testing we utilized an AWS VM, configured to require Shibboleth +authentication for all access of Hyrax.

+
+
+

From the File menu, we selected "Open Remote Dataset…​" and in the pop dialog +we entered the URL for our friend coads_climatology.nc:

+
+ +
+

When we committed the edit (aka hit Enter) Panoply popped up a dialog box that +indicated that there was an error loading the data:

+
+
+
+Panoply Shibboleth Authentication Failure +
+
+
+
+

4.6. Matlab, Ferret, Other applications that use NetCDF C

+
+

This is certain to not work until the netCDF C library is modified to explicitly +support it.

+
+
+
+

4.7. PyDAP

+
+

This will require a new patch function, similar to install_basic_client() be +written. It will be a bit more complex because of the increased complexity of +Shibboleth, but the operation for end-users will likely be the same.

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/tutorials/ClientAuthentication.pdf b/tutorials/ClientAuthentication.pdf new file mode 100644 index 0000000..b7cc4b7 Binary files /dev/null and b/tutorials/ClientAuthentication.pdf differ diff --git a/tutorials/ClientAuthenticationWithEDLTokens.html b/tutorials/ClientAuthenticationWithEDLTokens.html new file mode 100644 index 0000000..e3beff4 --- /dev/null +++ b/tutorials/ClientAuthenticationWithEDLTokens.html @@ -0,0 +1,1212 @@ + + + + + + + + +How to use EDL authorization tokens for data access. + + + + + + + + + + + + + + + + + +
+
+

1. Overview

+
+
+

Using EDL tokens for authentication is usually straight forward when the software +making the requests has an API/UI that allows the injection of an HTTP request +header. All the data access clients that we have been tested with EDL +authentication have been working because the EDL authentication endpoints support +the most fundamental type of web authentication, HTTP BASIC.

+
+
+

The introduction of EDL tokens means a move away from HTTP BASIC authentication +and into something new. Some very flexible clients like cURL and wget can +easily adapt to the change in authentication procedure by simply taking an EDL +token and submitting it as part of an Authorization request header.

+
+
+

Other data access client software have no API or UI through which an EDL token +might be introduced and used in an authorization header.

+
+
+ + + + + +
+
Note
+
+Recent changes in the way that the Hyrax DAP service utilizes EDL tokens +means that clients are no longer required to follow redirects or maintain +session state by managing cookies. However, maintaining session state +(managing cookies) will produce better request performance when your client is +making multiple requests of the service. If a session is not maintained by the +requesting client the service will validate the EDL token each time a request is +made. This may add 500ms - 2000ms to every request/response cycle. +
+
+
+
+
+

2. Acquire an EDL token from the EDL service

+
+
+

This is an activity that you must do by hand, with a browser.

+
+
+
    +
  • +

    Point you browser here: https://urs.earthdata.nasa.gov/profile +EDL Profile

    +
  • +
  • +

    Click the Generate Token link.

    +
  • +
  • +

    Now you should be at the Generate a Bearer Token page +EDL Generate Bearer Token

    +
  • +
  • +

    Click the big green Generate Token button.

    +
  • +
  • +

    Consider the resulting page: +EDL Generate Bearer Token

    +
  • +
+
+
+

Copy the token into your clipboard and save it in a local file for safe keeping. +Also, for the purposes of this guide, make a file called edl_token_auth.hdr and +in the file put this line:

+
+
+
+
Authorization: Bearer TOKEN_VALUE
+
+
+
+
+
+

3. Clients that work with EDL tokens

+
+
+

(Some shimming required)

+
+
+

3.1. curl (Command line cURL)

+
+

Recent changes in the way that the Hyrax service utilizes EDL tokens means that +the clients are no longer required to follow redirects or maintain session state +by managing cookies.

+
+
+

Here are two examples with command line cURL. One that uses EDL tokens and +maintains sessions and a second that uses only the EDL

+
+
+

3.1.1. cURL with EDL Token and session cookies.

+
+

You can utilize your EDL token with a commandline cURL request that will +maintain a session so that subsequent requests will be serviced more quickly.

+
+
+
+
#!/bin/bash
+# cURL example, uses sessions, no redirects.
+#
+export url="https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds"
+echo "url: ${url}" >&2
+
+# Load the EDL token file contents into the shell variable 'auth_hdr'
+export auth_hdr=$(cat edl_token_auth.hdr)
+echo "auth_hdr: ${auth_hdr}" >&2
+
+curl -c ~/cookie_file -b ~/cookie_file -H "${auth_hdr}" "${url}"
+
+
+
+

What is happening here?

+
+
+
+
-c cookie_file
+
+

This tells cURL to stash cookies in the file cookie_file

+
+
-b cookie_file
+
+

This tells cURL to read cookies from the file cookie_file

+
+
-H "${auth_hdr}"
+
+

The -H option adds its parameter value as a request header in +the HTTP request sent to the origin server, ${url} in the example above. +Because the Authorization header contains space characters, the double quotes +around the value required.

+
+
${url}
+
+

The URL to dereference and retrieve.

+
+
+
+
+ + + + + +
+
Note
+
+The client need not follow redirects (-L) for the Hyrax DAP service. With +other servers ymmv. +
+
+
+
+

3.1.2. cURL with only the EDL Token.

+
+

You can utilize your EDL token with a command line cURL request without +maintaining sessions.

+
+
+
+
#!/bin/bash
+# cURL example, no session, no redirects.
+#
+export url="https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.dds"
+echo "url: ${url}" >&2
+
+# Load the EDL token file contents into the shell variable 'auth_hdr'
+export auth_hdr=$(cat edl_token_auth.hdr)
+echo "auth_hdr: ${auth_hdr}" >&2
+
+curl -H "${auth_hdr}" "${url}"
+
+
+
+

What is happening here?

+
+
+
+
-H "${auth_hdr}"
+
+

The -H option adds its parameter value as a request header in +the HTTP request sent to the origin server, ${url} in the example above. +Because the Authorization header contains space characters, the double quotes +around the value are a must.

+
+
${url}
+
+

The URL to dereference and retrieve.

+
+
+
+
+ + + + + +
+
Note
+
+The client need not follow redirects (-L) for the Hyrax DAP service. With +other servers ymmv. +
+
+
+
+
+

3.2. wget

+
+

In this example we will also utilize the edl_token_auth.hdr file that we +created earlier. And, like in the cURL example there will be two examples, one +in which wget maintains a session using cookies, and one where it does not. And, +as with cURL, the maintaining a session will provide better performance on +subsequent requests.

+
+
+

3.2.1. wget with EDL Token and a session.

+
+

Consider this wget command:

+
+
+
+
#!/bin/bash
+export url="https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.das"
+echo "url: ${url}" >&2
+
+export auth_hdr=$(cat edl_token_auth.hdr)
+echo "auth_hdr: ${auth_hdr}" >&2
+
+wget --load-cookies cookie_file --save-cookies cookie_file --keep-session-cookie --header="${auth_hdr}" "${url}"
+
+
+
+

What’s happening with wget here?

+
+
+
+
--load-cookies cookies
+
+

Load cookies from the file "cookie_file"

+
+
--save-cookies cookies
+
+

Save cookies to the file "cookie_file"

+
+
--keep-session-cookie
+
+

Save session cookies.

+
+
--header "${auth_hdr}"
+
+

Send the value of the environment variable auth_hdr +along with the rest of the headers in each HTTP request. The supplied header +is sent as-is, which means it must contain name and value separated by colon, +and must not contain newlines.

+
+
${url}
+
+

The URL to retrieve, in this case +https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.das

+
+
+
+
+
+

3.2.2. wget with only the EDL Token.

+
+

Consider this wget command:

+
+
+
+
#!/bin/bash
+export url="https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.das"
+echo "url: ${url}" >&2
+
+export auth_hdr=$(cat edl_token_auth.hdr)
+echo "auth_hdr: ${auth_hdr}" >&2
+
+wget --header="${auth_hdr}" "${url}"
+
+
+
+

What’s happening with wget here?

+
+
+
+
--header "${auth_hdr}"
+
+

Send the value of the environment variable auth_hdr +along with the rest of the headers in each HTTP request. The supplied header +is sent as-is, which means it must contain name and value separated by colon, +and must not contain newlines.

+
+
${url}
+
+

The URL to retrieve, in this case +https://opendap.earthdata.nasa.gov/hyrax/data/nc/fnoc1.nc.das

+
+
+
+
+
+
+

3.3. PyDAP

+
+
+
Summary
+
+

Because PyDAP allows the programmer to inject a Session object with customized +request headers it is pretty straight forward to utilize an EDL token when +making requests.

+
+
+
+
+
+
# Importing the star of our show, PyDAP!
+import pydap
+
+print ("dataset_url: ", dataset_url)
+
+# This gets the EDL token from the users keyboard.
+edl_token=input("EDL Token Value: ")
+print("EDL Token: ", edl_token);
+
+auth_hdr="Bearer "+edl_token
+print("auth_hdr: ", auth_hdr);
+
+# PyDAP accepts a Session, so we make a Session and give it the Authorization
+# header:
+
+my_session = requests.Session()
+my_session.headers={"Authorization": auth_hdr}
+
+pd_dataset = pydap.client.open_url(dataset_url, session=my_session, protocol="dap4")
+
+
+
+

If you want to see it in action, you can go to PyDAP’s static documentation and navigate to Basic Authentication under Examples. Other Example notebooks can further illustrate workflows starting with Token-based authentication.

+
+
+
+
+
+

4. Clients that do not work with EDL tokens

+
+
+

4.1. ncdump, nccopy, Matlab, and other applications that use NetCDF-C

+
+

Neither of the usage statements from nccopy and ncdump contain any mention +of submitting arbitrary headers, or authorization headers through their +published command line interface.

+
+
+

We may need to make a request to UNIDATA to add a request header injection UI +to the NetCDF tools because until this is resolved existing NetCDF client will +be able to work with EDL tokens.

+
+
+
+

4.2. Panoply, ToolsUI, Integrated Data Viewer (IDV)

+
+

None of these GUI driven data access clients contain a GUI component that +allows the user to either submit an authorization header or EDL token value. +Nor do they have a mechanism through which a user may identify an authorization +header or token file. Until these applications GUIs or their configuration +interface have been changed to utilize tokens these applications will be unable +to authenticate with EDL without using HTTP BASIC authentication (including an +expected 401 response from the EDL endpoint) and traditional credentials.

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/tutorials/ClientAuthenticationWithEDLTokens.pdf b/tutorials/ClientAuthenticationWithEDLTokens.pdf new file mode 100644 index 0000000..53d95a7 Binary files /dev/null and b/tutorials/ClientAuthenticationWithEDLTokens.pdf differ diff --git a/tutorials/DataAccessTutorials.html b/tutorials/DataAccessTutorials.html new file mode 100644 index 0000000..840b897 --- /dev/null +++ b/tutorials/DataAccessTutorials.html @@ -0,0 +1,849 @@ + + + + + + + +OPeNDAP Data Access Client Tutorials + + + + + + + + + + + + + + + + +
+
+

Client Software Authentication

+
+
+

Some data providers, most notably NASA, require data access requests be +authenticated. This means you have to a user account with the institution and +any software client application working on your behalf (browser, cURL, etc) +must be provided with user credentials or tokens either through dynamic user +interaction or configuration.

+
+ +
+
+
+

Command line clients

+
+
+

These clients are invoked from a shell and are typically used in an automated +data access activity, possibly written as a shell script.

+
+
+ +
+
+
+
+

Python client tutorials

+
+
+

Among the most stable and widely used within the Python ecosystem are NetCDF and PyDAP. Xarray, a widely popular package within the Pangeo ecosystem uses both as a backend engine, and both NetCDF and PyDAP are required dependencies for Xarray, which means installing Xarray installs NetCDF and PyDAP by default. Between the two packages, we recommend getting started with PyDAP to best exploit OPeNDAP resources, because PyDAP has the following characteristics:

+
+
+
    +
  • +

    Pure python implementation of the DAP protocol.

    +
  • +
  • +

    Open-source, developed and maintained by the OPeNDAP team and the broad PyDAP/OPeNDAP community.

    +
  • +
  • +

    Has its own lightweight server implementation.

    +
  • +
  • +

    Server-side and data-proximmate subsetting. OPeNDAP servers are highly specialized to subset the original dataset. With PyDAP, a user can add constraint expressions to the URL, a powerful tool once you get familiarize with.

    +
  • +
+
+
+

Below are a combination of static and interactive resources. You can click the associated image badge logo Binder badge to run the notebooks in your browser.

+
+
+
    +
  • +

    PyDAP’s documentation - Inside you will find static tutorials, mostly with DAP4 protocol. Some of the example include working with Constraint Expressions.

    +
    + +
    +
  • +
  • +

    Interactive jupyter notebooks badge logo, showing similar workflows with PyDAP as that of its official documentation. The DAP2 example is that when working with CMIP6 data.

    +
    +
      +
    • +

      Requirements: EDL account, and create a token for authentication.

      +
    • +
    • +

      NOTE: GetStarted.ipynb notebook should be executed first as it creates local file with EDL credentials needed to access data in the all other notebooks.

      +
    • +
    +
    +
  • +
+
+
+

Older python resource:

+
+
+
    +
  • +

    NetCDF-python w/DAP4 +colab badge - +An iPython notebook tutorial for remote data access using NetCDF Python. When +NetCDF is used to access a remote dataset it does so by making DAP4 queries +to the remote service.

    +
  • +
  • +

    Xarray and netCDF4 w/DAP4 +colab badge - +An iPython notebook tutorial for remote data access using Xarray.

    +
  • +
+
+
+
+
+

Matlab

+ +
+
+

Tutorial Datasets

+
+
+

Several datasets are used in these tutorials and some general information about +each may be found on our +Tutorial Dataset Information +page.

+
+
+
+
+

Coming Soon

+
+
+
    +
  • +

    DAP4 PyDAP Python sub-setting large datasets (notebook)

    +
  • +
  • +

    Using the cURL command line to access data (shell)

    +
  • +
  • +

    Panoply Tutorial for remote data access.

    +
  • +
+
+
+
+
+ + + \ No newline at end of file diff --git a/tutorials/DataAccessTutorials.pdf b/tutorials/DataAccessTutorials.pdf new file mode 100644 index 0000000..18df788 Binary files /dev/null and b/tutorials/DataAccessTutorials.pdf differ diff --git a/tutorials/TutorialDatasets.html b/tutorials/TutorialDatasets.html new file mode 100644 index 0000000..17c3246 --- /dev/null +++ b/tutorials/TutorialDatasets.html @@ -0,0 +1,1562 @@ + + + + + + + + +Tutorial Datasets + + + + + + + + + + + + + + + + +
+
+
+
+

These datasets are used by the various DAP data access tutorials located here. +They are listed in order from smallest to largest. Each of the following +sections contains links to the source dataset at the original publishers site, +and links to a copy of the dataset granule hosted at test.opendap.org

+
+
+
+
+

1. NASA Global High Resolution Sea Surface Temperature (GOES-16 Satellite)

+
+
+
+GHRSST (GOES-16) Example +
+
+
+

These data are regional and part of the Group for High Resolution Sea Surface +Temperature (GHRSST) Level 3 Collated (L3C) dataset covering the America Region +based on retrievals from the Advanced Baseline Imager (ABI) on board the +Geostationary Operational Environmental Satellite-16 (GOES-16).

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+file_name + +

20220812010000-OSISAF-L3C_GHRSST-SSTsubskin-GOES16-ssteqc_goes16_20220812_010000-v02.0-fv01.0.nc

+
+BoundingBox + +

lon_max = -15, lat_max = 60, lon_min = -135, lat_min = -60

+
+Native File Size + +

9,626,842 bytes

+
+Total Variables + +

19

+
+Range Variables + +

16

+
+Uncompressed Range Variable + +

11,520,000 bytes

+
+
+ +
+

1.2. Host: test.opendap.org

+ +
+
+
+
+

2. NOAA GHRSST, 4km (Pathfinder Satellite)

+
+
+
+Pathfinder AVHRR Example +
+
+
+

This data product is a long-term Climate Data Record (1981–present) that builds +on the historic aspect of Pathfinder Sea Surface Temperature (SST) (Saha et. al +2018). It contains global, twice-daily (Day and Night) 4km SST derived from +measurements captured by Advanced Very High Resolution Radiometer (AVHRR) +instruments aboard NOAA polar-orbiting satellites.

+
+
+

2.1. Test Granule: 01/06/1996 Nighttime

+
+ + + + + + + + + + + + + + + + + + + + + +
+file_name + +

19960106043137-NCEI-L3C_GHRSST-SSTskin-AVHRR_Pathfinder-PFV5.3_NOAA14_G_1996006_night-v02.0-fv01.0.nc

+
+Native File Size + +

39,007,534 bytes

+
+Total Variables + +

18

+
+Range Variables + +

11

+
+Uncompressed Range Variable + +

74,649,600 bytes

+
+
+ +
+

2.1.2. Host: test.opendap.org

+ +
+
+
+

2.2. Test Granule: 01/06/1996 Daytime

+
+ + + + + + + + + + + + + + + + + + + + + +
+file_name + +

19960106134722-NCEI-L3C_GHRSST-SSTskin-AVHRR_Pathfinder-PFV5.3_NOAA14_G_1996006_day-v02.0-fv01.0.nc

+
+Native File Size + +

39,106,029 bytes

+
+Total Variables + +

18

+
+Range Variables + +

11

+
+Uncompressed Range Variable + +

74,649,600 bytes

+
+
+ +
+

2.2.2. Host: test.opendap.org

+ +
+
+
+
+
+

3. NASA/JPL/USGS ECOSTRESS

+
+
+
+ECCOSTRESS Example +
+
+
+

The ECOsystem Spaceborne Thermal Radiometer Experiment on Space Station +(ECOSTRESS), will monitor one of the most basic processes in living plants: the +loss of water through the tiny pores in leaves. When people lose water through +their pores, the process is called sweating. The related process in plants is +known as transpiration. Because water that evaporates from soil around plants +also affects the amount of water that plants can use, ECOSTRESS will measure +combined evaporation and transpiration, known as evapotranspiration (ET). +ECOSTRESS will address 3 science questions:

+
+
+

3.1. Test Granule: ECOSTRESS Land Surface Temperature and Emissivity Daily L2 Global 70 m 1/6/1996

+
+

The ECOsystem Spaceborne Thermal Radiometer Experiment on Space Station +(ECOSTRESS) mission measures the temperature of plants to better understand how +much water plants need and how they respond to stress. ECOSTRESS is attached to +the International Space Station (ISS) and collects data over the conterminous +United States (CONUS) as well as key biomes and agricultural zones around the +world and selected FLUXNET validation sites. +A map of the acquisition coverage can be found on the ECOSTRESS +website.

+
+
+ + + + + + + + + + + + + + + + + + + + + +
+file_name + +

ECOSTRESS_L2_LSTE_26387_008_20230302T100304_0601_02.h5

+
+Native File Size + +

150,254,547 bytes

+
+Total Variables + +

??? (I have no idea what’s going on in this dataset!)

+
+Range Variables + +

15

+
+Uncompressed Range Variable + +

60,825,600 bytes

+
+
+ +
+

3.1.2. Host: test.opendap.org

+ +
+
+
+
+
+

4. NASA Daymet Precipitation

+
+
+
+Daymet Daily Example +
+
+
+

NASA Daymet Version 4 R1 data are gridded estimates of daily weather parameters +for North America, Hawaii, and Puerto Rico. Daymet variables include the +following parameters: minimum temperature, maximum temperature, precipitation, +shortwave radiation, vapor pressure, snow water equivalent, and day length.

+
+
+

4.1. Test Granule: Daymet 1996 North America Daily V4R1 Precipitation

+
+ + + + + + + + + + + + + + + + + + + + + +
+file_name + +

daymet_v4_daily_na_prcp_1996.nc

+
+Native File Size + +

3,810,812,334 bytes

+
+Total Variables + +

9

+
+Range Variables + +

1

+
+Uncompressed Range Variable + +

92,123,153,000 bytes

+
+
+ +
+

4.1.2. Host: test.opendap.org

+
+ + + + + + + + + + + + + +
+dap_service_url + +

http://test.opendap.org/opendap/hyrax/tutorials/daymet_v4_daily_na_prcp_1996.nc

+
+DAP4 + +

html +dmr

+
+DAP2 + +

dds +das

+
+
+
+
+
+
+
+

5. NASA: Daily MUR SST, Final product

+
+
+
+GHRSST (MUR) Example +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+file_name + +

20220531090000-JPL-L4_GHRSST-SSTfnd-MUR-GLOB-v02.0-fv04.1.nc

+
+Native File Size + +

730,585,356 bytes

+
+Total Variables + +

9

+
+Range Variables + +

6

+
+Uncompressed Range Variable + +

1,295,928,000 bytes

+
+
+ +
+

5.2. Host: test.opendap.org

+ +
+
+
+
+ + + \ No newline at end of file diff --git a/tutorials/TutorialDatasets.pdf b/tutorials/TutorialDatasets.pdf new file mode 100644 index 0000000..afb64fd Binary files /dev/null and b/tutorials/TutorialDatasets.pdf differ diff --git a/tutorials/matlab_tutorial.html b/tutorials/matlab_tutorial.html new file mode 100644 index 0000000..77e3069 --- /dev/null +++ b/tutorials/matlab_tutorial.html @@ -0,0 +1,1410 @@ + + + + + + + + +Using Matlab with OPeNDAP + + + + + + + + + + + + + + + + + +
+
+

1. Overview

+
+
+
Who Is This Tutorial For?
+

This tutorial is for Matlab users who want to access OPeNDAP data services. In +the tutorial we will use Matlab’s built-in OPeNDAP client to access data from +either a server we run just for this purpose or from a server NASA runs as part +of its effort to move data into a cloud computing environment.

+
+
+

This tutorial assumes that the reader has a basic grasp of Matlab commands and +programming. It also assumes that the reader has a basic grasp of the Matlab +netCDF interface.

+
+
+

The NASA data in this document will require that the user configure +their client applications to authenticate with the NASA Earthdata Login service. +Since the authentication setup is similar for many clients, +we have covered it in a separate document

+
+ +
+
Tutorial Examples Language
+

The examples are written as Matlab commands. As much as possible, the examples +can be copied from the tutorial and run in the Matlab command window.

+
+
+

1.1. Matlab netCDF C details

+
+

The Matlab netCDF interface provides a way to read data from both netCDF files +on you computer and from remote OPeNDAP servers. The Matlab netCDF interface has two +parts: the netCDF C library and the Matlab interface to the netCDF C library. The latter, +the Matlab interface to the library is a set of Matlab functions that call the C library +and are documented in the Matlab help system. These functions are somewhat easier to use +that the netCDF library interface itself, but they are not as flexible as the C library.

+
+
+

In this tutorial we will use both the Matlab netCDF interface and the netCDF library calls.

+
+
+

1.1.1. Environment

+
+

You will need Matlab 2020a or later to run the examples in this tutorial.

+
+
+
+
+

1.2. The Data

+
+

In these examples will use GHRSST Level 3 Sea Surface Temperature data. The URL to +the data is given below and in the tutorial. In fact, there are two different URLs to the +same data. The first is a URL to a file on a server we run just for tutorial data and +testing while the second is a URL to a file on a NASA server running in NASA’s Cloud +Computing Environment. Both of the URLs use the dap4:// URL prefix to indicate that +the netCDF software should use the DAP4 protocol to access the data. The URL to the +OPeNDAP test server can be used without authentication. To use the URL to the NASA +Cloud server, you will need to have an Earthdata Login (EDL) account and have configured +your client applications to + +authenticate with EDL.

+
+
+
+
GHRSST Sub-skin Sea Surface Temperature data, no authentication needed
+
+

dap4://test.opendap.org/opendap/hyrax/tutorials/20220812010000-OSISAF-L3C_GHRSST-SSTsubskin-GOES16-ssteqc_goes16_20220812_010000-v02.0-fv01.0.nc

+
+
GHRSST Sub-skin Sea Surface Temperature data, NASA Cloud, authentication required
+
+

dap4://opendap.earthdata.nasa.gov/collections/C2036877806-POCLOUD/granules/20220812010000-OSISAF-L3C_GHRSST-SSTsubskin-GOES16-ssteqc_goes16_20220812_010000-v02.0-fv01.0

+
+
+
+
+
+
+
+

2. Getting Started

+
+
+

First, start Matlab and make sure the dataset is accessible. If you encounter problems +at this step, try using the URL in a browser. You will need to replace the dap4::// +URL prefix with http:// to make the URL work in a browser.

+
+
+

When the netcdf.open function is called, the Matlab netCDF interface will attempt to +'open' the remote dataset. If that works, you will be about to use the netcdf.inq function +along with the netCDF ID returned by netcdf.open to get information about the dataset. +These function calls are examples of using the netCDF C library interface to get information.

+
+
+

We do that here and see that this dataset holds 19 variables.

+
+
+
+
>> ghrsst = 'dap4://test.opendap.org/opendap/hyrax/tutorials/20220812010000-OSISAF-L3C_GHRSST-SSTsubskin-GOES16-ssteqc_goes16_20220812_010000-v02.0-fv01.0.nc'
+>> ncid = netcdf.open(ghrsst);
+>> [numdims,numvars,numglobalatts,unlimdimid] = netcdf.inq(ncid);
+>> numvars
+numvars =
+
+    19
+
+
+
+

The ncinfo() function can also be used to retrieve information about +the remote dataset. The ncinfo() function is a Matlab function that provides +a convenient way to access information about a remote dataset. It is a wrapper +to the netCDF library calls used in the previous example.

+
+
+
+
% Use the ncinfo function to retrieve information about the remote netCDF file
+>> ncinfo_result = ncinfo(ghrsst);
+
+
+
+

In this case, the ncinfo() function retrieves information about the +remote netCDF file located at the specified URL and stores it in the +ncinfo_result structure. Information about the Dimensions, Variables, +and Global Attributes can all be accessed from the object returned by +ncinfo(). This same information can also be accessed using the ncid +returned by netcdf.open(), but ncinfo() packages the result conveniently.

+
+
+
+
ncinfo_result =
+
+  struct with fields:
+
+      Filename: 'dap4://test.opendap.org/opendap/hyrax/tutorials/20220812010000-OSISAF-L3C_GHRSST-SSTsubskin-GOES16-ssteqc_goes16_20220812_010000-v02.0-fv01.0.nc'
+          Name: '/'
+    Dimensions: [1×3 struct]
+     Variables: [1×19 struct]
+    Attributes: []
+        Groups: []
+        Format: 'netcdf4'
+     Datatypes: []
+
+
+
+

2.1. Getting more detailed information about the dataset

+
+

To see all the values of the fields of an attribute struct, you can +loop over the attributes and display their names and values using the +Matlab disp() function. Here’s an example:

+
+
+
+
% Extract the global attributes from the ncinfo result
+>> global_atts = ncinfo_result.Attributes;
+
+% Loop over the attributes and display their names and values
+>> disp('Global attributes:')
+>> for i = 1:length(global_atts)
+    att_name = global_atts(i).Name;
+    att_val = global_atts(i).Value;
+    disp([att_name, ': ', att_val])
+end
+
+
+
+

In this case, we first extract the global attributes from the +Attributes field of the ncinfo_result structure. We then loop over the +attributes using a for loop, and for each attribute, we extract its +name and value using the Name and Value fields of the attribute +struct. We then display the attribute name and value using the disp +function. This will display all the global attributes and their +values.

+
+
+
+
Global attributes:
+Conventions: CF-1.4
+title: Sea Surface Temperature
+summary: The L3C product derived from GOES16/ABI brightness temperatures.
+references: Geostationary Sea Surface Temperature Product User Manual, http://www.osi-saf.org
+institution: OSISAF
+comment:
+license: All intellectual property rights of the Ocean & Sea Ice SAF products belong to EUMETSAT. The use of these products is granted to every user, free of charge. If users wish to use these products, EUMETSAT's copyright credit must be shown by displaying the words 'Copyright EUMETSAT' under each of the products shown. EUMETSAT offers no warranty and accepts no liability in respect of the Ocean & Sea Ice SAF products. EUMETSAT neither commits to nor guarantees the continuity, availability, or quality or suitability for any purpose of, the Ocean & Sea Ice SAF products.
+id: GOES16-OSISAF-L3C-v1.0
+product_id: OSI-207-b
+naming_authority: org.ghrsst
+product_version: 1.0
+gds_version_id: 2.0
+file_quality_level: 
+spatial_resolution: 0.05 degree
+northernmost_latitude: <
+southernmost_latitude:
+easternmost_longitude:
+westernmost_longitude:
+source: GOES_ABI
+platform: GOES16
+sensor: GOES_ABI
+Metadata_Conventions: Unidata Dataset Discovery v1.0
+metadata_link: N/A
+keywords: Oceans > Ocean Temperature > Sea Surface Temperature
+keywords_vocabulary: NASA Global Change Master Directory (GCMD) Science Keywords
+standard_name_vocabulary: NetCDF Climate and Forecast (CF) Metadata Convention
+geospatial_lat_units: degrees_north
+geospatial_lat_resolution:
+geospatial_lon_units: degrees_east
+geospatial_lon_resolution:
+acknowledgment: In case SAF data (pre-operational or operational) has been used for the study described in a paper the following sentence would be an appropriate reference to the funding coming from EUMETSAT: The data from the EUMETSAT Satellite Application Facility on Ocean & Sea Ice  used in this study are accessible through the SAF's homepage http://www.osi-saf.org
+creator_name: O&SI SAF
+creator_email: osi-saf.helpdesk@meteo.fr
+creator_url: http://www.osi-saf.org
+project: Group for High Resolution Sea Surface Temperature
+publisher_name: The GHRSST Project Office
+publisher_url: http://www.ghrsst.org
+publisher_email: ghrsst-po@nceo.ac.uk
+processing_level: L3C
+cdm_data_type: grid
+history: METEO-FRANCE GEOSAFO v1.1.8
+uuid: DF556788-19E1-11ED-A08A-48DF370DAD10
+date_created: 20220812T015542Z
+start_time: 20220812T004042Z
+time_coverage_start: 20220812T004042Z
+stop_time: 20220812T011929Z
+time_coverage_end: 20220812T011929Z
+netcdf_version_id: 4.6.3
+DODS_EXTRA.Unlimited_Dimension: time
+
+
+
+

We would like to look at the names of the variables in this dataset so +that we can use netcdf command to read the data values into Matlab.

+
+
+

To display the name, size, and dimensions of each variable in a +netCDF file, you can loop over the variables in the Variables field of +the ncinfo_result structure and display their names, sizes, and +dimensions using the disp() function. Here’s an example:

+
+
+
+
% Loop over the variables and display their names and sizes
+>> disp('Variables:')
+>> for i = 1:length(ncinfo_result.Variables)
+    var_name = ncinfo_result.Variables(i).Name;
+    var_size = ncinfo_result.Variables(i).Size;
+    var_dims = ncinfo_result.Variables(i).Dimensions;
+    disp([var_name, ': ', mat2str(var_size), ' (', strjoin({var_dims.Name}, ', '), ')'])
+end
+
+
+
+

We loop over the variables using a for loop, and for each variable, we +extract its name and size using the Name and Size fields of the +variable struct. We then display the variable name and size using the +disp() function. The mat2str() function is used to convert the variable +size from a numeric array to a string for display, and the strjoin() +function is used to concatenate the dimension names into a +comma-separated string. This will display the names, sizes, and +dimensions of all the variables in the netCDF file. This will display +the names and sizes of all the variables in the netCDF file.

+
+
+
+
Variables:
+time: 1 (time)
+lat: 2400 (lat)
+lon: 2400 (lon)
+sea_surface_temperature: [2400 2400 1] (lon, lat, time)
+sst_dtime: [2400 2400 1] (lon, lat, time)
+sses_bias: [2400 2400 1] (lon, lat, time)
+sses_standard_deviation: [2400 2400 1] (lon, lat, time)
+dt_analysis: [2400 2400 1] (lon, lat, time)
+wind_speed: [2400 2400 1] (lon, lat, time)
+sea_ice_fraction: [2400 2400 1] (lon, lat, time)
+aerosol_dynamic_indicator: [2400 2400 1] (lon, lat, time)
+adi_dtime_from_sst: [2400 2400 1] (lon, lat, time)
+sources_of_adi: [2400 2400 1] (lon, lat, time)
+l2p_flags: [2400 2400 1] (lon, lat, time)
+quality_level: [2400 2400 1] (lon, lat, time)
+satellite_zenith_angle: [2400 2400 1] (lon, lat, time)
+solar_zenith_angle: [2400 2400 1] (lon, lat, time)
+or_latitude: [2400 2400 1] (lon, lat, time)
+or_longitude: [2400 2400 1] (lon, lat, time)
+
+
+
+
+

2.2. Get a quick look at the data

+
+

We might want to get a quick look at the 'sea_surface_temperature' +array before going further, so let’s do that. This will be far from +'publication ready,' but given that the array is quite large, it will +give us a look at the data.

+
+
+
+
>> sst_varid = netcdf.inqVarID(ncid, 'sea_surface_temperature');
+>> sst_data = netcdf.getVar(ncid, sst_varid);
+>> imagesc(sst_data);
+>> colormap(hot);
+
+
+
+

This shows a plot in a popup window. It’s pretty rough, but we can +manipulate the data later.

+
+
+
+plot 1 a quick look +
+
+
+
+
+
+

3. Using the data

+
+
+

To plot the data in a more publication-ready way, we will need to +get the vectors that hold the Latitude and Longitude coordinate information +for the Sea Surface Temperature data.

+
+
+

To read the data values for the 'lat' and 'lon' variables, we can +first ask for their variable IDs and then use those to read the +values.

+
+
+
+
>> % Get the IDs of the lat and lon variables
+lat_varid = netcdf.inqVarID(ncid, 'lat');
+lon_varid = netcdf.inqVarID(ncid, 'lon');
+
+% Read the data for the lat and lon variables
+lat_data = netcdf.getVar(ncid, lat_varid);
+lon_data = netcdf.getVar(ncid, lon_varid);
+
+
+
+

3.1. Data wrangling

+
+

In many cases, data stored in files are not quite in teh form needed for actual use +in a toll like Matlab. Transforming the values so they are ready for analysis is +often called 'data wrangling'. We will need to do some data wrangling because the +data in sst_data are neither scaled nor are the missing data values replaced with NaN.

+
+
+

To find out how to transform the data, let’s look at the attributes of the dataset +and see if there is any information there that will help us.

+
+
+

To get the attributes of a specific variable we can use the ncinfo() +function as follows:

+
+
+
+
% Get the variable's attributes
+>> varinfo = ncinfo(ghrsst, 'sea_surface_temperature');
+>> varinfo
+
+
+
+

The information returned is:

+
+
+
+
varinfo =
+
+  struct with fields:
+
+        Filename: 'dap4://test.opendap.org/opendap/hyrax/tutorials/20220812010000-OSISAF-L3C_GHRSST-SSTsubskin-GOES16-ssteqc_goes16_20220812_010000-v02.0-fv01.0.nc'
+            Name: 'sea_surface_temperature'
+      Dimensions: [1×3 struct]
+            Size: [2400 2400 1]
+        Datatype: 'int16'
+      Attributes: [1×12 struct]
+       ChunkSize: []
+       FillValue: 'disable'
+    DeflateLevel: []
+         Shuffle: 0
+          Format: 'netcdf4'
+
+
+
+

As before with the dataset’s global attributes, loop over the +attributes and display their names and values. This version of the loop +is slightly more complex because some attributes are strings and +some are numeric. The ischar() function is used along with fprintf() +to display the values correctly (note that in the format string used with +fprintf(), the %g format specifier is used to display numeric values, e.g.).

+
+
+
+
>> disp('sea_surface_temperature attributes:')
+>> for i = 1:length(varinfo.Attributes)
+    attr = varinfo.Attributes(i);
+    name = attr.Name;
+    value = attr.Value;
+
+    if ischar(value)
+        fprintf('%s = ''%s''\n', name, value);
+    else
+        fprintf('%s = %g\n', name, value);
+    end
+end
+
+
+
+

The output shows the numerical values correctly:

+
+
+
+
_FillValue = -32768
+long_name = NaN
+standard_name = NaN
+units = NaN
+add_offset = 273.15
+scale_factor = 0.01
+valid_min = -300
+valid_max = 4500
+depth = NaN
+source = NaN
+comment = NaN
+_edu.ucar.maps = NaN
+/lat = NaN
+
+
+
+

The variable attributes _FillValue, add_offset, and scale_factor indicate +how the values will need to be modified to get the correct values.

+
+
+
+
% Get the scale factor and add offset
+scale_factor = varinfo.Attributes(strcmp({varinfo.Attributes.Name},'scale_factor')).Value;
+add_offset = varinfo.Attributes(strcmp({varinfo.Attributes.Name},'add_offset')).Value;
+
+% Get the fill value
+fill_value =
+varinfo.Attributes(strcmp({varinfo.Attributes.Name},'_FillValue')).Value
+
+
+
+

Before we go further, lets look at those values:

+
+
+
+
scale_factor =
+
+    0.0100
+
+>> add_offset
+
+add_offset =
+
+  273.1500
+
+>> fill_value
+
+fill_value =
+
+  int16
+
+   -32768
+
+>> sst_data(1:150:2400, 1:150:2400)
+
+ans =
+
+  16×16 int16 matrix
+
+...
+
+
+
+

The sst_data array in an Int16 array, but we would like an array of +double values. Once we have that, we can replace the fill_value cells +with NaN and scale the data.

+
+
+
+
% Convert to double
+>> data = double(sst_data);
+
+% Set fill values to NaN
+>> fv_mask = data == fill_value;
+>> data(fv_mask) = NaN;
+
+% Look at a sub-sample of the values
+>> data(1:150:2400, 1:150:2400)
+
+ans =
+
+  16×16 double matrix
+
+...
+
+>> data = data * scale_factor + add_offset;
+>> data(1:150:2400, 1:150:2400)
+
+ans =
+
+       NaN       NaN       NaN       NaN       NaN       NaN       NaN
+       299.2100  297.1900       NaN       NaN  296.9300       NaN
+       NaN       NaN       NaN
+
+       NaN       NaN       NaN       NaN       NaN       NaN
+       NaN  299.4000  297.0700       NaN       NaN       NaN  294.8500
+       NaN       NaN       NaN
+
+
+
+
+

3.2. Plotting

+
+

The data values are rotated 90 degrees (because netCDF uses C notion +of row-major order but Matlab uses column-major order).

+
+
+
+
% Use the apostrophe (') operator to transpose the data
+>> data_t = data';
+
+
+
+

The data store negative latitude at the top and positive at the +bottom - we need those flipped for a north-up plot.

+
+
+
+
>> imagesc(lon_mesh(1,:), flip(lat_mesh(:,1)), data_t);
+
+
+
+

However, that leaves the Y-axis labels still inverted; use this 'set' +command to flip tha Y-axis labels.

+
+
+
+
>> set(gca,'YTickLabel',flip(get(gca,'YTickLabel')));
+% Add x and y axis labels
+>> xlabel('Longitude');
+>> ylabel('Latitude');
+
+
+
+

Set the range of the color bar and the colormap

+
+
+
+
>> caxis([270, 310]);
+
+% Try out various color maps
+>> colormap(hot);
+>> colormap(cool);
+>> colormap(parula);
+>> colorbar;
+
+
+
+

Here’s the plot. It lacks a coastline because we want to show access without +requiring any of the optional Matlab packages that provide coastlines. However, +the North and South American continents are clearly visible. It is +possible to download the coastlines and plot them, but that is beyond the scope +of this tutorial.

+
+
+
+plot 2 A Better plot +
+
+
+

fini

+
+
+
+
+
+ + + \ No newline at end of file diff --git a/tutorials/matlab_tutorial.pdf b/tutorials/matlab_tutorial.pdf new file mode 100644 index 0000000..741e48f Binary files /dev/null and b/tutorials/matlab_tutorial.pdf differ diff --git a/tutorials/nccopy_tutorial.html b/tutorials/nccopy_tutorial.html new file mode 100644 index 0000000..a0b89a4 --- /dev/null +++ b/tutorials/nccopy_tutorial.html @@ -0,0 +1,1530 @@ + + + + + + + + +Data Access With nccopy + + + + + + + + + + + + + + + + + +
+
+

1. Overview

+
+
+
+
Who Is This Tutorial For?
+
+

Many people that use OPeNDAP services have a workflow that relies on the data +being held in local netcdf files. Many of these users come to an OPeNDAP service +endpoint for a particular data granule, and then they ask the server to +"rewrite" the entire granule as a netcdf-3 or netcdf-4 files. If you are one of +these people then this tutorial is for you!

+
+
Tutorial Examples Language
+
+

The examples are written as bash scripts.

+
+
+
+
+

Why nccopy and ncdump?

+
+
+

The nccopy and ncdump applications are command line tools that can be used +in shell scripting environment to:

+
+
+
    +
  • +

    Build a custom netcdf file locally from an existing local netcdf file.

    +
  • +
  • +

    Build a custom netcdf file locally from a remote DAP2 or DAP4 data service.

    +
  • +
  • +

    Fine tune the compression and chunking parameters in the resulting file.

    +
  • +
+
+
+

When nccopy and ncdump access remote data via the DAP2 and DAP4 protocol the +server is able to stream the response back. Data transmission begins almost +immediately. In contrast, when a user asks the server to return a response +encoded as a netcdf-3 or netcdf-4 file, the server cannot stream the response +because of the way the netcdf-4 is structured: bytes at the beginning of the +file are modified when the file is closed after creation. This means that there +can be a lengthy delay before the server can begin transmitting the netcdf-4 +result. The delay can be lengthy enough that the request will fail due to a +timeout condition. When nccopy is used the delay is eliminated and the result +is also a netcdf-4 file on local disk. ohsnap.

+
+
+

In this tutorial we will work with the retrieval of remote data from a DAP4 +data service.

+
+
+

This tutorial assumes that the reader has a basic grasp of bash shell +programming.

+
+
+

The NASA examples in this document will require that the user configure +their client applications to authenticate with the NASA EDL OAuth2 service. +Since the authentication setup is complex, yet similar for many clients, +we have covered it in a separate document

+
+ +
+ + + + + +
+
Note
+
+Both the nccopy and the ncdump applications discussed in this tutorial need +to be configured to authenticate with EDL in order to work some of these tutorial +examples. +
+
+ +
+

1.1. nccopy details

+
+

The nccopy application is a linux command line program that is typically +installed with the netcdf-c libraries which can typically be acquired from a +package manager such as brew/yum/dnf/apt-get. The nccopy application allows +the user to rewrite netcdf files on the local disk, and using the DAP2 and DAP4 +protocols it can also rewrite remote datasets with a DAP access url and store +the results on local disk. It provides options for output file format, +customizing the internal data compression, chunk sizes, and selecting data +and/or definitions so that not everything is brought from the source dataset.

+
+
+

In this tutorial we will focus on the remote data access aspects of nccopy. We +leave the nuances of the compression and chunking controls to you, the capable +user.

+
+
+

Here is nccopy’s usage output:

+
+
+
+
nccopy: nccopy [-k kind] [-[3|4|6|7]] [-d n] [-s] [-c chunkspec] [-u] [-w] [-[v|V] varlist] [-[g|G] grplist] [-m n] [-h n] [-e n] [-r] [-F filterspec] [-Ln] [-Mn] infile outfile
+[-k kind] specify kind of netCDF format for output file, default same as input
+kind strings: 'classic', '64-bit offset', 'cdf5',
+'netCDF-4', 'netCDF-4 classic model'
+[-3]      netCDF classic output (same as -k 'classic')
+[-6]      64-bit-offset output (same as -k '64-bit offset')
+[-4]      netCDF-4 output (same as -k 'netCDF-4')
+[-7]      netCDF-4-classic output (same as -k 'netCDF-4 classic model')
+[-5]      CDF5 output (same as -k 'cdf5)
+[-d n]    set output deflation compression level, default same as input (0=none 9=max)
+[-s]      add shuffle option to deflation compression
+[-c chunkspec] specify chunking for variable and dimensions, e.g. "var:N1,N2,..." or "dim1/N1,dim2/N2,..."
+[-u]      convert unlimited dimensions to fixed-size dimensions in output copy
+[-w]      write whole output file from diskless netCDF on close
+[-v var1,...] include data for only listed variables, but definitions for all variables
+[-V var1,...] include definitions and data for only listed variables
+[-g grp1,...] include data for only variables in listed groups, but all definitions
+[-G grp1,...] include definitions and data only for variables in listed groups
+[-m n]    set size in bytes of copy buffer, default is 5000000 bytes
+[-h n]    set size in bytes of chunk_cache for chunked variables
+[-e n]    set number of elements that chunk_cache can hold
+[-r]      read whole input file into diskless file on open (classic or 64-bit offset or cdf5 formats only)
+[-F filterspec] specify a compression algorithm to apply to an output variable (may be repeated).
+[-Ln]     set log level to n (>= 0); ignored if logging isn't enabled.
+[-Mn]     set minimum chunk size to n bytes (n >= 0)
+infile    name of netCDF input file
+outfile   name for netCDF output file
+
+netCDF library version 4.9.0 of Oct  2 2022 23:17:14 $
+
+
+
+

1.1.1. Environment

+
+

You will need to have installed the netcdf-c library in order to complete +this tutorial. Because the tutorial examples are primarily DAP4, the netcdf-c +library version 4.9.0 or newer is recommended. This tutorial was developed using +netcdf library version 4.9.0 of Feb 13 2023 10:14:14 $

+
+
+

With netcdf-c library installed on your system you should be able to run +both ncdump and nccopy from any terminal window.

+
+
+
+
+

1.2. The Data

+
+

In these examples will use the following remote datasets:

+
+
+ +
+
+

Both of the example granules are DAP datasets: The precipitation dataset +contains one or more Groups. Because of this we will need to tell the nccopy +software to use the DAP4 protocol to access the data. We do this by changing +the https:// at the beginning of the dataset URL to dap4://

+
+
+

This dataset Url:

+
+
+
+
http://test.opendap.org/opendap/data/nc/coads_climatology.nc
+
+
+
+

Becomes this DAP4 URL:

+
+
+
+
dap4://test.opendap.org/opendap/data/nc/coads_climatology.nc
+
+
+
+
+
+
+

2. Examples

+
+
+

Since nccopy is a linux command line tool, I have written the examples in the +bash shell.

+
+
+

2.1. Full Granule Rewrite

+
+

This is the simplest usage of nccopy, in which we retrieve all the data from +remote DAP4 serviced granules, one of which contains a Group hierarchy.

+
+
+

2.1.1. COADS Climatology (No Authentication)

+
+
+
#!/bin/bash
+#
+# The dataset URLs should dereference to DAP service endpoint. In the case of
+# these servers the DAP2 and DAP4 endpoints are the same.
+#
+# When we invoke nccopy we use the "-4" option to tell nccopy to make a
+# netcdf-4 file. This is important because netcdf-3 (classic) does not support
+# Groups and we want to preserve them.
+#
+
+# This is the URL of the COADS Climatology data granule hosted at test.opendap.org,
+# no authentication required for data access
+
+test_d4_url="dap4://test.opendap.org/opendap/data/nc/coads_climatology.nc"
+
+#
+# Get the entire COADS data granule, using the DAP4 protocol, and save it
+# to test_coads.nc4
+
+nccopy -4 ${test_d4_url} test_coads.nc4
+
+# fini
+
+
+
+
+

2.1.2. NGAP Precipitation Data (EDL Authentication)

+
+
+
#!/bin/bash
+#
+# The dataset URLs should dereference to DAP service endpoint. In the case of
+# these servers the DAP2 and DAP4 endpoints are the same.
+#
+# When we invoke nccopy we use the "-4" option to tell nccopy to make a
+# netcdf-4 file. This is important because netcdf-3 (classic) does not support
+# Groups and we want to preserve them.
+
+#
+# This is the precipitation granule hosted at earthdata.nasa.gov,
+# NASA EDL authentication mandatory.
+
+ngap_d4_url="dap4://opendap.uat.earthdata.nasa.gov/collections/C1225808238-GES_DISC/granules/GPM_3IMERGHH.06%3A3B-HHR.MS.MRG.3IMERG.20200101-S000000-E002959.0000.V06B.HDF5"
+
+#
+# Get the entire precipitaion granule using the DAP4 protocol, and save it
+# to ngap_precip.nc4
+
+nccopy -4 ${ngap_d4_url} ngap_precip.nc4
+
+# fini
+
+
+
+
+
+

2.2. Remote Inventory Inspection

+
+

How do we see an inventory of the variables in a remote dataset?

+
+
+

In preparation for performing an inventory sub-setting example we need to +inspect the remote dataset to see what variables it may contain. +The nccopy command comes bundled with a sibling command, ncdump. The +ncdump command allows you to inspect the contents of the remote dataset, and +to make a complete Common Data Language (CDL) version, including data values, +of the remote dataset.

+
+
+

For sub-setting we are more interested in the inspection aspect of ncdump.

+
+
+

2.2.1. Using ncdump to view remote Dataset inventory

+
+

The usage is:

+
+
+
+
ncdump -h dap4_url
+
+
+
+

For the COADS dataset on test.opendap.org

+
+
+
+
#!/bin/bash
+#
+
+# This is the URL of the COADS Climatology data granule hosted at test.opendap.org, no
+# authentication required for data access
+test_d4_url="dap4://test.opendap.org/opendap/data/nc/coads_climatology.nc"
+
+ncdump -h "${test_d4_url}"
+
+
+
+

Which returns:

+
+
+
+
netcdf coads_climatology {
+dimensions:
+	COADSX = 180 ;
+	COADSY = 90 ;
+	TIME = 12 ;
+variables:
+	double COADSX(COADSX) ;
+		string COADSX:units = "degrees_east" ;
+		string COADSX:modulo = " " ;
+		string COADSX:point_spacing = "even" ;
+	double COADSY(COADSY) ;
+		string COADSY:units = "degrees_north" ;
+		string COADSY:point_spacing = "even" ;
+	double TIME(TIME) ;
+		string TIME:units = "hour since 0000-01-01 00:00:00" ;
+		string TIME:time_origin = "1-JAN-0000 00:00:00" ;
+		string TIME:modulo = " " ;
+	float SST(TIME, COADSY, COADSX) ;
+		SST:missing_value = -1.e+34f ;
+		SST:_FillValue = -1.e+34f ;
+		string SST:long_name = "SEA SURFACE TEMPERATURE" ;
+		string SST:history = "From coads_climatology" ;
+		string SST:units = "Deg C" ;
+		string SST:_edu.ucar.maps = "/TIME", "/COADSY", "/COADSX" ;
+	float AIRT(TIME, COADSY, COADSX) ;
+		AIRT:missing_value = -1.e+34f ;
+		AIRT:_FillValue = -1.e+34f ;
+		string AIRT:long_name = "AIR TEMPERATURE" ;
+		string AIRT:history = "From coads_climatology" ;
+		string AIRT:units = "DEG C" ;
+		string AIRT:_edu.ucar.maps = "/TIME", "/COADSY", "/COADSX" ;
+	float UWND(TIME, COADSY, COADSX) ;
+		UWND:missing_value = -1.e+34f ;
+		UWND:_FillValue = -1.e+34f ;
+		string UWND:long_name = "ZONAL WIND" ;
+		string UWND:history = "From coads_climatology" ;
+		string UWND:units = "M/S" ;
+		string UWND:_edu.ucar.maps = "/TIME", "/COADSY", "/COADSX" ;
+	float VWND(TIME, COADSY, COADSX) ;
+		VWND:missing_value = -1.e+34f ;
+		VWND:_FillValue = -1.e+34f ;
+		string VWND:long_name = "MERIDIONAL WIND" ;
+		string VWND:history = "From coads_climatology" ;
+		string VWND:units = "M/S" ;
+		string VWND:_edu.ucar.maps = "/TIME", "/COADSY", "/COADSX" ;
+}
+
+
+
+

For the precipitation dataset at earthdata.nasa.gov:

+
+
+
+
#!/bin/bash
+#
+
+# This is the precipitation granule hosted at at earthdata.nasa.gov,
+# NASA EDL authentication mandatory.
+ngap_d4_url="dap4://opendap.uat.earthdata.nasa.gov/collections/C1225808238-GES_DISC/granules/GPM_3IMERGHH.06%3A3B-HHR.MS.MRG.3IMERG.20200101-S000000-E002959.0000.V06B.HDF5"
+
+ncdump -h "${ngap_d4_url}"
+
+
+
+

Which returns the follow CDL:

+
+
+
+
netcdf GPM_3IMERGHH.06%3A3B-HHR.MS.MRG.3IMERG.20200101-S000000-E002959.0000.V06B {
+
+// global attributes:
+		string :FileHeader = "DOI=10.5067/GPM/IMERG/3B-HH/06;\nDOIauthority=http://dx.doi.org/;\nDOIshortName=3IMERGHH;\nAlgorithmID=3IMERGHH;\nAlgorithmVersion=3IMERGH_6.3;\nFileName=3B-HHR.MS.MRG.3IMERG.20200101-S000000-E002959.0000.V06B.HDF5;\nSatelliteName=MULTI;\nInstrumentName=MERGED;\nGenerationDateTime=2020-05-04T06:20:10.000Z;\nStartGranuleDateTime=2020-01-01T00:00:00.000Z;\nStopGranuleDateTime=2020-01-01T00:29:59.999Z;\nGranuleNumber=;\nNumberOfSwaths=0;\nNumberOfGrids=1;\nGranuleStart=;\nTimeInterval=HALF_HOUR;\nProcessingSystem=PPS;\nProductVersion=V06B;\nEmptyGranule=NOT_EMPTY;\nMissingData=;\n" ;
+		string :FileInfo = "DataFormatVersion=6a;\nTKCodeBuildVersion=0;\nMetadataVersion=6a;\nFormatPackage=HDF5-1.8.9;\nBlueprintFilename=GPM.V6.3IMERGHH.blueprint.xml;\nBlueprintVersion=BV_62;\nTKIOVersion=3.93;\nMetadataStyle=PVL;\nEndianType=LITTLE_ENDIAN;\n" ;
+
+group: Grid {
+  dimensions:
+  	time = 1 ;
+  	lon = 3600 ;
+  	lat = 1800 ;
+  	latv = 2 ;
+  	lonv = 2 ;
+  	nv = 2 ;
+  variables:
+  	float precipitationQualityIndex(time, lon, lat) ;
+  		string precipitationQualityIndex:DimensionNames = "time,lon,lat" ;
+  		string precipitationQualityIndex:coordinates = "time lon lat" ;
+  		precipitationQualityIndex:_FillValue = -9999.904f ;
+  		string precipitationQualityIndex:CodeMissingValue = "-9999.9" ;
+  	short IRkalmanFilterWeight(time, lon, lat) ;
+  		string IRkalmanFilterWeight:DimensionNames = "time,lon,lat" ;
+  		string IRkalmanFilterWeight:coordinates = "time lon lat" ;
+  		IRkalmanFilterWeight:_FillValue = -9999s ;
+  		string IRkalmanFilterWeight:CodeMissingValue = "-9999" ;
+  	short HQprecipSource(time, lon, lat) ;
+  		string HQprecipSource:DimensionNames = "time,lon,lat" ;
+  		string HQprecipSource:coordinates = "time lon lat" ;
+  		HQprecipSource:_FillValue = -9999s ;
+  		string HQprecipSource:CodeMissingValue = "-9999" ;
+  	float lon(lon) ;
+  		string lon:DimensionNames = "lon" ;
+  		string lon:Units = "degrees_east" ;
+  		string lon:units = "degrees_east" ;
+  		string lon:standard_name = "longitude" ;
+  		string lon:LongName = "Longitude at the center of\n\t\t\t0.10 degree grid intervals of longitude \n\t\t\tfrom -180 to 180." ;
+  		string lon:bounds = "lon_bnds" ;
+  		string lon:axis = "X" ;
+  	float precipitationCal(time, lon, lat) ;
+  		string precipitationCal:DimensionNames = "time,lon,lat" ;
+  		string precipitationCal:Units = "mm/hr" ;
+  		string precipitationCal:units = "mm/hr" ;
+  		string precipitationCal:coordinates = "time lon lat" ;
+  		precipitationCal:_FillValue = -9999.904f ;
+  		string precipitationCal:CodeMissingValue = "-9999.9" ;
+  	int time(time) ;
+  		string time:DimensionNames = "time" ;
+  		string time:Units = "seconds since 1970-01-01 00:00:00 UTC" ;
+  		string time:units = "seconds since 1970-01-01 00:00:00 UTC" ;
+  		string time:standard_name = "time" ;
+  		string time:LongName = "Representative time of data in \n\t\t\tseconds since 1970-01-01 00:00:00 UTC." ;
+  		string time:bounds = "time_bnds" ;
+  		string time:axis = "T" ;
+  		string time:calendar = "julian" ;
+  	float lat_bnds(lat, latv) ;
+  		string lat_bnds:DimensionNames = "lat,latv" ;
+  		string lat_bnds:Units = "degrees_north" ;
+  		string lat_bnds:units = "degrees_north" ;
+  		string lat_bnds:coordinates = "lat latv" ;
+  	float precipitationUncal(time, lon, lat) ;
+  		string precipitationUncal:DimensionNames = "time,lon,lat" ;
+  		string precipitationUncal:Units = "mm/hr" ;
+  		string precipitationUncal:units = "mm/hr" ;
+  		string precipitationUncal:coordinates = "time lon lat" ;
+  		precipitationUncal:_FillValue = -9999.904f ;
+  		string precipitationUncal:CodeMissingValue = "-9999.9" ;
+  	float lat(lat) ;
+  		string lat:DimensionNames = "lat" ;
+  		string lat:Units = "degrees_north" ;
+  		string lat:units = "degrees_north" ;
+  		string lat:standard_name = "latitude" ;
+  		string lat:LongName = "Latitude at the center of\n\t\t\t0.10 degree grid intervals of latitude\n\t\t\tfrom -90 to 90." ;
+  		string lat:bounds = "lat_bnds" ;
+  		string lat:axis = "Y" ;
+  	float HQprecipitation(time, lon, lat) ;
+  		string HQprecipitation:DimensionNames = "time,lon,lat" ;
+  		string HQprecipitation:Units = "mm/hr" ;
+  		string HQprecipitation:units = "mm/hr" ;
+  		string HQprecipitation:coordinates = "time lon lat" ;
+  		HQprecipitation:_FillValue = -9999.904f ;
+  		string HQprecipitation:CodeMissingValue = "-9999.9" ;
+  	short probabilityLiquidPrecipitation(time, lon, lat) ;
+  		string probabilityLiquidPrecipitation:DimensionNames = "time,lon,lat" ;
+  		string probabilityLiquidPrecipitation:Units = "percent" ;
+  		string probabilityLiquidPrecipitation:units = "percent" ;
+  		string probabilityLiquidPrecipitation:coordinates = "time lon lat" ;
+  		probabilityLiquidPrecipitation:_FillValue = -9999s ;
+  		string probabilityLiquidPrecipitation:CodeMissingValue = "-9999" ;
+  	short HQobservationTime(time, lon, lat) ;
+  		string HQobservationTime:DimensionNames = "time,lon,lat" ;
+  		string HQobservationTime:Units = "minutes" ;
+  		string HQobservationTime:units = "minutes" ;
+  		string HQobservationTime:coordinates = "time lon lat" ;
+  		HQobservationTime:_FillValue = -9999s ;
+  		string HQobservationTime:CodeMissingValue = "-9999" ;
+  	float randomError(time, lon, lat) ;
+  		string randomError:DimensionNames = "time,lon,lat" ;
+  		string randomError:Units = "mm/hr" ;
+  		string randomError:units = "mm/hr" ;
+  		string randomError:coordinates = "time lon lat" ;
+  		randomError:_FillValue = -9999.904f ;
+  		string randomError:CodeMissingValue = "-9999.9" ;
+  	int time_bnds(time, nv) ;
+  		string time_bnds:DimensionNames = "time,nv" ;
+  		string time_bnds:Units = "seconds since 1970-01-01 00:00:00 UTC" ;
+  		string time_bnds:units = "seconds since 1970-01-01 00:00:00 UTC" ;
+  		string time_bnds:coordinates = "time nv" ;
+  	float IRprecipitation(time, lon, lat) ;
+  		string IRprecipitation:DimensionNames = "time,lon,lat" ;
+  		string IRprecipitation:Units = "mm/hr" ;
+  		string IRprecipitation:units = "mm/hr" ;
+  		string IRprecipitation:coordinates = "time lon lat" ;
+  		IRprecipitation:_FillValue = -9999.904f ;
+  		string IRprecipitation:CodeMissingValue = "-9999.9" ;
+  	float lon_bnds(lon, lonv) ;
+  		string lon_bnds:DimensionNames = "lon,lonv" ;
+  		string lon_bnds:Units = "degrees_east" ;
+  		string lon_bnds:units = "degrees_east" ;
+  		string lon_bnds:coordinates = "lon lonv" ;
+
+  // group attributes:
+  		string :GridHeader = "BinMethod=ARITHMETIC_MEAN;\nRegistration=CENTER;\nLatitudeResolution=0.1;\nLongitudeResolution=0.1;\nNorthBoundingCoordinate=90;\nSouthBoundingCoordinate=-90;\nEastBoundingCoordinate=180;\nWestBoundingCoordinate=-180;\nOrigin=SOUTHWEST;\n" ;
+  } // group Grid
+}
+
+
+
+
+
+

2.3. Inventory Sub-setting

+
+

There are two ways to perform inventory sub-setting with nccopy. The nccopy way, +and the DAP way. The nccopy application has options that allow you to select +one or more variables and/or Groups (and their children) so that the resulting +local netcdf file created by nccopy contains only the desired data.

+
+
+

2.3.1. The nccopy way

+
+

Returning to our example datasets we’ll form an nccopy command in which we +will utilize the -V option to request a subset of the variables held in each +dataset to be saved to a local netcdf-4 file.

+
+
+
COADS Climatology Data (No Authentication)
+
+

In which we request the domain coordinates TIME, COADSX, and COADSY along +with the range variable SST (sea surface temperature).

+
+
+
+
#!/bin/bash
+#
+
+# This is the URL of the COADS Climatology data granule hosted at test.opendap.org,
+# authentication is not required for data access
+test_d4_url="dap4://test.opendap.org/opendap/data/nc/coads_climatology.nc"
+
+#
+# !! DAP4 FQNs did not work for this for this, I had to use the unadorned names.
+# FQNs do work on the other NGAP example (there are Groups)
+# !! I think that's a bug in nccopy !!
+
+request_vars="TIME,COADSX,COADSY,SST"
+
+#
+# We use the "-4" option to tell nccopy to make a netcdf-4 file.
+# We use the "-V" option to specify what to get.
+
+nccopy -4 -V "${request_vars}" ${test_d4_url} coads_subset_1.nc4
+
+# fini
+
+
+
+
+
NGAP Precipitation Data (EDL Authentication)
+
+

In which we request the domain variables for time, latitude, and +longitude, and the range variables precipitationCal and IRprecipitation. +Because each of these variables is a member of the Group named "Grid", we must +include the Group’s name in the Fully Qualified Name (FQN) of each item requested:

+
+
+
+
/Grid/time,/Grid/lat,/Grid/lon,/Grid/precipitationCal,/Grid/IRprecipitation
+
+
+
+
+
#!/bin/bash
+#
+# This is the precipitation granule hosted at at earthdata.nasa.gov,
+# NASA EDL authentication mandatory.
+
+ngap_d4_url="dap4://opendap.uat.earthdata.nasa.gov/collections/C1225808238-GES_DISC/granules/GPM_3IMERGHH.06%3A3B-HHR.MS.MRG.3IMERG.20200101-S000000-E002959.0000.V06B.HDF5"
+
+#
+# Because this is a DAP4 transaction the name of each variable in the list of
+# requested variables submitted to nccopy must be expressed as a Fully Qualified
+# Name (FQN). And because each variable in this example is a member of the Group
+# named "Grid" each requested variables name is prefixed with "/Grid/" as below:
+
+request_vars="/Grid/time,/Grid/lat,/Grid/lon,/Grid/precipitationCal,/Grid/IRprecipitation"
+
+#
+# We use the "-4" option to tell nccopy to make a netcdf-4 file. This is
+# important because netcdf-3 does not support Groups
+# We use the "-V" option to specify what to get.
+
+nccopy -4 -V "${request_vars}" ${ngap_d4_url} ngap_precip_subset_1.nc4
+
+# fini
+
+
+
+
+
+

2.3.2. The DAP4 Way

+
+

The DAP4 way means using a DAP4 constraint expression (d4_ce) to tell the +server which things to get. The difference is subtle, and this example may seem +redundant, but this technique can be used in other contexts.

+
+
+
+
/TIME;/COADSX;/COADSY;/SST
+
+
+
+
COADS Climatology Data (No Authentication)
+
+

In which we request the domain coordinates TIME, COADSX, and COADSY along +with the range variable SST (sea surface temperature).

+
+
+
+
#!/bin/bash
+#
+# This is the URL of the COADS Climatology data granule hosted at test.opendap.org,
+# authentication is not required for data access
+d4_url="dap4://test.opendap.org/opendap/data/nc/coads_climatology.nc"
+
+#
+# The DAP4 constraint expression to use with the request (Note: the FQNs are
+# separated by ";" and not "," like in the argument to nccopy's "-V" option.
+
+d4_ce="dap4.ce=/TIME;/COADSX;/COADSY;/SST"
+
+#
+# We use the "-4" option to tell nccopy to make a netcdf-4 file.
+
+nccopy -4 "${d4_url}?${d4_ce}" coads_subset_2.nc4
+
+# fini
+
+
+
+
+
NGAP Precipitation Data (EDL Authentication)
+
+

In which we request the domain variables for time, latitude, and +longitude, and the range variables precipitationCal and IRprecipitation. +Because each of these variables is a member of the Group named "Grid", we must +include the Group’s name in the Fully Qualified Name (FQN) of each item requested:

+
+
+
+
/Grid/time;/Grid/lat;/Grid/lon;/Grid/precipitationCal;/Grid/IRprecipitation
+
+
+
+
+
#!/bin/bash
+#
+# This is the precipitation granule hosted at at earthdata.nasa.gov,
+# NASA EDL authentication mandatory.
+
+d4_url="dap4://opendap.uat.earthdata.nasa.gov/collections/C1225808238-GES_DISC/granules/GPM_3IMERGHH.06%3A3B-HHR.MS.MRG.3IMERG.20200101-S000000-E002959.0000.V06B.HDF5"
+
+#
+# The DAP4 constraint expression to use with the request (Note: the FQNs are
+# separated by ";" and not "," like in the argument to nccopy's "-V" option.
+
+d4_ce="dap4.ce=/Grid/time;/Grid/lat;/Grid/lon;/Grid/precipitationCal;/Grid/IRprecipitation"
+
+#
+# And we apply the dap4 constraint to the URL we submit to nccopy and the
+# subsetting just happens :)
+
+nccopy -4 "${d4_url}?${d4_ce}" ngap_precip_subset_2.nc4
+
+# fini
+
+
+
+
+
+
+
+
+ + + \ No newline at end of file diff --git a/tutorials/nccopy_tutorial.pdf b/tutorials/nccopy_tutorial.pdf new file mode 100644 index 0000000..f3954d0 Binary files /dev/null and b/tutorials/nccopy_tutorial.pdf differ