Skip to end of metadataGo to start of metadata
Free opengeo software suite download software at UpdateStar - The OpenGeo Suite is an integrated package of best of breed open source geospatial software providing an easy to install Web-mapping and data sharing solution. It consists of several components. OpenGeo Suite offers a variety of ways to import, export, transform, and serve spatial data to the web, and make it interactive. Whether Suite components are installed remotely or locally, you can configure and manage them using PostGIS utilities, command line tools, the OpenGeo Suite Explorer for QGIS, the GeoServer web interface, or by using the GeoServer REST API or Boundless SDK. The OpenGeo Suite combines the power of open source plus the reliability and support of a single, stable vendor behind a full stack of software.
Table of Contents
The OpenGeo Community Suite (OCS) is free version of the OpenGeo Suite from OpenPlans, a 501c3 not for profit. Find more information about OpenPlans here. Since this version is free, you can download it and install on your personal computer running Windows, Linux or Mac OS X. The Community version is available here: http://opengeo.org/technology/suite/download/.
The OpenGeo Suite is a web-based geospatial software platform that allows users to create, store, edit, analyze, and visualize spatial information inside of a lightweight web-application. The following figure shows the basic setup:
Figure 1. Basic OpenGeo Suite setup
Components
The Suite consists of many open-source geospatial applications that are also standalone applications. These applications are modified to work together more easily but students can install each of these separately if needed. These components are described in more detail in the following sections.
Geoserver
(from http://geoserver.org/display/GEOS/Welcome)
Geoserver is an open-source application for creating, editing and viewing spatial data from many data sources. It is based on OGC standards such as the Web Map Service (WMS), Web Feature Service (WFS) and Web Coverage Service (WCS). Following is a list of some of the features of Geoserver:
- support for PostGIS, Oracle, DB2 databases
- support for ESRI Shapefiles, a variety of raster formats including MrSID, GeoTIFF, ECW, Erdas Imagine, JPEG2000 and many more. Geoserver supports the GDAL libraries for more format types
- on the fly projection using a EPSG database for many projections and the ability to define new projections
- data transformation between many input data sources and output formats including WMS, WFS, GML, JPG, PNG, SVG, KML, GeoRSS, JSON
- Styled layer descriptors (SLD) for symbolization
- A more complete list can be found here: http://geoserver.org/display/GEOS/Features
PostGIS
(from http://postgis.refractions.net/)
PostGIS is an extension for the PostgreSQL database that adds support for spatial data including creation, modification, transformation, querying, analyzing and exporting data. It is open-source, powerful and extensible and based on SQL extensions so queries are intuitive for those with SQL experience. PostGIS allows PostgreSQL to store tables representing vector (1D-3D, topological) and raster data formats. Geoserver supports PostGIS databases natively. In addition, PostGIS functions can be accessed through programming APIs such as the psycopg2 connector for Python so external applications can run spatial queries.
GeoExplorer
(from http://suite.opengeo.org/opengeo-docs/geoexplorer/)
GeoExplorer is a web-based application that allows users to create and publish interactive maps. GeoExplorer is extensible through GXP components so the environment can be tailored for specific needs. The user interface is intuitive and simple. Users can add data from server-side installations of Geoserver or from WMS services from external servers (e.g. Google, Bing and OpenStreetMap).
The interface looks generally like the following with a table of contents on the left panel, the map on the right, and toolbars for each of these panels - you can access our GeoExplorer installation from this link:
Users can add data using the green button above the table of contents - local Geoserver data is listed by default:
Data can also be added from Google, Bing or other external servers by changing the drop-down on the Available Layers dialog. In addition, services can added from any other WMS installation by adding a URL in the Add New Server dialog. For example, we can add a Google Hybrid layer and the layer idw_filled_merged from the server located at the following URL: http://nga.iowa.uiowa.edu:8080/geoserver/wms to make the following map:
After a map has been composed, the map can be published using the Publish Map button on the toolbar. Note: the user must be logged in with a valid identity in order for this to work. The map seen above is published and can be accessed from the following URL: http://nga.iowa.uiowa.edu:9090/geoexplorer/viewer/#maps/8. Ps. If you go to this link, click on the Google Earth (GE) button on the top-right of the toolbar.. you should have GE installed though.
The GeoExplorer can be modified to include new buttons that expose additional functionality.
GeoEditor
GeoWebCache
Styler
Dashboard
The Dashboard is a simple interface to components of the OpenGeo Suite. It allows administrators to start, stop and manage each of these components. The dashboard looks like the following:
Students will not generally use the dashboard unless they install the suite on their personal computer.
Note
Check out the full demonstration application and play!
Every ten years, the US census collects a staggering array of information about the population, collates it, and then releases it in raw form. It is a truly majestic compendium of data, but browsing it can be hard:
- there are so many scales of data, and so many potential columns to view, it's hard to build a general purpose mapping app that isn't hopelessly complicated; and,
- the data itself is so voluminous and complicated that building your own app can seem impossible.
This tutorial builds a very simple application that uses a single thematic style to visualize several dozen census variables collated to the county level.
For this adventure in map building, we use the following tools, which if you are following along you will want to install now:
- OpenGeo Suite 4 (available for Linux, Mac OSX and Windows, follow the Suite installation instructions)
The basic structure of the application will be
- A spatial table of counties in PostGIS, that will join with
- An attribute table with many census variables of interest, themed by
- A thematic style in GeoServer, browsed with
- A simple pane-based application in OpenLayers, allowing the user to choose the census variable of interest.
This application exercises all the tiers of the OpenGeo Suite!
In order to keep things simple, we will use a geographic unit that is large enough to be visible on a country-wide map, but small enough to provide a granular view of the data: a county. There are about 3000 counties in the USA, enough to provide a detailed view at the national level, but not so many as to slow down our mapping engine.
Map Data¶
To map counties, we'll need a geographic file of counties, so let's check the Google:
The most authoritative source would be the county layer from the US census, but unfortunately the file is about 50M in size! Great for detail mapping, but overkill for a country-wide thematic map.
The top entry is a discussion on an Esri forum about county boundaries, and includes a file of just about the right size, so we will work with that one.
- Download UScounties.zip
Census Data¶
The census 'QuickFacts' web site provides access to a complete set of census variables organized by county. In particular, we want:
- DataSet.txt – 3195 rows, one for the U.S., one for each state, one for each county, but no column headings. Each row is identified by a 5-digit combined state and county code, the 'FIPS code'. Data are comma-delimited.
- DataDict.txt – One row for each column in DataSet.txt. Each row has a column name, full human-readable column title, number of decimals, min, max, and total values.
Note
The next steps will involve some database work.
- If you haven't already installed the OpenGeo Suite, follow the Suite installation instructions.
- Create a spatial database named census to load data into.
The raw data is going to be loaded into the PostgreSQL database:
DataSet.txt is going to be loaded into a table named census
UScounties.shp is going to be loaded into a spatial table named counties
The census and counties tables will have a common key, the fips code.
Loading Census Data¶
We will use the PostgreSQL COPY command, which supports reading table data directly from delimited text files, to import the DataSet.txt file.
First, we need a table that has exactly the same number and type of columns as the DataSet.txt file. Fortunately, the DataDict.txt file includes a complete listing of all the column names and types. A little quick editing in a text editor yields a table definition:
Once we have a blank table, we can load the file. In order to read the file, it must be in a location that is accessible by the database. I usually use the /tmp directory in UNIX or OSX and the C:Temp directory on Windows.
We aren't quite finished with the census table, yet. The description on the web page notes '3195 rows, one for the U.S., one for each state, one for each county'. We only want rows for each county, otherwise things like county average calculations will get messed up.
The key to getting rid of the state entries is the fips code. A valid county fips code is made up of:
- two digits of state code; and,
- three non-zero digits of county code.
So we can get rid of the non-county entries by deleting all the rows that have zeroes in the last three digits:
Which deletes the aggregate records for the 50 states and 2 territories from the table.
Loading Census Shapes¶
Loading the UScounties.shp file is pretty easy, either using the command line or the shape loader GUI. Just remember that our target table name is counties. Here's the command-line:
And this is what the GUI looks like:
Note that, like the census table, the counties table also contains a fips code, so we have a common key to join the attributes to the spatial shapes for mapping
Our challenge now is to set up a rendering system that can easily render any of our 51 columns of census data as a map.
We could define 51 layers in GeoServer, and set up 51 separate styles to provide attractive renderings of each variable. But that would be a lot of work, and we're *much too lazy to do that. What we want is a single layer that can be re-used to render any column of interest.
One Layer to Rule them All¶
Using a parametric SQL view we can define a SQL-based layer definition that allows us to change the column of interest by substituting a variable when making a WMS map rendering call.
For example, this SQL definition will allow us to substitute any column we want into the map rendering chain:
The query joins the census table data to the counties spatial table, and includes a data column, that is dynamically filled in by the %column% variable.
One Style to Rule them All¶
Viewing our data via a parametric SQL view doesn't quite get us over the goal line though, because we still need to create a thematic style for the data, and the data in our 51 columns have vastly different ranges and distributions:
- some are percentages
- some are absolute population counts
- some are medians or averages of absolutes
We need to somehow get all this different data onto one scale, preferably one that provides for easy visual comparisons between variables.
The answer is to use the average and standard deviation of the data to normalize it to a standard scale.
For example:
- For data set D, suppose the avg(D) is 10 and the stddev(D) is 5.
- What will the average and standard deviation of (D - 10) / 5 be?
- The average will be 0 and the standard deviation will be 1.
Let's try it on our own census data.
So we can easily convert any of our data into a scale that centers on 0 and where one standard deviation equals one unit just by normalizing the data with the average and standard deviation!
Our new parametric SQL view will look like this:
The query first calculates the overall statistics for the column, then applies those stats to the data in the join query, serving up a normalized view of the data.
With our data normalized, we are ready to create one style to rule them all!
Our style will have two colors, one to indicate counties 'above average' and the other for 'below average'
Within those two colors it will have 3 shades, for a total of 6 bins in all
In order to divide up the population more or less evenly, the bins will be
- (#c51b7d) -1.0 and down (very below average)
- (#e9a3c9) -1.0 to -0.5 (below average)
- (#fde0ef) -0.5 to 0.0 (a little below average)
- (#e6f5d0) 0.0 to 0.5 (a little above average)
- (#a1d76a) 0.5 to 1.0 (above average)
- (#4d9221) 1.0 and up (very above average)
The colors above weren't chosen randomly! I always use the ColorBrewer site when building themes, because ColorBrewer provides palettes that have been tested for maximum readability and to some extent aesthetic quality. Here's the palette I chose:
Configure a new style in GeoServer by going to the Styles section, and selecting Add a new style.
Set the style name to stddev
Set the style workspace to opengeo
Paste in the style definition (below) for stddev.xml and hit the Save button at the bottom
Opengeo Suite For Mac Catalina
Now we have a style, we just need to create a layer that uses it!
Creating a SQL View¶
First, we need a PostGIS store that connects to our database
- Go to the Stores section of GeoServer and Add a new store
- Select a PostGIS store
- Set the workspace to opengeo
- Set the datasource name to census
- Set the database to census
- Set the user to postgres
- Set the password to postgres
- Save the store
You'll be taken immediately to the New Layer panel (how handy) where you should:
Click on Configure new SQL view..
Set the view name to normalized
Set the SQL statement to
Click the Guess parameters from SQL link in the 'SQL view parameters' section
Set the default value of the 'column' parameter to pst045212
Check the 'Guess geometry type and srid' box
Click the Refresh link in the 'Attributes' section
Select the fips column as the 'Identifier'
Click Save
You'll be taken immediately to the Edit Layer panel (how handy) where you should:
- In the Data tab
- Under 'Bounding Boxes' click Compute from data
- Under 'Bounding Boxes' click Compute from native bounds
- In the Publishing tab
- Set the Default Style to stddev
- In the Tile Caching tab
- Uncheck the 'Create a cached layer for this layer' entry
- Hit the Save button
That's it, the layer is ready!
- Go to the Layer Preview section
- For the 'opengeo:normalized' layer, click Go
We can change the column we're viewing by altering the column view parameter in the WMS request URL.
- Here is the default column:http://apps.opengeo.org/geoserver/opengeo/wms/reflect?layers=opengeo:normalized
- Here is the edu685211 column:http://apps.opengeo.org/geoserver/opengeo/wms/reflect?layers=opengeo:normalized&viewparams=column:edu685211
- Here is the rhi425212 column:http://apps.opengeo.org/geoserver/opengeo/wms/reflect?layers=opengeo:normalized&viewparams=column:rhi425212
The column names that the census uses are pretty opaque aren't they? What we need is a web app that lets us see nice human readable column information, and also lets us change the column we're viewing on the fly.
Preparing the Metadata¶
The first thing we need for our app is a data file that maps the short, meaningless column names in our census table to human readable information. Fortunately, the DataDict.txt file we downloaded earlier has all the information we need. Here's a couple example lines:
Each line has the column name, a human readable description, and some other metadata about the column. Fortunately the information is all aligned in the text file, so the same field starts at the same text position in each line:
Column | Start Position | Length |
---|---|---|
Name | 1 | 10 |
Description | 11 | 105 |
Units | 116 | 4 |
# Decimal Places | 120 | 7 |
Total | 127 | 12 |
Min | 139 | 12 |
Max | 151 | 12 |
Source | 163 | 8 |
We're going to consume the first two columns of this information in a JavaScript web application. The text file can easily be read in and split into lines. So with start position and length of Name and Description it will be easy to extract these and to populate a topics dropdown.
Framing the Map¶
We already saw our map visualized in a bare OpenLayers map frame in the Layer Preview section of GeoServer.
Sims 4 kill mod. The mod makes your SIM 'serial killer' in the world of Sims! In the game there will be new interactions, etc. Mod contains:-new custom animation (include: sounds, voices, effects, lip synchronization); -Multjashnuju blood when wounding with a knife; -Sim can kill anyone he wants and when he wants to, in addition to an old woman with a scythe; -Your SIM will enjoy killing other characters, but instead of grief and panic he joyfully respond; -This MOD does not require any additional packages.
We want an application that provides a user interface component that manipulates the source WMS URL, altering the URL viewparams parameter.
Opengeo Suite For Mac Osx
We'll build the app using Bootstrap for a straightforward layout with CSS, and OpenLayers as the map component.
The base HTML page, censusmap-simple.html, contains script and stylesheet includes bringing in our various libraries. A custom stylesheet gives us a fullscreen map with a legend overlay. Bootstrap css classes are used to style the navigation bar. Containers for the map and a header navigation bar with the aforementioned topics dropdown are also included, and an image element with the legend image from a WMS GetLegendGraphic request is put inside the map container.
The real code is in the censusmap-simple.js file. We start by creating an OpenStreetMap base layer, and adding our parameterized census layer on top as an image layer with a WMS Layer source.
We configure an OpenLayers Map, assign the layers, and give it a map view with a center and zoom level. Now the map will load.
The select element with the id topics will be our drop-down list of available columns. We load the DataDict.txt file, and fill the select element with its contents. This is done by adding an option child for each line.
Finally, we add an onchange event handler for the dropdown, which updates the layer with WMS parameters for the selected variable when a new topic/layer is selected.
Look at the the censusmap-simple.js file to see the whole application in one page.
When we open the censusmap-simple.html file, we see the application in action.
Bonus Task¶
With some additional markup and css plus a few more lines of JavaScript code, we can even handle map clicks: When clicking on the map, we send a WMS GetFeatureInfo request, and display the result in a popup.
Most of the following markup, css and JavaScript code comes directly from the OpenLayers Popup Example. The only difference is that we use ol.Map#getFeatureInfo() instead of just displaying the clicked coordinates.
First we need some markup for the popup, which we add to our HTML page, inside the map div. With popup added, the map div looks like this:
To style the popup, we need some additional css in the existing </span></tt> block on our HTML page:</p><p>Finally, we need some JavaScript to add behaviour to the popup's close button, to create an <tt><span>ol.Overlay</span></tt> so the popup is anchored to the map, and to trigger a GetFeatureInfo request when the map is clicked:</p><p>We've built an application for browsing 51 different census variables, using less than 51 lines of JavaScript application code, and demonstrating:</p><ul><li>SQL views provide a powerful means of manipulating data on the fly.</li><li>Standard deviations make for attractive visualization breaks.</li><li>Professionally generated color palettes are better than programmer generated ones.</li><li>Simple OpenLayers applications are easy to build.</li><li>Census data can be really, really interesting!</li><li>The applicatin is easy to extend. With 20 more lines of code we can handle clicks and display feature information.</li></ul><h4>Table Of Contents</h4>
For example, this SQL definition will allow us to substitute any column we want into the map rendering chain:
The query joins the census table data to the counties spatial table, and includes a data column, that is dynamically filled in by the %column% variable.
One Style to Rule them All¶
Viewing our data via a parametric SQL view doesn't quite get us over the goal line though, because we still need to create a thematic style for the data, and the data in our 51 columns have vastly different ranges and distributions:
- some are percentages
- some are absolute population counts
- some are medians or averages of absolutes
We need to somehow get all this different data onto one scale, preferably one that provides for easy visual comparisons between variables.
The answer is to use the average and standard deviation of the data to normalize it to a standard scale.
For example:
- For data set D, suppose the avg(D) is 10 and the stddev(D) is 5.
- What will the average and standard deviation of (D - 10) / 5 be?
- The average will be 0 and the standard deviation will be 1.
Let's try it on our own census data.
So we can easily convert any of our data into a scale that centers on 0 and where one standard deviation equals one unit just by normalizing the data with the average and standard deviation!
Our new parametric SQL view will look like this:
The query first calculates the overall statistics for the column, then applies those stats to the data in the join query, serving up a normalized view of the data.
With our data normalized, we are ready to create one style to rule them all!
Our style will have two colors, one to indicate counties 'above average' and the other for 'below average'
Within those two colors it will have 3 shades, for a total of 6 bins in all
In order to divide up the population more or less evenly, the bins will be
- (#c51b7d) -1.0 and down (very below average)
- (#e9a3c9) -1.0 to -0.5 (below average)
- (#fde0ef) -0.5 to 0.0 (a little below average)
- (#e6f5d0) 0.0 to 0.5 (a little above average)
- (#a1d76a) 0.5 to 1.0 (above average)
- (#4d9221) 1.0 and up (very above average)
The colors above weren't chosen randomly! I always use the ColorBrewer site when building themes, because ColorBrewer provides palettes that have been tested for maximum readability and to some extent aesthetic quality. Here's the palette I chose:
Configure a new style in GeoServer by going to the Styles section, and selecting Add a new style.
Set the style name to stddev
Set the style workspace to opengeo
Paste in the style definition (below) for stddev.xml and hit the Save button at the bottom
Opengeo Suite For Mac Catalina
Now we have a style, we just need to create a layer that uses it!
Creating a SQL View¶
First, we need a PostGIS store that connects to our database
- Go to the Stores section of GeoServer and Add a new store
- Select a PostGIS store
- Set the workspace to opengeo
- Set the datasource name to census
- Set the database to census
- Set the user to postgres
- Set the password to postgres
- Save the store
You'll be taken immediately to the New Layer panel (how handy) where you should:
Click on Configure new SQL view..
Set the view name to normalized
Set the SQL statement to
Click the Guess parameters from SQL link in the 'SQL view parameters' section
Set the default value of the 'column' parameter to pst045212
Check the 'Guess geometry type and srid' box
Click the Refresh link in the 'Attributes' section
Select the fips column as the 'Identifier'
Click Save
You'll be taken immediately to the Edit Layer panel (how handy) where you should:
- In the Data tab
- Under 'Bounding Boxes' click Compute from data
- Under 'Bounding Boxes' click Compute from native bounds
- In the Publishing tab
- Set the Default Style to stddev
- In the Tile Caching tab
- Uncheck the 'Create a cached layer for this layer' entry
- Hit the Save button
That's it, the layer is ready!
- Go to the Layer Preview section
- For the 'opengeo:normalized' layer, click Go
We can change the column we're viewing by altering the column view parameter in the WMS request URL.
- Here is the default column:http://apps.opengeo.org/geoserver/opengeo/wms/reflect?layers=opengeo:normalized
- Here is the edu685211 column:http://apps.opengeo.org/geoserver/opengeo/wms/reflect?layers=opengeo:normalized&viewparams=column:edu685211
- Here is the rhi425212 column:http://apps.opengeo.org/geoserver/opengeo/wms/reflect?layers=opengeo:normalized&viewparams=column:rhi425212
The column names that the census uses are pretty opaque aren't they? What we need is a web app that lets us see nice human readable column information, and also lets us change the column we're viewing on the fly.
Preparing the Metadata¶
The first thing we need for our app is a data file that maps the short, meaningless column names in our census table to human readable information. Fortunately, the DataDict.txt file we downloaded earlier has all the information we need. Here's a couple example lines:
Each line has the column name, a human readable description, and some other metadata about the column. Fortunately the information is all aligned in the text file, so the same field starts at the same text position in each line:
Column | Start Position | Length |
---|---|---|
Name | 1 | 10 |
Description | 11 | 105 |
Units | 116 | 4 |
# Decimal Places | 120 | 7 |
Total | 127 | 12 |
Min | 139 | 12 |
Max | 151 | 12 |
Source | 163 | 8 |
We're going to consume the first two columns of this information in a JavaScript web application. The text file can easily be read in and split into lines. So with start position and length of Name and Description it will be easy to extract these and to populate a topics dropdown.
Framing the Map¶
We already saw our map visualized in a bare OpenLayers map frame in the Layer Preview section of GeoServer.
Sims 4 kill mod. The mod makes your SIM 'serial killer' in the world of Sims! In the game there will be new interactions, etc. Mod contains:-new custom animation (include: sounds, voices, effects, lip synchronization); -Multjashnuju blood when wounding with a knife; -Sim can kill anyone he wants and when he wants to, in addition to an old woman with a scythe; -Your SIM will enjoy killing other characters, but instead of grief and panic he joyfully respond; -This MOD does not require any additional packages.
We want an application that provides a user interface component that manipulates the source WMS URL, altering the URL viewparams parameter.
Opengeo Suite For Mac Osx
We'll build the app using Bootstrap for a straightforward layout with CSS, and OpenLayers as the map component.
The base HTML page, censusmap-simple.html, contains script and stylesheet includes bringing in our various libraries. A custom stylesheet gives us a fullscreen map with a legend overlay. Bootstrap css classes are used to style the navigation bar. Containers for the map and a header navigation bar with the aforementioned topics dropdown are also included, and an image element with the legend image from a WMS GetLegendGraphic request is put inside the map container.
The real code is in the censusmap-simple.js file. We start by creating an OpenStreetMap base layer, and adding our parameterized census layer on top as an image layer with a WMS Layer source.
We configure an OpenLayers Map, assign the layers, and give it a map view with a center and zoom level. Now the map will load.
The select element with the id topics will be our drop-down list of available columns. We load the DataDict.txt file, and fill the select element with its contents. This is done by adding an option child for each line.
Finally, we add an onchange event handler for the dropdown, which updates the layer with WMS parameters for the selected variable when a new topic/layer is selected.
Look at the the censusmap-simple.js file to see the whole application in one page.
When we open the censusmap-simple.html file, we see the application in action.
Bonus Task¶
With some additional markup and css plus a few more lines of JavaScript code, we can even handle map clicks: When clicking on the map, we send a WMS GetFeatureInfo request, and display the result in a popup.
Most of the following markup, css and JavaScript code comes directly from the OpenLayers Popup Example. The only difference is that we use ol.Map#getFeatureInfo() instead of just displaying the clicked coordinates.
First we need some markup for the popup, which we add to our HTML page, inside the map div. With popup added, the map div looks like this:
To style the popup, we need some additional css in the existing </span></tt> block on our HTML page:</p><p>Finally, we need some JavaScript to add behaviour to the popup's close button, to create an <tt><span>ol.Overlay</span></tt> so the popup is anchored to the map, and to trigger a GetFeatureInfo request when the map is clicked:</p><p>We've built an application for browsing 51 different census variables, using less than 51 lines of JavaScript application code, and demonstrating:</p><ul><li>SQL views provide a powerful means of manipulating data on the fly.</li><li>Standard deviations make for attractive visualization breaks.</li><li>Professionally generated color palettes are better than programmer generated ones.</li><li>Simple OpenLayers applications are easy to build.</li><li>Census data can be really, really interesting!</li><li>The applicatin is easy to extend. With 20 more lines of code we can handle clicks and display feature information.</li></ul><h4>Table Of Contents</h4><img src='https://monde-geospatial.com/wp-content/uploads/2014/12/Screen-Shot-2014-10-14-at-10.10.07-481x230.png' alt='Opengeo Suite For Mac' title='Opengeo Suite For Mac'><ul><li>Getting the Data</li><li>Loading the Data</li><li>Drawing the Map</li><li>Building the App</li></ul><h4>About Boundless</h4><p>Boundless provides commercial open source software for internet mapping and geospatial application development. We are dedicated to the growth and support of open source software.</p><h4>License</h4><p>This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License. Feel free to use this material, but we ask that you please retain the Boundless branding, logos and style.</p><br><br><br><br>