14 | {% endmacro %}
15 |
16 | {#
17 |
18 | Stashed: Card with image on left
19 |
20 |
21 |
22 |
23 |
Lorem Ipsum
24 |
Lorem ipsum, dolor sit amet consectetur adipisicing elit. Pariatur veritatis nihil quibusdam quam, vel sint earum temporibus doloremque necessitatibus dolorem repellat unde repellendus aperiam non labore reprehenderit rerum commodi quaerat.
Lorem ipsum dolor sit amet consectetur, adipisicing elit. Dicta voluptas dolorem magnam repellat ipsum libero odio, praesentium asperiores in rerum nisi quam ex, tenetur incidunt eveniet similique, iusto alias est!
Icons & SVGs are included inline and can therfore be affected/animated with CSS or Javascript. Their "fill" property will inherit the parent text color by default.
This is body-2xl text lorem ipsum dolor sit amet consectetur adipisicing elit. Ea, odio, natus quae quasi nisi voluptatum quas excepturi nobis.
23 |
This is body-xl text lorem ipsum dolor sit amet consectetur adipisicing elit. Ea, odio, natus quae quasi nisi voluptatum quas excepturi nobis temporibus commodi voluptas sequi tempore in perferendis. Aspernatur dolor porro nostrum eum.
24 |
This is body-lg text lorem ipsum dolor sit amet consectetur adipisicing elit. Ea, odio, natus quae quasi nisi voluptatum quas excepturi nobis temporibus commodi voluptas sequi tempore in perferendis. Aspernatur dolor porro nostrum eum.
25 |
This is regular body text lorem ipsum dolor sit amet consectetur adipisicing elit. Ea, odio, natus quae quasi nisi voluptatum quas excepturi nobis temporibus commodi voluptas sequi tempore in perferendis. Aspernatur dolor porro nostrum eum.
26 |
This is body-sm text lorem ipsum dolor sit amet consectetur adipisicing elit. Ea, odio, natus quae quasi nisi voluptatum quas excepturi nobis temporibus commodi voluptas sequi tempore in perferendis. Aspernatur dolor porro nostrum eum.
31 |
32 | {%- endcall -%}
33 |
--------------------------------------------------------------------------------
/app/tutorials/how-to-guides/access-sentinel-2-data-aws/access-sentinel-2-data-aws.en.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Access Sentinel 2 Data from AWS
3 | description: How to Access Sentinel 2 data from AWS
4 | canonical: https://odc-stac.readthedocs.io/en/latest/notebooks/stac-load-e84-aws.html
5 | notebooks:
6 | - stac-load-e84-aws
7 | ---
8 |
--------------------------------------------------------------------------------
/app/tutorials/how-to-guides/reading-stac-planetary-computer/reading-stac-planetary-computer.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Reading Landsat Data from Microsoft
3 | description: This example shows how to read STAC data from Microsoft's Landsat Collection 2 Level-2 dataset.
4 | canonical: https://planetarycomputer.microsoft.com/docs/quickstarts/reading-stac/
5 | notebooks:
6 | - planetary-computer-reading-stac
7 | ---
8 |
--------------------------------------------------------------------------------
/app/tutorials/python/1-read-stac-python/1-read-stac-python.en.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Read a STAC Catalog Using PySTAC
3 | description: How to Read a STAC Catalog Using PySTAC
4 | notebooks:
5 | - 1-read-stac-python
6 | ---
--------------------------------------------------------------------------------
/app/tutorials/python/2-create-stac-catalog-python/2-create-stac-catalog-python.en.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Create a Basic STAC Catalog Using PySTAC
3 | description: How to Create a STAC Catalog Using PySTAC
4 | notebooks:
5 | - 2-create-stac-catalog-python
6 | ---
--------------------------------------------------------------------------------
/app/tutorials/python/3-create-stac-item-with-extension/3-create-stac-item-with-extension.en.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Create a STAC Item that Implements the EO Extension Using PySTAC
3 | description: How to Create a STAC Item that Implements the EO Extension Using PySTAC
4 | notebooks:
5 | - 3-create-stac-item-with-extension
6 | ---
--------------------------------------------------------------------------------
/app/tutorials/python/4-create-stac-collection/4-create-stac-collection.en.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Create a STAC Catalog with a Collection Using PySTAC
3 | description: How to Create a STAC Catalog with a Collection Using PySTAC
4 | notebooks:
5 | - 4-create-stac-collection
6 | ---
--------------------------------------------------------------------------------
/app/tutorials/qgis/1-install-stac-api-browser-qgis-plugin/1-install-stac-api-browser-qgis-plugin.en.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Install the QGIS STAC API Browser Plugin
3 | description: How to Install the QGIS STAC API Browser Plugin
4 | ---
5 |
6 | # Install the QGIS STAC API Browser Plugin
7 |
8 | In this introduction tutorial, you will learn how to install the STAC plugin into [QGIS](https://qgis.org/en/site/). This and the following tutorial are adapted from the [QGIS STAC API Browser site](https://stac-utils.github.io/qgis-stac-plugin/).
9 |
10 | To install the plugin, you will launch the QGIS application and open the Plugin Manager. You can access the Plugin Manager by nagivating from the QGIS Toolbar > **Plugins** tab > **Manage and Install Plugins**.
11 |
12 | 
13 | _QGIS Plugin Manager from Navigation Bar._
14 |
15 | ## Primary Download Method: QGIS Plugin Repository
16 |
17 | The plugin is available in the QGIS Official Plugin Repository.
18 |
19 | 1. Search for **STAC API Browser** in the **All** section of the Plugin Manager.
20 | 2. Click on the **STAC API Browser** result. A description page of the plugin will then show up.
21 | 3. Click the **Install Plugin** button at the bottom of the dialog box to install the plugin.
22 |
23 | 
24 | _Plugin Manager search result of the QGIS STAC API Browser Plugin._
25 |
26 |
27 |
28 | If you are simply looking for the standard plugin download, you can stop this tutorial here. If you are needing to download a past or future version of the plugin for a specific use case, continue on to see the pre-release download methods.
29 |
30 |
31 | ## Alternative Download Methods
32 |
33 | The following two download methods are for obtaining pre-release or deprecated versions of the STAC API Browser.
34 |
35 | These installation methods could be preferred if there is a pre-released version of the STAC QGIS plugin that you would like to use that is not yet available in the official QGIS Plugin Repository.
36 |
37 | It is important to note that _QGIS does not recommend installing deprecated plugins unless there are no alternatives available_.
38 |
39 | ### Install from a ZIP file
40 |
41 | 1. Visit [https://github.com/stac-utils/qgis-stac-plugin/releases](https://github.com/stac-utils/qgis-stac-plugin/releases) and select the desired version of the plugin.
42 |
43 | 2. Download your selected release ZIP file.
44 |
45 | 3. From the **Install from ZIP** page in the QGIS plugin manager, add the downloaded ZIP file.
46 |
47 | 4. Click the **Install Plugin** button.
48 |
49 | 
50 | _Installing plugin from a ZIP file._
51 |
52 | ### Install from the Creation of a Custom Plugin Repository
53 |
54 | The **STAC API Browser** plugin is also available through a custom plugin repository. This method is comparable to the ZIP file installation method, but can only be used for downloading pre-release versions of the plugin (and not deprecated plugin versions).
55 |
56 | 1. Navigate to the **Settings** section of the Plugin Manager.
57 |
58 | 2. Check the **Show also experimental plugins** box.
59 | - The plugin versions available through the custom repository may be flagged experimental because they might contain plugin versions that have not yet been approved by QGIS for official use.
60 |
61 | 3. Click the **Add** button in the **Plugin Repositories** box.
62 |
63 | 4. Select a name for the plugin (e.g. "Custom STAC Plugin Repository").
64 |
65 | 5. In the URL section, use [https://stac-utils.github.io/qgis-stac-plugin/repository/plugins.xml](https://stac-utils.github.io/qgis-stac-plugin/repository/plugins.xml) to create a new plugin repository.
66 |
67 | 
68 | _Adding a custom QGIS plugin repository._
69 |
70 | 6. Click **OK** to add the custom plugin repository.
71 |
72 | Now that you have installed the STAC API Browser plugin, check out the [next tutorial](/en/tutorials/2-intro-to-stac-api-browser-qgis-plugin/index.html) to learn how to search and get data for your QGIS project using the plugin.
73 |
74 | #### Join the conversation
75 |
76 | If you have any questions or run into any issues, you’re welcome to reach out to our community on [CNG Discourse](https://cng.discourse.group/c/stac/15).
77 |
--------------------------------------------------------------------------------
/app/tutorials/tutorials.json:
--------------------------------------------------------------------------------
1 | {
2 | "tags": [ "tutorial" ],
3 | "layout": "tuts",
4 | "container": true,
5 | "eleventyComputed": {
6 | "permalink": "{{ page.fileSlug | tutorialLocaleFromSlug }}/tutorials/{{ page.fileSlug | noExt }}/",
7 | "tutorialId": "{{ page.filePathStem | tutorialIdFromPath }}",
8 | "categoryTree": "{{ page.filePathStem | categoryTreeFromPath }}",
9 | "categorySlug": "{{ page.filePathStem | categorySlugFromPath }}",
10 | "categoryName": "{{ page.filePathStem | categoryNameFromPath }}",
11 | "locale": "{{ page.fileSlug | tutorialLocaleFromSlug }}"
12 | }
13 | }
--------------------------------------------------------------------------------
/assets/css/app.css:
--------------------------------------------------------------------------------
1 | @import 'tailwindcss/base';
2 | @import 'tailwindcss/components';
3 | @import 'vendor/code-highlight-theme.css';
4 | @import 'vendor/jupyter-theme.css';
5 |
6 | @import 'base';
7 | @import 'type';
8 | @import 'elements';
9 | @import 'components';
10 | @import 'sections';
11 | @import 'sections/nav.css';
12 | @import 'sections/hero.css';
13 |
14 | @import 'pages/styleguide.css';
15 | @import 'pages/tutorials.css';
16 |
17 | @import 'tailwindcss/utilities';
18 |
19 | .container {
20 | @apply max-w-4xl mx-auto px-4;
21 | }
22 |
23 | .container--wide {
24 | @apply mx-auto px-4;
25 | max-width: 1280px;
26 | }
27 |
28 | .container--full {
29 | @apply max-w-none mx-auto px-0;
30 | }
31 |
32 | /* theme overrides */
33 |
34 | :not(pre) > code[class*="language-"], pre[class*="language-"] {
35 | @apply bg-blue-900;
36 | }
--------------------------------------------------------------------------------
/assets/css/base.css:
--------------------------------------------------------------------------------
1 | @layer base {
2 | .spacing-none { @apply my-0; }
3 | .spacing-tight { @apply mt-3 mb-2; }
4 | .spacing-snug { @apply mt-4 mb-3; }
5 | .spacing-normal { @apply mt-5 mb-4; }
6 | .spacing-relaxed { @apply mt-6 mb-5; }
7 | .spacing-loose { @apply mt-7 mb-6; }
8 |
9 | .row {
10 | @apply -mx-3 flex;
11 | }
12 | }
13 |
14 | body {
15 | @apply bg-white text-black;
16 | }
17 |
18 | [x-cloak] { display: none !important; }
19 |
--------------------------------------------------------------------------------
/assets/css/components.css:
--------------------------------------------------------------------------------
1 | @layer components {
2 | .card {
3 | @apply shadow-card rounded-lg mt-5 mb-6 relative;
4 | }
5 |
6 | .card-body {
7 | @apply py-3 px-4 sm:px-6;
8 | }
9 |
10 | .callout {
11 | @apply px-4 sm:px-6 py-4 my-5;
12 | border-left-width: 1rem;
13 | }
14 |
15 | .icon-callout {
16 | @apply flex spacing-normal border-none flex-col md:flex-row;
17 | align-items: top;
18 | }
19 |
20 | .alert {
21 | @apply pl-6 pr-4 py-3 mt-6 mb-5;
22 | border-left-width: 1rem;
23 | }
24 | }
25 |
26 | .alert-info {
27 | @apply alert border-info bg-info-light;
28 | }
29 |
30 | .alert-success {
31 | @apply alert border-success bg-success-light;
32 | }
33 |
34 | .alert-warning {
35 | @apply alert border-warning bg-warning-light;
36 | }
37 |
38 | .alert-danger {
39 | @apply alert border-danger bg-danger-light;
40 | }
41 |
42 | .card--light { @apply bg-blue-100; }
43 | .card--blue { @apply bg-blue text-white; }
44 | .card--blue-700 { @apply bg-blue-700 text-white; }
45 | .card--dark { @apply bg-blue-dark text-white; }
46 | .card--black { @apply bg-black text-white; }
47 | .card--center { @apply text-center; }
48 | .card--left { @apply text-left; }
49 |
50 | .card-image {
51 | @apply w-full;
52 | }
53 |
54 | .card-image-left {
55 | @apply -ml-6 -my-3 mr-3 w-full;
56 | }
57 |
58 | .callout--light { @apply border-blue-light; }
59 | .callout--blue { @apply border-blue bg-blue-100; }
60 | .callout--black { @apply border-black; }
61 | .callout--dark { @apply border-blue-dark; }
62 |
63 | .callout--info,
64 | .icon-callout--info { @apply bg-info-light border-info; }
65 |
66 | .callout--warning,
67 | .icon-callout--warning { @apply bg-warning-light border-warning; }
68 |
69 | .callout--danger,
70 | .icon-callout--danger { @apply bg-danger-light border-danger; }
--------------------------------------------------------------------------------
/assets/css/elements.css:
--------------------------------------------------------------------------------
1 | @layer components {
2 | .cta {
3 | @apply inline-block py-2 font-display font-medium spacing-normal;
4 | }
5 |
6 | .button {
7 | @apply px-4 shadow-button rounded-sm border-2 font-medium;
8 | }
9 |
10 | .field {
11 | @apply bg-white w-full py-2 px-4 font-medium rounded-sm border border-2 border-gray
12 | focus:outline-none focus:border-black;
13 | }
14 |
15 | .field::placeholder {
16 | @apply text-gray;
17 | }
18 |
19 | .caption {
20 | @apply font-display my-3;
21 | }
22 | }
23 |
24 | a {
25 | @apply text-green font-bold;
26 | }
27 |
28 | label {
29 | @apply font-display;
30 | }
31 |
32 | .caption-xl {
33 | @apply caption text-xl;
34 | }
35 |
36 | .caption-lg {
37 | @apply caption text-lg;
38 | }
39 |
40 | .cta--primary,
41 | .cta-primary { @apply cta button bg-green text-white border-green; }
42 |
43 | .cta--secondary,
44 | .cta-secondary { @apply cta button text-green border-green; }
45 |
46 | .cta--understated,
47 | .cta-understated { @apply cta text-green border-b-2 border-green mt-0; }
48 |
49 | .cta--understated-alt,
50 | .cta-understated-alt { @apply cta text-blue-100 border-b-2 border-green mt-0 font-bold; }
51 |
52 | .cta--lg,
53 | .cta-lg { @apply cta text-lg py-2 px-5; }
54 |
55 |
56 | code {
57 | @apply mx-2;
58 | }
59 |
60 | pre[class^="language-"] {
61 | @apply mt-6 mb-8;
62 | }
63 |
64 | table {
65 | @apply w-full;
66 | overflow-x: auto;
67 | }
68 |
69 | @media (max-width: theme('screens.md')) {
70 | table {
71 | display: block;
72 | }
73 | }
74 |
75 | th {
76 | @apply py-2 px-4 text-left;
77 | }
78 |
79 | td {
80 | @apply py-2 sm:px-4 text-left;
81 | border-top: 1px solid theme('colors.gray.light');
82 | min-width: 125px;
83 | }
84 |
85 | iframe {
86 | max-width: 100%;
87 | }
--------------------------------------------------------------------------------
/assets/css/pages/styleguide.css:
--------------------------------------------------------------------------------
1 | .styleguide-color {
2 | @apply h-16 w-full my-3 mr-4 p-4 flex items-center font-bold;
3 | }
4 |
5 | .styleguide-nav-link { @apply text-blue inline-block pb-1 pt-4 px-2 mr-2 font-medium border-transparent;
6 | border-bottom-width: 3px;
7 | }
8 |
9 | .styleguide-nav-link--active { @apply border-blue-400; }
--------------------------------------------------------------------------------
/assets/css/pages/tutorials.css:
--------------------------------------------------------------------------------
1 | .tutorials-article {
2 | @apply pt-10 pb-12 bg-white shadow-lg w-full rounded-l-lg relative;
3 | }
4 |
5 | .tutorials-article::after {
6 | @apply absolute w-20 h-20 bg-blue;
7 | content: '';
8 | bottom: 0;
9 | left: 0;
10 | z-index: -1;
11 | }
12 |
13 | .tutorials-sidebar {
14 | @apply bg-blue-100;
15 | flex-basis: 300px;
16 | flex-shrink: 0;
17 | flex-grow: 0;
18 | }
19 |
20 | .tutorials-sidebar__category-heading {
21 | @apply text-base my-2;
22 | cursor: pointer;
23 | }
24 |
25 | .tutorials-sidebar__category-heading__text {
26 | @apply text-blue-50 inline-block rounded-lg px-2 py-0 -mx-2;
27 | }
28 |
29 | .tutorials-sidebar__category-heading:hover .tutorials-sidebar__category-heading__text {
30 | @apply bg-blue-500;
31 | }
32 |
33 | .tutorials-sidebar__tutorial-item {
34 | @apply list-none py-1;
35 | }
36 |
37 | .tutorials-sidebar__tutorial-link {
38 | @apply font-sans font-light leading-snug text-blue-50;
39 | border-bottom: 2px solid theme('colors.blue.500');
40 | }
41 |
42 | .tutorials-nav__category-icon {
43 | @apply ml-3 inline-block relative;
44 | top: -3px;
45 | transition: all 0.3s;
46 | }
47 |
48 | .tutorials-nav__category-icon--active {
49 | transform: rotateZ(-180deg) translateY(-6px);
50 | }
51 |
--------------------------------------------------------------------------------
/assets/css/sections.css:
--------------------------------------------------------------------------------
1 | .section { @apply py-5; }
2 |
3 | .section--text-white { @apply text-white; }
4 | .section--text-dark { @apply text-blue-dark; }
5 | .section--center { @apply text-center; }
6 | .section--tall { @apply py-12; }
7 | .section--dark { @apply bg-blue-dark text-white; }
8 | .section--blue { @apply bg-blue text-white; }
9 | .section--light { @apply bg-blue-light; }
10 |
11 | /* Gist */
12 |
13 | body .gist .gist-meta a {
14 | @apply text-blue-dark;
15 | }
16 |
17 | body .gist .gist-meta {
18 | background: #fff;
19 | @apply text-blue-dark border-0;
20 | }
21 |
22 | .site-footer {
23 | @apply pt-3 text-white bg-blue text-left;
24 | }
25 |
26 | .site-footer__additional a {
27 | @apply text-blue-100;
28 | border-bottom: 2px solid theme('colors.blue.500');
29 | }
--------------------------------------------------------------------------------
/assets/css/sections/hero.css:
--------------------------------------------------------------------------------
1 | /* Hero Style 1 */
2 |
3 | .hero-style-1 {
4 | @apply pb-5 relative;
5 | padding-top: 200px;
6 | }
7 |
8 | .hero-style-1__card {
9 | @apply card bg-white relative px-10 py-6;
10 | z-index: 2;
11 | }
12 |
13 | .hero-style-1--dark .hero-style-1__card {
14 | @apply bg-blue-dark text-white;
15 | }
16 |
17 | .hero-style-1__backdrop {
18 | @apply absolute w-full left-0 top-0 right-0 bg-center bg-cover;
19 | bottom: 100px;
20 | }
21 |
22 | /* Hero Style 2 */
23 |
24 | .hero-style-2 {
25 | @apply md:flex;
26 | }
27 |
28 | .hero-style-2__image {
29 | background-position: center;
30 | background-size: cover;
31 | min-height: 200px;
32 |
33 | }
34 |
35 | .hero-style-2--dark {
36 | @apply bg-blue-dark text-white;
37 | }
38 |
39 | .hero-style-2--reverse {
40 | @apply flex-row-reverse;
41 | }
42 |
43 | /* Hero Style 3 */
44 |
45 | .hero-style-3 {
46 | @apply pt-5 pb-8 bg-blue-100;
47 | box-shadow: inset 2px -5px 14px -10px rgba(0,0,0,0.25);
48 | }
49 |
50 | .hero-style-3__content {
51 | @apply text-center p-8 md:p-12 relative;
52 | }
53 |
54 | .hero-style-3__heading {
55 | @apply text-4xl font-bold;
56 | }
57 |
58 | .hero-style-3__description {
59 | @apply my-6 text-lg;
60 | }
61 |
62 | .hero-style-3--center {
63 | @apply text-center;
64 | }
65 |
66 | .hero-style-3--overlap {
67 | padding-bottom: 115px;
68 | margin-bottom: -115px;
69 | }
70 |
71 | .hero-style-3--overlap-lg {
72 | padding-bottom: 150px;
73 | margin-bottom: -150px;
74 | }
75 |
76 | .hero-style-3--overlap-xl {
77 | padding-bottom: 200px;
78 | margin-bottom: -200px;
79 | }
80 |
81 | .hero-style-3--overlap-2xl {
82 | padding-bottom: 260px;
83 | margin-bottom: -260px;
84 | }
85 |
86 | .hero-style-3--light {
87 | @apply bg-blue-100;
88 | }
89 |
90 | .hero-style-3--dark {
91 | @apply bg-blue-dark text-white;
92 | }
93 |
94 | .hero-style-3--gradient {
95 | background: linear-gradient(
96 | 180deg,
97 | theme('colors.blue.800') 0%,
98 | theme('colors.green') 300%
99 | );
100 | }
--------------------------------------------------------------------------------
/assets/css/sections/nav.css:
--------------------------------------------------------------------------------
1 | .topbar {
2 | @apply bg-blue-100 pt-2 px-3 relative;
3 | z-index: 4;
4 | }
5 |
6 | .topbar .container {
7 | @apply relative;
8 | z-index: 2;
9 | }
10 |
11 | .navbar {
12 | @apply bg-blue-100 relative;
13 | z-index: 3;
14 | }
15 |
16 | .navbar::before,
17 | .topbar::before {
18 | content: '';
19 | @apply absolute top-0 bottom-0 right-0 left-0 bg-blue-100;
20 | }
21 |
22 | .navbar__main {
23 | @apply items-start justify-start flex font-display w-full;
24 | z-index: 1;
25 | }
26 |
27 | .navbar__home {
28 | @apply font-normal justify-self-start text-3xl text-white mr-5;
29 | z-index: 3;
30 | }
31 |
32 | .navbar__drawer {
33 | @apply bg-blue-100;
34 | }
35 |
36 | .navbar__actions {
37 | @apply pt-10 ml-auto;
38 | z-index: 3;
39 | }
40 |
41 | .navbar__toggle-button {
42 | @apply p-3;
43 | }
44 |
45 | .navbar__submenu {
46 | @apply p-0 m-0 md:absolute bg-blue rounded md:shadow-card;
47 | z-index: 3;
48 | min-width: 220px;
49 | }
50 |
51 | .navbar__dropdown-icon {
52 | @apply inline-block ml-2 relative;
53 | top: -3px;
54 | transition: all 0.3s;
55 | }
56 |
57 | .navbar__dropdown-icon--active {
58 | transform: rotateZ(-180deg) translateY(-6px);
59 | }
60 |
61 | .navbar__submenu__item {
62 | @apply list-none;
63 | border-bottom: 1px solid theme('colors.blue.500');
64 | }
65 |
66 | .navbar__submenu__item:last-child {
67 | border-bottom: none;
68 | }
69 |
70 | .navbar__submenu__link {
71 | @apply block w-full text-blue-100 px-3 py-2;
72 | }
73 |
74 | .navbar__submenu__link span {
75 | @apply rounded-lg inline-block px-2 py-0;
76 | }
77 |
78 | .navbar__submenu__link:hover span {
79 | @apply text-blue-50 bg-blue-400
80 | }
81 |
82 | .navbar__submenu__item:first-child {
83 | @apply pt-3;
84 | }
85 |
86 | .navbar__submenu__item:last-child {
87 | @apply pb-3;
88 | }
89 |
90 | @media (max-width: theme('screens.md')) {
91 | .navbar__drawer {
92 | @apply absolute pb-10 shadow-card;
93 | top: -100vh;
94 | z-index: -1;
95 | left: 0;
96 | right: 0;
97 | transition: all 0.25s;
98 | }
99 |
100 | .navbar__drawer--active {
101 | top: 100px;
102 | }
103 | }
104 | .navbar__items {
105 | @apply m-0 px-5;
106 | }
107 |
108 | .navbar__item {
109 | @apply list-none relative md:inline-block;
110 | }
111 |
112 | .navbar__link {
113 | @apply text-xl text-blue-dark inline-block rounded-lg mt-4 md:mt-11 mb-4 md:mx-1 px-3 pt-1 pb-1 font-bold;
114 | border-bottom: 3px solid transparent;
115 | }
116 |
117 | .navbar__link:hover {
118 | @apply bg-blue-200;
119 | }
120 |
--------------------------------------------------------------------------------
/assets/css/type.css:
--------------------------------------------------------------------------------
1 | body, html {
2 | font-size: 16px;
3 | @apply font-sans;
4 | }
5 |
6 | @media (min-width: theme('screens.sm')) {
7 | body, html { font-size: 16.5px; }
8 | }
9 |
10 | @media (min-width: theme('screens.md')) {
11 | body, html { font-size: 17.5px; }
12 | }
13 |
14 | h1, h2, h3, h4 {
15 | @apply font-display;
16 | }
17 |
18 | h1 { @apply text-4xl sm:text-5xl font-semibold spacing-loose; }
19 | h2 { @apply text-3xl font-medium mt-7 mb-5; }
20 | h3 { @apply text-2xl font-medium mt-6 mb-4; }
21 | h4 { @apply text-xl font-medium spacing-normal; }
22 |
23 | p, ul, ol {
24 | @apply spacing-normal;
25 | }
26 |
27 | ul {
28 | @apply pl-5 list-disc;
29 | }
30 |
31 | li ul {
32 | @apply my-0;
33 | }
34 |
35 | ol {
36 | @apply pl-5 list-decimal;
37 | }
38 |
39 |
40 |
41 | .font-select-button[data-font-active="true"] {
42 | @apply bg-blue text-white;
43 | }
--------------------------------------------------------------------------------
/assets/css/vendor/code-highlight-theme.css:
--------------------------------------------------------------------------------
1 | /** Material Oceanic */
2 |
3 | code[class*="language-"],
4 | pre[class*="language-"] {
5 | text-align: left;
6 | white-space: pre;
7 | word-spacing: normal;
8 | word-break: normal;
9 | word-wrap: normal;
10 | color: #c3cee3;
11 | font-family: Roboto Mono, monospace;
12 | font-size: 1em;
13 | line-height: 1.5em;
14 |
15 | -moz-tab-size: 4;
16 | -o-tab-size: 4;
17 | tab-size: 4;
18 |
19 | -webkit-hyphens: none;
20 | -moz-hyphens: none;
21 | -ms-hyphens: none;
22 | hyphens: none;
23 | }
24 |
25 | :not(pre) > code[class*="language-"] {
26 | white-space: normal;
27 | border-radius: 0.2em;
28 | padding: 0.1em;
29 | }
30 |
31 | pre[class*="language-"] {
32 | overflow: auto;
33 | position: relative;
34 | margin: 0.5em 0;
35 | padding: 1.25em 1em;
36 | }
37 |
38 | .language-css > code,
39 | .language-sass > code,
40 | .language-scss > code {
41 | color: #fd9170;
42 | }
43 |
44 | [class*="language-"] .namespace {
45 | opacity: 0.7;
46 | }
47 |
48 | .token.atrule {
49 | color: #c792ea;
50 | }
51 |
52 | .token.attr-name {
53 | color: #ffcb6b;
54 | }
55 |
56 | .token.attr-value {
57 | color: #c3e88d;
58 | }
59 |
60 | .token.attribute {
61 | color: #c3e88d;
62 | }
63 |
64 | .token.boolean {
65 | color: #c792ea;
66 | }
67 |
68 | .token.builtin {
69 | color: #ffcb6b;
70 | }
71 |
72 | .token.cdata {
73 | color: #80cbc4;
74 | }
75 |
76 | .token.char {
77 | color: #80cbc4;
78 | }
79 |
80 | .token.class {
81 | color: #ffcb6b;
82 | }
83 |
84 | .token.class-name {
85 | color: #f2ff00;
86 | }
87 |
88 | .token.color {
89 | color: #f2ff00;
90 | }
91 |
92 | .token.comment {
93 | color: #546e7a;
94 | }
95 |
96 | .token.constant {
97 | color: #c792ea;
98 | }
99 |
100 | .token.deleted {
101 | color: #f07178;
102 | }
103 |
104 | .token.doctype {
105 | color: #546e7a;
106 | }
107 |
108 | .token.entity {
109 | color: #f07178;
110 | }
111 |
112 | .token.function {
113 | color: #c792ea;
114 | }
115 |
116 | .token.hexcode {
117 | color: #f2ff00;
118 | }
119 |
120 | .token.id {
121 | color: #c792ea;
122 | font-weight: bold;
123 | }
124 |
125 | .token.important {
126 | color: #c792ea;
127 | font-weight: bold;
128 | }
129 |
130 | .token.inserted {
131 | color: #80cbc4;
132 | }
133 |
134 | .token.keyword {
135 | color: #c792ea;
136 | font-style: italic;
137 | }
138 |
139 | .token.number {
140 | color: #fd9170;
141 | }
142 |
143 | .token.operator {
144 | color: #89ddff;
145 | }
146 |
147 | .token.prolog {
148 | color: #546e7a;
149 | }
150 |
151 | .token.property {
152 | color: #80cbc4;
153 | }
154 |
155 | .token.pseudo-class {
156 | color: #c3e88d;
157 | }
158 |
159 | .token.pseudo-element {
160 | color: #c3e88d;
161 | }
162 |
163 | .token.punctuation {
164 | color: #89ddff;
165 | }
166 |
167 | .token.regex {
168 | color: #f2ff00;
169 | }
170 |
171 | .token.selector {
172 | color: #f07178;
173 | }
174 |
175 | .token.string {
176 | color: #c3e88d;
177 | }
178 |
179 | .token.symbol {
180 | color: #c792ea;
181 | }
182 |
183 | .token.tag {
184 | color: #f07178;
185 | }
186 |
187 | .token.unit {
188 | color: #f07178;
189 | }
190 |
191 | .token.url {
192 | color: #fd9170;
193 | }
194 |
195 | .token.variable {
196 | color: #f07178;
197 | }
198 |
199 | pre[class*="language-"], .jupyter-notebook .highlight {
200 | @apply -mx-4 sm:mx-0;
201 | }
--------------------------------------------------------------------------------
/assets/css/vendor/jupyter-theme.css:
--------------------------------------------------------------------------------
1 | .highlight .hll { background-color: #ffffcc }
2 | .highlight .hll { background-color: #404040 }
3 | .highlight { background: #202020; @apply text-white; }
4 | .highlight .c { color: #999999; font-style: italic } /* Comment */
5 | .highlight .err { color: @apply text-blue-light; background-color: #e3d2d2 } /* Error */
6 | .highlight .esc { color: #d0d0d0 } /* Escape */
7 | .highlight .g { color: #d0d0d0 } /* Generic */
8 | .highlight .k { @apply text-blue-light; font-weight: bold } /* Keyword */
9 | .highlight .l { @apply text-white; } /* Literal */
10 | .highlight .n { @apply text-white; } /* Name */
11 | .highlight .o { @apply text-white; } /* Operator */
12 | .highlight .x { @apply text-white; } /* Other */
13 | .highlight .p { @apply text-white; } /* Punctuation */
14 | .highlight .ch { color: #999999; font-style: italic } /* Comment.Hashbang */
15 | .highlight .cm { color: #999999; font-style: italic } /* Comment.Multiline */
16 | .highlight .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
17 | .highlight .cpf { color: #999999; font-style: italic } /* Comment.PreprocFile */
18 | .highlight .c1 { color: #999999; font-style: italic } /* Comment.Single */
19 | .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
20 | .highlight .gd { color: #d22323 } /* Generic.Deleted */
21 | .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
22 | .highlight .gr { color: #d22323 } /* Generic.Error */
23 | .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
24 | .highlight .gi { color: #589819 } /* Generic.Inserted */
25 | .highlight .go { color: #cccccc } /* Generic.Output */
26 | .highlight .gp { color: #aaaaaa } /* Generic.Prompt */
27 | .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
28 | .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
29 | .highlight .gt { color: #d22323 } /* Generic.Traceback */
30 | .highlight .kc { @apply text-blue-light; font-weight: bold } /* Keyword.Constant */
31 | .highlight .kd { @apply text-blue-light; font-weight: bold } /* Keyword.Declaration */
32 | .highlight .kn { @apply text-blue-light; font-weight: bold } /* Keyword.Namespace */
33 | .highlight .kp { @apply text-blue-light; } /* Keyword.Pseudo */
34 | .highlight .kr { @apply text-blue-light; font-weight: bold } /* Keyword.Reserved */
35 | .highlight .kt { @apply text-blue-light; font-weight: bold } /* Keyword.Type */
36 | .highlight .ld { color: #d0d0d0 } /* Literal.Date */
37 | .highlight .m { color: #3677a9 } /* Literal.Number */
38 | .highlight .s { @apply text-green; } /* Literal.String */
39 | .highlight .na { color: #bbbbbb } /* Name.Attribute */
40 | .highlight .nb { color: #24909d } /* Name.Builtin */
41 | .highlight .nc { color: #447fcf; text-decoration: underline } /* Name.Class */
42 | .highlight .no { color: #40ffff } /* Name.Constant */
43 | .highlight .nd { @apply text-green; } /* Name.Decorator */
44 | .highlight .ni { color: #d0d0d0 } /* Name.Entity */
45 | .highlight .ne { color: #bbbbbb } /* Name.Exception */
46 | .highlight .nf { color: #447fcf } /* Name.Function */
47 | .highlight .nl { color: #d0d0d0 } /* Name.Label */
48 | .highlight .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */
49 | .highlight .nx { color: #d0d0d0 } /* Name.Other */
50 | .highlight .py { color: #d0d0d0 } /* Name.Property */
51 | .highlight .nt { @apply text-blue-light; font-weight: bold } /* Name.Tag */
52 | .highlight .nv { color: #40ffff } /* Name.Variable */
53 | .highlight .ow { @apply text-blue-light; font-weight: bold } /* Operator.Word */
54 | .highlight .w { color: #666666 } /* Text.Whitespace */
55 | .highlight .mb { color: #3677a9 } /* Literal.Number.Bin */
56 | .highlight .mf { color: #3677a9 } /* Literal.Number.Float */
57 | .highlight .mh { color: #3677a9 } /* Literal.Number.Hex */
58 | .highlight .mi { color: #3677a9 } /* Literal.Number.Integer */
59 | .highlight .mo { color: #3677a9 } /* Literal.Number.Oct */
60 | .highlight .sa { @apply text-green; } /* Literal.String.Affix */
61 | .highlight .sb { @apply text-green; } /* Literal.String.Backtick */
62 | .highlight .sc { @apply text-green; } /* Literal.String.Char */
63 | .highlight .dl { @apply text-green; } /* Literal.String.Delimiter */
64 | .highlight .sd { @apply text-green; } /* Literal.String.Doc */
65 | .highlight .s2 { @apply text-green; } /* Literal.String.Double */
66 | .highlight .se { @apply text-green; } /* Literal.String.Escape */
67 | .highlight .sh { @apply text-green; } /* Literal.String.Heredoc */
68 | .highlight .si { @apply text-green; } /* Literal.String.Interpol */
69 | .highlight .sx { @apply text-green; } /* Literal.String.Other */
70 | .highlight .sr { @apply text-green; } /* Literal.String.Regex */
71 | .highlight .s1 { @apply text-green; } /* Literal.String.Single */
72 | .highlight .ss { @apply text-green; } /* Literal.String.Symbol */
73 | .highlight .bp { color: #24909d } /* Name.Builtin.Pseudo */
74 | .highlight .fm { color: #447fcf } /* Name.Function.Magic */
75 | .highlight .vc { color: #40ffff } /* Name.Variable.Class */
76 | .highlight .vg { color: #40ffff } /* Name.Variable.Global */
77 | .highlight .vi { color: #40ffff } /* Name.Variable.Instance */
78 | .highlight .vm { color: #40ffff } /* Name.Variable.Magic */
79 | .highlight .il { color: #3677a9 } /* Literal.Number.Integer.Long */
80 |
81 | .jupyter-notebook .cell {
82 | @apply block relative py-4;
83 | padding-right: 0px;
84 | overflow: hidden;
85 | @apply px-5 sm:px-8 md:px-12 lg:ml-5;
86 | }
87 |
88 | .cell .output_text pre {
89 | white-space: pre-wrap;
90 | }
91 |
92 | .cell .highlight {
93 | @apply bg-black text-white card px-5 py-4;
94 | white-space: nowrap;
95 | overflow-x: auto;
96 | }
97 |
98 | .cell .prompt {
99 | @apply absolute inline-block;
100 | left: 0px;
101 | }
102 |
103 | .jupyter-notebook .xr-var-list > li:nth-child(odd) > div,
104 | .jupyter-notebook .xr-var-list > li:nth-child(odd) > label,
105 | .jupyter-notebook .xr-var-list > li:nth-child(odd) > .xr-var-name span {
106 | @apply bg-blue-100;
107 | }
108 |
109 | .jupyter-notebook .xr-var-item > div,
110 | .jupyter-notebook .xr-var-item label,
111 | .jupyter-notebook .xr-var-item > .xr-var-name span {
112 | @apply bg-white;
113 | }
114 |
115 | .jupyter-notebook__meta {
116 | @apply bg-blue-100 px-5 rounded mt-5;
117 | }
118 |
119 | @media(min-width: theme('screens.lg')) {
120 | .jupyter-notebook .cell {
121 | padding-left: 70px;
122 | }
123 | .jupyter-notebook__meta {
124 | margin-left: 70px;
125 | }
126 | }
127 |
128 | @media(max-width: theme('screens.sm')) {
129 | .jupyter-notebook table {
130 | display: block;
131 | overflow-x: auto;
132 | }
133 | }
134 | .cell .prompt {
135 | @apply hidden lg:inline-block;
136 | }
--------------------------------------------------------------------------------
/assets/example-catalog/catalog.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "Catalog",
3 | "stac_version": "1.0.0",
4 | "stac_extensions": [],
5 | "id": "landsat-stac-collection-catalog",
6 | "title": "STAC for Landsat data",
7 | "description": "STAC for Landsat data",
8 | "links": [
9 | {
10 | "href": "./catalog.json",
11 | "rel": "self"
12 | },
13 | {
14 | "href": "./catalog.json",
15 | "rel": "root"
16 | },
17 | {
18 | "href": "./landsat-8-l1/collection.json",
19 | "rel": "child"
20 | }
21 | ]
22 | }
--------------------------------------------------------------------------------
/assets/example-catalog/landsat-8-l1/collection.json:
--------------------------------------------------------------------------------
1 | {
2 | "type": "Collection",
3 | "stac_version" : "1.0.0",
4 | "stac_extensions" : [
5 | "eo",
6 | "view",
7 | "https://example.com/stac/landsat-extension/1.0/schema.json"
8 | ],
9 | "id" : "landsat-8-l1",
10 | "title" : "Landsat 8 L1",
11 | "description" : "Landsat 8 imagery radiometrically calibrated and orthorectified using ground points and Digital Elevation Model (DEM) data to correct relief displacement.",
12 | "keywords" : [
13 | "landsat",
14 | "earth observation",
15 | "usgs"
16 | ],
17 | "license" : "proprietary",
18 | "providers" : [
19 | {
20 | "name" : "Development Seed",
21 | "roles" : [
22 | "processor"
23 | ],
24 | "url" : "https://github.com/sat-utils/sat-api"
25 | }
26 | ],
27 | "extent" : {
28 | "spatial" : {
29 | "bbox" : [
30 | [
31 | -180.0,
32 | -90.0,
33 | 180.0,
34 | 90.0
35 | ]
36 | ]
37 | },
38 | "temporal" : {
39 | "interval" : [
40 | [
41 | "2018-05-21T15:44:59Z",
42 | "2018-07-08T15:45:34Z"
43 | ]
44 | ]
45 | }
46 | },
47 | "summaries": {},
48 | "properties" : {
49 | "collection" : "landsat-8-l1",
50 | "instruments" : ["OLI_TIRS"],
51 | "view:sun_azimuth" : 149.01607154,
52 | "eo:bands" : [
53 | {
54 | "name" : "B1",
55 | "full_width_half_max" : 0.02,
56 | "center_wavelength" : 0.44,
57 | "common_name" : "coastal"
58 | },
59 | {
60 | "name" : "B2",
61 | "full_width_half_max" : 0.06,
62 | "center_wavelength" : 0.48,
63 | "common_name" : "blue"
64 | },
65 | {
66 | "name" : "B3",
67 | "full_width_half_max" : 0.06,
68 | "center_wavelength" : 0.56,
69 | "common_name" : "green"
70 | },
71 | {
72 | "name" : "B4",
73 | "full_width_half_max" : 0.04,
74 | "center_wavelength" : 0.65,
75 | "common_name" : "red"
76 | },
77 | {
78 | "name" : "B5",
79 | "full_width_half_max" : 0.03,
80 | "center_wavelength" : 0.86,
81 | "common_name" : "nir"
82 | },
83 | {
84 | "name" : "B6",
85 | "full_width_half_max" : 0.08,
86 | "center_wavelength" : 1.6,
87 | "common_name" : "swir16"
88 | },
89 | {
90 | "name" : "B7",
91 | "full_width_half_max" : 0.22,
92 | "center_wavelength" : 2.2,
93 | "common_name" : "swir22"
94 | },
95 | {
96 | "name" : "B8",
97 | "full_width_half_max" : 0.18,
98 | "center_wavelength" : 0.59,
99 | "common_name" : "pan"
100 | },
101 | {
102 | "name" : "B9",
103 | "full_width_half_max" : 0.02,
104 | "center_wavelength" : 1.37,
105 | "common_name" : "cirrus"
106 | },
107 | {
108 | "name" : "B10",
109 | "full_width_half_max" : 0.8,
110 | "center_wavelength" : 10.9,
111 | "common_name" : "lwir11"
112 | },
113 | {
114 | "name" : "B11",
115 | "full_width_half_max" : 1,
116 | "center_wavelength" : 12,
117 | "common_name" : "lwir2"
118 | }
119 | ],
120 | "view:off_nadir" : 0,
121 | "view:azimuth" : 0,
122 | "platform" : "landsat-8",
123 | "gsd" : 15,
124 | "view:sun_elevation" : 59.214247
125 | },
126 | "links" : [
127 | {
128 | "href" : "../catalog.json",
129 | "rel" : "root"
130 | },
131 | {
132 | "href" : "../catalog.json",
133 | "rel" : "parent"
134 | },
135 | {
136 | "href" : "./collection.json",
137 | "rel" : "self"
138 | },
139 | {
140 | "href" : "./2018-06/LC80140332018166LGN00.json",
141 | "rel" : "item"
142 | },
143 | {
144 | "href" : "./2018-05/LC80150322018141LGN00.json",
145 | "rel" : "item"
146 | },
147 | {
148 | "href" : "./2018-07/LC80150332018189LGN00.json",
149 | "rel" : "item"
150 | },
151 | {
152 | "href" : "./2018-06/LC80300332018166LGN00.json",
153 | "rel" : "item"
154 | }
155 | ]
156 | }
157 |
--------------------------------------------------------------------------------
/assets/favicon/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/favicon/android-chrome-192x192.png
--------------------------------------------------------------------------------
/assets/favicon/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/favicon/android-chrome-512x512.png
--------------------------------------------------------------------------------
/assets/favicon/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/favicon/apple-touch-icon.png
--------------------------------------------------------------------------------
/assets/favicon/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/favicon/favicon-16x16.png
--------------------------------------------------------------------------------
/assets/favicon/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/favicon/favicon-32x32.png
--------------------------------------------------------------------------------
/assets/favicon/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/favicon/favicon.ico
--------------------------------------------------------------------------------
/assets/favicon/site.webmanifest:
--------------------------------------------------------------------------------
1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
--------------------------------------------------------------------------------
/assets/images/STAC-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/STAC-01.png
--------------------------------------------------------------------------------
/assets/images/STAC-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/STAC-02.png
--------------------------------------------------------------------------------
/assets/images/STAC-03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/STAC-03.png
--------------------------------------------------------------------------------
/assets/images/STAC-04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/STAC-04.png
--------------------------------------------------------------------------------
/assets/images/STAC-05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/STAC-05.png
--------------------------------------------------------------------------------
/assets/images/STAC-companies-sorted.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/STAC-companies-sorted.png
--------------------------------------------------------------------------------
/assets/images/company-logos/arturo.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/arturo.jpeg
--------------------------------------------------------------------------------
/assets/images/company-logos/astraea.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/astraea.webp
--------------------------------------------------------------------------------
/assets/images/company-logos/aws.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/aws.png
--------------------------------------------------------------------------------
/assets/images/company-logos/azavea.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/azavea.png
--------------------------------------------------------------------------------
/assets/images/company-logos/cbers.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/cbers.jpeg
--------------------------------------------------------------------------------
/assets/images/company-logos/cosmiqworks.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/cosmiqworks.png
--------------------------------------------------------------------------------
/assets/images/company-logos/development-seed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/development-seed.png
--------------------------------------------------------------------------------
/assets/images/company-logos/digital-earth-africa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/digital-earth-africa.png
--------------------------------------------------------------------------------
/assets/images/company-logos/element84.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/element84.png
--------------------------------------------------------------------------------
/assets/images/company-logos/esri-tag-below.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/esri-tag-below.png
--------------------------------------------------------------------------------
/assets/images/company-logos/esri-tag-right.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/esri-tag-right.png
--------------------------------------------------------------------------------
/assets/images/company-logos/google-earth-engine.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/google-earth-engine.png
--------------------------------------------------------------------------------
/assets/images/company-logos/hydrosat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/hydrosat.png
--------------------------------------------------------------------------------
/assets/images/company-logos/l3-harris.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/images/company-logos/maxar-technologies.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/maxar-technologies.png
--------------------------------------------------------------------------------
/assets/images/company-logos/microsoft.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/microsoft.png
--------------------------------------------------------------------------------
/assets/images/company-logos/nasa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/nasa.png
--------------------------------------------------------------------------------
/assets/images/company-logos/near-space-lab.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/near-space-lab.png
--------------------------------------------------------------------------------
/assets/images/company-logos/open-eo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/open-eo.png
--------------------------------------------------------------------------------
/assets/images/company-logos/pixel8.svg:
--------------------------------------------------------------------------------
1 |
2 |
109 |
--------------------------------------------------------------------------------
/assets/images/company-logos/planet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/planet.png
--------------------------------------------------------------------------------
/assets/images/company-logos/radiant-earth.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/radiant-earth.png
--------------------------------------------------------------------------------
/assets/images/company-logos/sparkgeo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/sparkgeo.png
--------------------------------------------------------------------------------
/assets/images/company-logos/terradue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/terradue.png
--------------------------------------------------------------------------------
/assets/images/company-logos/umbra.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/umbra.png
--------------------------------------------------------------------------------
/assets/images/company-logos/up42.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/up42.png
--------------------------------------------------------------------------------
/assets/images/company-logos/usgs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/usgs.png
--------------------------------------------------------------------------------
/assets/images/company-logos/vulcan-technology.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/vulcan-technology.png
--------------------------------------------------------------------------------
/assets/images/company-logos/world-bank-group.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/world-bank-group.jpg
--------------------------------------------------------------------------------
/assets/images/company-logos/world-bank-group.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/company-logos/world-bank-group.png
--------------------------------------------------------------------------------
/assets/images/intro-images/Catalog-layout.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/intro-images/Catalog-layout.jpeg
--------------------------------------------------------------------------------
/assets/images/intro-images/STAC-Catalog.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/intro-images/STAC-Catalog.jpeg
--------------------------------------------------------------------------------
/assets/images/intro-images/STAC-Collection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/intro-images/STAC-Collection.png
--------------------------------------------------------------------------------
/assets/images/intro-images/STAC-Item.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/intro-images/STAC-Item.jpeg
--------------------------------------------------------------------------------
/assets/images/intro-images/geojson-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/intro-images/geojson-example.png
--------------------------------------------------------------------------------
/assets/images/python-images/eo_extension.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/python-images/eo_extension.png
--------------------------------------------------------------------------------
/assets/images/python-images/projection_extension.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/python-images/projection_extension.png
--------------------------------------------------------------------------------
/assets/images/python-images/view_extension.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/python-images/view_extension.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/add-repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/add-repository.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/add_footprint_planetary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/add_footprint_planetary.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/add_stac_api_connection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/add_stac_api_connection.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/added_asset.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/added_asset.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/assets_dialog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/assets_dialog.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/available_filters_planetary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/available_filters_planetary.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/install-from-repository.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/install-from-repository.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/install-from-zip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/install-from-zip.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/plugin_menu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/plugin_menu.gif
--------------------------------------------------------------------------------
/assets/images/qgis-images/qgis-plugin-manager.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/qgis-plugin-manager.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/search_results_planetary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/search_results_planetary.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/toolbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/toolbar.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/toolbar2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/toolbar2.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/view_assets.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/view_assets.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/view_footprints.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/view_footprints.png
--------------------------------------------------------------------------------
/assets/images/qgis-images/web_menu.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/qgis-images/web_menu.gif
--------------------------------------------------------------------------------
/assets/images/r-images/unnamed-chunk-10-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/r-images/unnamed-chunk-10-1.png
--------------------------------------------------------------------------------
/assets/images/r-images/unnamed-chunk-15-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/r-images/unnamed-chunk-15-1.png
--------------------------------------------------------------------------------
/assets/images/r-images/unnamed-chunk-16-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/r-images/unnamed-chunk-16-1.png
--------------------------------------------------------------------------------
/assets/images/r-images/unnamed-chunk-21-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/r-images/unnamed-chunk-21-1.png
--------------------------------------------------------------------------------
/assets/images/r-images/unnamed-chunk-22-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/r-images/unnamed-chunk-22-1.png
--------------------------------------------------------------------------------
/assets/images/r-images/unnamed-chunk-24-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/r-images/unnamed-chunk-24-1.png
--------------------------------------------------------------------------------
/assets/images/r-images/unnamed-chunk-25-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/r-images/unnamed-chunk-25-1.png
--------------------------------------------------------------------------------
/assets/images/r-images/unnamed-chunk-28-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/r-images/unnamed-chunk-28-1.png
--------------------------------------------------------------------------------
/assets/images/r-images/unnamed-chunk-29-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/r-images/unnamed-chunk-29-1.png
--------------------------------------------------------------------------------
/assets/images/satmap.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/satmap.jpg
--------------------------------------------------------------------------------
/assets/images/stac-extensions.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/stac-extensions.png
--------------------------------------------------------------------------------
/assets/images/stac-sprint-23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/stac-sprint-23.png
--------------------------------------------------------------------------------
/assets/images/switzerland-map-bbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/assets/images/switzerland-map-bbox.png
--------------------------------------------------------------------------------
/assets/js/app.js:
--------------------------------------------------------------------------------
1 | import 'core-js/features/dom-collections/for-each';
2 | import 'core-js/stable/queue-microtask';
3 |
4 | import Alpine from 'alpinejs';
5 | import collapse from '@alpinejs/collapse';
6 | import { Navbar, TutorialsSidebar } from './components';
7 |
8 | window.Alpine = Alpine;
9 |
10 | document.addEventListener('alpine:init', () => {
11 | Alpine.data('navbar', Navbar);
12 | Alpine.data('tutorialsSidebar', TutorialsSidebar);
13 | });
14 |
15 | Alpine.plugin(collapse);
16 | Alpine.start();
17 |
--------------------------------------------------------------------------------
/assets/js/components.js:
--------------------------------------------------------------------------------
1 | export const Navbar = () => ({
2 | active: false,
3 | activeSubmenu: '',
4 |
5 | toggle(logtext) {
6 | this.active = !this.active;
7 |
8 | if (logtext) console.log(logtext);
9 | },
10 |
11 | toggleSubmenu(event, submenu) {
12 | if (
13 | !event.currentTarget.classList.contains(
14 | 'navbar__link--has-children'
15 | )
16 | )
17 | return;
18 |
19 | event.preventDefault();
20 |
21 | if (this.activeSubmenu === submenu) {
22 | this.activeSubmenu = '';
23 | } else {
24 | this.activeSubmenu = submenu;
25 | }
26 | },
27 | });
28 |
29 | // If desktop, showMenu true
30 | // If mobile && showMenu
31 | // Or use dynamic class
32 |
33 | export const TutorialsSidebar = () => ({
34 | activeCategories: [],
35 | showMenu: window.innerWidth > 768,
36 |
37 | handleResize() {
38 | if (window.innerWidth > 768) {
39 | this.showMenu = true;
40 | }
41 | },
42 |
43 | toggleMenu() {
44 | this.showMenu = !this.showMenu;
45 | },
46 |
47 | toggleCategory(category) {
48 | const categoryIndex = this.activeCategories.indexOf(category);
49 |
50 | if (categoryIndex === -1) {
51 | this.activeCategories.push(category);
52 | } else {
53 | this.activeCategories.splice(categoryIndex, 1);
54 | }
55 | },
56 | });
57 |
--------------------------------------------------------------------------------
/assets/svg/bars-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/book-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/bullhorn-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/caret-down-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/caret-up-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/code-branch-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/database-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/earth-oceania-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/github.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/graduation-cap-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/laptop-code-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/moon-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/object-group-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/svg/satellite-solid.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/config/.prettierignore:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/radiantearth/stac-site/f129ef6477751bb799f3996525d8dd6e6ed5a8a6/config/.prettierignore
--------------------------------------------------------------------------------
/config/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "trailingComma": "es5",
3 | "tabWidth": 4,
4 | "semi": true,
5 | "singleQuote": true
6 | }
--------------------------------------------------------------------------------
/config/postcss.config.js:
--------------------------------------------------------------------------------
1 | // postcss.config.js
2 | module.exports = {
3 | plugins: {
4 | 'postcss-import': {},
5 | tailwindcss: {
6 | config: './config/tailwind.config.js',
7 | },
8 | autoprefixer: {},
9 | },
10 | };
11 |
--------------------------------------------------------------------------------
/config/tailwind.config.js:
--------------------------------------------------------------------------------
1 | const defaultTheme = require('tailwindcss/defaultTheme');
2 |
3 | module.exports = {
4 | purge: [],
5 | darkMode: false, // or 'media' or 'class'
6 | theme: {
7 | extend: {
8 | fontFamily: {
9 | sans: ['Sarabun', ...defaultTheme.fontFamily.sans],
10 | display: ['Nunito', ...defaultTheme.fontFamily.sans],
11 | },
12 | boxShadow: {
13 | button: '-1px 1px 2px 0 rgba(16, 47, 59, 0.18)',
14 | card: '-2px 2px 4px 0 rgba(16, 47, 59, 0.18)',
15 | },
16 | },
17 | borderRadius: {
18 | sm: '0.125rem',
19 | DEFAULT: '0.25rem',
20 | lg: '0.375rem',
21 | xl: '0.75rem',
22 | '2xl': '1.5rem',
23 | full: '50%',
24 | },
25 | colors: {
26 | black: '#102F3B',
27 | white: '#FAFDFF',
28 | gray: {
29 | light: '#CAD1D3',
30 | DEFAULT: '#6E8087',
31 | dark: '#455054',
32 | },
33 | blue: {
34 | 50: '#FAFDFF',
35 | 100: '#E4F6FB',
36 | 200: '#C4E2EF',
37 | 300: '#A1C4D3',
38 | 400: '#7DA7B8',
39 | 500: '#5A8A9C',
40 | 600: '#376C81',
41 | 700: '#285D72',
42 | 800: '#1A4E63',
43 | 900: '#102F3B',
44 | DEFAULT: '#376C81',
45 | light: '#C4E2EF',
46 | dark: '#1A4E63',
47 | },
48 | transparent: 'transparent',
49 | green: '#4EB4AE',
50 | info: {
51 | light: '#C6E5F1',
52 | DEFAULT: '#74C0DD',
53 | },
54 | success: {
55 | light: '#B1E7E4',
56 | DEFAULT: '#63CFC9',
57 | },
58 | warning: {
59 | light: '#FEEDC8',
60 | DEFAULT: '#FCD788',
61 | },
62 | danger: {
63 | light: '#FCCFCF',
64 | DEFAULT: '#F99F9F',
65 | },
66 | },
67 | },
68 | variants: {
69 | extend: {},
70 | },
71 | plugins: [],
72 | };
73 |
--------------------------------------------------------------------------------
/config/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 |
3 | module.exports = {
4 | entry: './assets/js/app.js',
5 | module: {
6 | rules: [
7 | {
8 | test: /\.js$/,
9 | include: __dirname + '/assets/js',
10 | use: {
11 | loader: 'babel-loader',
12 | options: {
13 | presets: [
14 | [
15 | '@babel/preset-env',
16 | {
17 | useBuiltIns: 'usage',
18 | corejs: {
19 | version: '3',
20 | proposals: true,
21 | },
22 | targets: '> 0.25%, not dead',
23 | }
24 | ]
25 | ]
26 | }
27 | }
28 | }
29 | ]
30 | },
31 | output: {
32 | path: path.resolve(__dirname, '../public/js'),
33 | filename: 'bundle.js'
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/content/_snippets/spec/catalog-simple.json:
--------------------------------------------------------------------------------
1 | {
2 | "stac_version": "1.0.0",
3 | "type": "Catalog",
4 | "id": "20201211_223832_CS2",
5 | "description": "A simple catalog example",
6 | "links": []
7 | }
--------------------------------------------------------------------------------
/content/_snippets/spec/collection-simple.json:
--------------------------------------------------------------------------------
1 | {
2 | "stac_version": "1.0.0",
3 | "type": "Collection",
4 | "license": "ISC",
5 | "id": "20201211_223832_CS2",
6 | "description": "A simple collection example",
7 | "links": [],
8 | "extent": {},
9 | "summaries": {}
10 | }
--------------------------------------------------------------------------------
/content/_snippets/spec/item-simple.json:
--------------------------------------------------------------------------------
1 | {
2 | "stac_version": "1.0.0",
3 | "type": "Feature",
4 | "id": "20201211_223832_CS2",
5 | "bbox": [],
6 | "geometry": {},
7 | "properties": {},
8 | "collection": "simple-collection",
9 | "links": [],
10 | "assets": {}
11 | }
--------------------------------------------------------------------------------
/content/_util.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const fs = require('fs');
3 | const routes = require('../eleventy/routes');
4 | const markdown = require('../eleventy/markdown');
5 |
6 | function codeSnippet(filename, lang) {
7 | const filePath = path.join(__dirname, `./_snippets/${filename}`);
8 |
9 | if (lang && lang === 'json') {
10 | const jsonObj = require(filePath);
11 | return '```json\n' + JSON.stringify(jsonObj, null, 4) + '\n```';
12 | } else {
13 | return '```\n' + require(filePath) + '\n```';
14 | }
15 | }
16 |
17 | function snippet(filename) {
18 | const filePath = path.join(__dirname, `./_snippets/${filename}`);
19 | const fileContents = fs.readFileSync(filePath);
20 | return fileContents;
21 | }
22 |
23 | function route(name, locale) {
24 | return routes.find(name, locale);
25 | }
26 |
27 | module.exports = {
28 | md: markdown.render,
29 | codeSnippet,
30 | snippet,
31 | route,
32 | };
33 |
--------------------------------------------------------------------------------
/content/about/datasets.js:
--------------------------------------------------------------------------------
1 | const meta = {
2 | title: {
3 | en: `STAC Datasets`
4 | },
5 | description: {
6 | en: `STAC is being found in an increasing number of spatiotemporal datasets, many of which are publicly available to use in your own exploration and research.`
7 | },
8 | }
9 |
10 | const hero = {
11 | preheading: {
12 | en: 'About STAC',
13 | },
14 | heading: {
15 | en: 'Datasets',
16 | },
17 | body: {
18 | en: `STAC is being found in an increasing number of spatiotemporal datasets, many of which are publicly available to use in your own exploration and research. Diving into one of these public datasets is a great way to learn STAC.`,
19 | },
20 | };
21 |
22 | module.exports = {
23 | meta,
24 | hero,
25 | };
26 |
--------------------------------------------------------------------------------
/content/about/faq.js:
--------------------------------------------------------------------------------
1 | const { snippet, codeSnippet, route } = require('../_util');
2 |
3 | const meta = {
4 | title: {
5 | en: `STAC Frequently Asked Questions`
6 | },
7 | description: {
8 | en: `We get a lot of questions about STAC, here we've compiled a list of some of the ones we're asked most often.`
9 | },
10 | }
11 |
12 | const hero = {
13 | preheading: {
14 | en: 'About STAC',
15 | 'lo-ip': 'Lorem',
16 | },
17 | heading: {
18 | en: 'Frequently Asked Questions',
19 | 'lo-ip': 'Ipsum Dolor',
20 | },
21 | body: {
22 | en: `We get a lot of questions about STAC, here we've compiled a list of some of the ones we're asked most often.`,
23 | 'lo-ip': 'Lorem ipsum dolor',
24 | },
25 | };
26 |
27 | const content = {
28 | en: `
29 | ## What is the relationship to OGC’s WFS 3 specification?
30 |
31 | STAC intends to be fully compliant with the upcoming WFS 3 specification including implementing WFS 3’s query methods. STAC has ended up a bit 'ahead' of some of what WFS 3 has specified so far, so there may be some divergences in the short term. But the ideal situation for STAC is that the STAC API eventually is no longer necessary - it would just be a WFS 3 with a curated set of extensions that serve up STAC Items.
32 |
33 | ## I have geospatial raster data, should I use STAC?
34 |
35 | Yes! So long as you can address your data in space and time and link directly to your data.
36 |
37 | ## I have vector data, should I use STAC?
38 |
39 | Yes! Vector data can in principle be handled with STAC, but it's not as well defined as for raster data. STAC it closely aligned with OGC API - Features though and you should have a look at that specification, too.
40 |
41 | ## I have non-geospatial data, should I use STAC?
42 |
43 | No. Data that has no context in space and time is not suited to STAC. Though providers of that data are welcome to 'borrow' STAC ideas and we could converge in the future on higher level specifications (like non-spatial or non-temporal 'items' or common catalog structures).
44 |
45 | ## What is the relationship between STAC and ISO 19115?
46 |
47 | We are still figuring out the exact recommendation, but in general STAC is focused on search and discovery, while ISO 19115 aims to be the definitive metadata description. Likely one would derive a STAC Item from an ISO 19115 file by only using a subset of the fields, and mapping them to the matching STAC fields. And then the STAC Item would have an 'asset' link that lets users who need the full, definitive metadata to download the ISO 19115 file. Ideally we would have an ISO 19115 STAC Extension that details exactly how to do this mapping, but as yet no one has tried to do a real world implementation that exposes ISO 19115 files. Contributions on this front are definitely welcome, as STAC Community aims to 'play nice' with everyone.
48 | `,
49 | };
50 |
51 | module.exports = {
52 | meta,
53 | hero,
54 | content,
55 | };
56 |
--------------------------------------------------------------------------------
/content/about/index.js:
--------------------------------------------------------------------------------
1 | const { snippet, codeSnippet, route } = require('../_util');
2 |
3 | const meta = {
4 | title: {
5 | en: `About STAC`
6 | },
7 | description: {
8 | en: `STAC is a standard and a community of collaborators working to enable increased access to information about our planet. The focus of STAC is to make it as easy as possible for data providers to expose their data to the world.`
9 | },
10 | }
11 |
12 | const hero = {
13 | preheading: {
14 | en: 'STAC',
15 | 'lo-ip': 'Lorem',
16 | },
17 | heading: {
18 | en: 'More about STAC',
19 | 'lo-ip': 'Ipsum Dolor',
20 | },
21 | body: {
22 | en: `
23 | STAC is a standard and a community of collaborators working to enable increased access to information about our planet. The focus of STAC is to make it as easy as possible for data providers to expose their data to the world.
24 |
25 | There are exabytes of spatial data in existence today, with the potential to greatly increase our understanding of the world and improve decisions. But most of it remains inaccessible, as it is in a myriad of different formats, with no common way to find relevant information about a place over time. As data migrates to the cloud, we have an opportunity to make it more accessible and interoperable.
26 | `,
27 | 'lo-ip': 'Lorem ipsum dolor',
28 | },
29 | beforeCode: {
30 | en: `
31 | ## A familiar format
32 |
33 | The STAC spec itself provides a lowest common denominator JSON format to wrap around any relevant data about the earth. The core GeoJSON object and related structures are designed for extension, so it can adapt to different domains.
34 | `,
35 | },
36 | code: {
37 | en: codeSnippet('spec/item-simple.json', 'json'),
38 | },
39 | afterCode: {
40 | en: `The core JSON pages can be transformed into browsable, interactive HTML pages with tools like STAC Browser. When STAC is used in concert with emerging formats like Cloud Optimized GeoTIFF or TileDB arrays the result vastly lowers the barriers for anybody to find and use geospatial assets like satellite imagery`,
41 | },
42 | };
43 |
44 | const whyStac = {
45 | body: {
46 | en: `
47 | ## The need for STAC
48 |
49 | The SpatioTemporal Asset Catalog (STAC) is an open specification that evolved from different organizations coming together to increase the interoperability of searching for satellite imagery. When a user wants to search for all the imagery in their area and time of interest they can’t make just one search — they have to use different tools and connect to API’s that are similar but all slightly different. STAC aims to make that much easier, by providing common metadata to expose geospatial assets.
50 |
51 | The goal of STAC is to enable a global index of all imagery (satellite, aerial, drone, etc), derived data products and alternative geospatial captures (LiDAR, SAR, Full Motion Video, Hyperspectral and beyond). STAC focuses on an easily implementable standard for organizations to expose their data in a persistent and reliable way.
52 |
53 | ### Reducing technical barriers
54 |
55 | Most geospatial catalogs require the provider of data to maintain servers and databases to enable search. This can be a large challenge with huge amounts of data. STAC aims to flip that paradigm on its head, following the path of the web, where putting up an HTML page is very simple, and then the search of those pages can be done by anyone, with experts in search emerging over time. STAC aims to enable that next generation of geospatial search engines, while also supporting web best practices so geospatial information is more easily surfaced in traditional search engines.
56 |
57 | ### Building community
58 |
59 | More than a specification, STAC is a community of collaborators working towards a shared goal. We believe in interoperability, the power of information about the earth, and open data (where it is appropriate). If you'd like to help us in our quest to make spatiotemporal data more accessible don't hesitate to join the community. You can learn about all the ways you can on our How To Help page.
60 |
61 | ### Tools & resources
62 |
63 | A range of tools help facilitate the use of the STAC spec – some of the most widely used are:
64 |
65 | - [STAC Browser](https://github.com/radiantearth/stac-browser) is a Vue-based browser for STAC catalogs.
66 | - [STAC Server](https://github.com/stac-utils/stac-server) (previously known as sat-api) is a STAC compliant web API for searching and serving metadata for geospatial data. It is written in Javascript and backed by Elasticsearch
67 | - [STAC Validator](https://github.com/sparkgeo/stac-validator) is a python utility to validate STAC json files against the STAC spec or against local STAC extensions.
68 | - [PySTAC](https://github.com/stac-utils/pystac) is a library for working with STAC catalogs in Python
69 | - [EODAG](https://github.com/CS-SI/eodag) is a CLI tool and a Python framework for searching, aggregating results and downloading EO data through a unified API regardless of the data provider. It can be run as STAC client or STAC API proxy server for non-STAC providers.
70 |
71 | [See the full list](${route(
72 | 'about.toolsResources',
73 | 'en'
74 | )}){.cta .cta--understated}
75 | `,
76 | },
77 | };
78 |
79 | const whoIsItFor = {
80 | body: {
81 | en: `
82 | ## Who is STAC for
83 |
84 | ### Data Providers
85 |
86 | STAC is a standardized way to expose collections of spatial temporal data. If you are a provider of imagery or other spatial information and are in need of data catalogs, STAC is driving a uniform means for indexing assets. It can be used for external access to your holdings, exposing your information to search engines and to a growing ecosystem of tools. Large providers can also use a 'static catalog' for reliable backups in case the database or Elasticsearch powering their main index goes down.
87 |
88 | [Learn More](${route('getInvolved.dataProviders', 'en')}){.cta-understated}
89 |
90 | ### Developers
91 |
92 | If you are building infrastructure to host, ingest, or manage collections of spatial data or image products, STAC’s core JSON is the bare minimum needed to interact with any geospatial data collection. Additionally, STAC standardizes metadata fields, naming conventions, query language, and catalog structure. It describes individual instances as items containing a link to the physical dataset. The core JSON is fully extensible, allowing developers to add attributes to better capture their use case or dataset. As a developer, there are two options to implement STAC; as a static STAC or the STAC API. A static STAC is incredibly easy to create, and it can easily be ingested by an ecosystem of tools that can generate the STAC API.
93 |
94 | [Learn More](${route('getInvolved.developers', 'en')}){.cta-understated}
95 |
96 | ### Data Users
97 |
98 | Consumers of spatial temporal datasets are often burdened with building unique pipelines for ingesting collections into their system. Collections are delivered with varying levels of detail in their metadata and via distinct delivery mechanisms. In an effort to reduce this burden, a community of geospatial developers have constructed the STAC spec to remove the need for tailor-made workflows.
99 |
100 | [Learn More](${route('getInvolved.dataUsers', 'en')}){.cta-understated}`,
101 | },
102 | };
103 |
104 | module.exports = {
105 | meta,
106 | hero,
107 | whyStac,
108 | whoIsItFor,
109 | stacSpec: require('./stac-spec'),
110 | toolsResources: require('./tools-resources'),
111 | datasets: require('./datasets'),
112 | faq: require('./faq'),
113 | };
114 |
--------------------------------------------------------------------------------
/content/about/stac-spec.js:
--------------------------------------------------------------------------------
1 | const { codeSnippet } = require('../_util');
2 |
3 | const meta = {
4 | title: {
5 | en: `The STAC Specification`
6 | },
7 | description: {
8 | en: `Learn about components that make up the STAC core specification: items, catalogs, and collections, as well as STAC APIs and extensions.`
9 | },
10 | }
11 |
12 | const hero = {
13 | preheading: {
14 | en: 'About STAC',
15 | },
16 | heading: {
17 | en: 'The STAC Specification',
18 | },
19 | body: {
20 | en: `
21 | The STAC Specification lives as easily readable markdown pages on github, as the community aspires to keep STAC very approachable. So while this page gives a slightly deeper overview, don't hesitate to [dive directly into the spec](https://github.com/radiantearth/stac-spec/).
22 |
23 | One thing to emphasize is that the specification is designed to be flexible and extensible. So if it seems a bit 'light', that is by design, so that different domains and tools can easily make it their own. The extensions section of the spec, detailed below, is where the community collaborates on more detail about specific data types and new functionality.
24 |
25 | Key to the STAC approach is JSON's extensibility. While the spec does provide JSON Schemas for validation (easily usable with online tools like STACLint.com), JSON validation won’t complain if you have extra fields, adding more fields allows you to support a variety of data types and implementations. Flexibility and extensibility are core tenets of STAC.
26 | `,
27 | },
28 | };
29 |
30 | const content = {
31 | en: `
32 | ## Item
33 |
34 | Fundamental to any STAC, a [STAC Item](https://github.com/radiantearth/stac-spec/blob/master/item-spec/item-spec.md) represents an atomic collection of inseparable data and metadata. A STAC Item is a [GeoJSON feature](https://geojson.org/) and can be easily read by any modern GIS or geospatial library. The STAC Item JSON specification includes additional fields for:
35 |
36 | - the time the asset represents
37 | - a thumbnail for quick browsing
38 | - asset links, links to the described data
39 | - relationship links, allowing users to traverse other related STAC Items
40 |
41 | A STAC Item can contain additional fields and JSON structures to enable data providers to expose rich metadata and software developers to create intuitive tools.
42 |
43 | ${codeSnippet('spec/item-simple.json', 'json')}
44 |
45 | ## Catalog
46 |
47 | The [STAC Catalog](https://github.com/radiantearth/stac-spec/blob/master/catalog-spec/catalog-spec.md) provides a flexible structure to link various STAC Items together to be crawled or browsed. The spec is quite simple, just a JSON that:
48 |
49 | - contains a list of STAC Items
50 | - contains a list of child STAC Catalogs - allowing a hierarchical grouping of STAC Items
51 |
52 | There are no restrictions on the way catalogs are organized. Most implementations use a set of 'sub-catalogs' (a catalog that is linked to from another catalog) to group the items in some sensible way. It can be easily extended, for example to include additional metadata to further describe its holdings, as the STAC Collection does.
53 |
54 | ${codeSnippet('spec/catalog-simple.json', 'json')}
55 |
56 |
57 | ## Collection
58 |
59 | A [STAC Collection](https://github.com/radiantearth/stac-spec/blob/master/collection-spec/collection-spec.md) provides additional information about a spatio-temporal collection of data. It extends Catalog directly, layering on additional fields to enable description of things like the spatial and temporal extent of the data, the license, keywords, providers, etc. It in turn can easily be extended for additional collection level metadata. It is used standalone by parts of the STAC community, as a lightweight way to describe data holdings.
60 |
61 | ${codeSnippet('spec/collection-simple.json', 'json')}
62 |
63 | ## STAC API
64 |
65 | STAC API
66 | [The STAC API specification](https://github.com/radiantearth/stac-api-spec) is a bit different from the others. Instead of just specifying JSON and links that could be implemented with no moving parts, it defines a RESTful service interface for search. It dynamically generates a GeoJSON FeatureCollection of STAC Items in response to a user query.
67 |
68 | The core of the spec is a single endpoint:
69 |
70 | \`\`\`http
71 | /stac/search
72 | \`\`\`
73 |
74 | It takes a JSON object that can filter on date and time:
75 |
76 | \`\`\`json
77 | {
78 | "bbox": [5.5, 46, 8, 47.4],
79 | "time": "2018-02-12T00:00:00Z/2018-03-18T12:31:12Z"
80 | }
81 | \`\`\`
82 |
83 | This tells the server to return all the catalog items it has that are from the second half of March, 2018 and that intersect with this area:
84 |
85 | 
86 |
87 | The return format is a GeoJSON FeatureCollection with features compliant with the Item spec for STAC. It returns to a limit optionally requested by the client, and includes pageable links to iterate through any results past that limit.
88 |
89 | STAC API has worked to align with the OGC's WFS 3 specification, and ideally it evolves so as much of the STAC API functionality as possible is in WFS. For more about this see the FAQ.
90 |
91 | ### Extensions
92 |
93 | While the core specification says nothing about particular types of data, the [extensions folder](https://github.com/radiantearth/stac-spec/tree/master/extensions) is where one can find domain-specific fields that can be easily added to any STAC Item. It is a place where any implementor can propose fields that are potentially more widely applicable than just their data. Each extension is labeled with a ‘maturity classification’ that lets others know how likely the extension is to change in the future.
94 |
95 | 
96 |
97 | The goal is to enable specific communities to work together to find a ‘good enough’ set of common metadata.
98 |
99 | ### Dynamic and Static Catalogs
100 |
101 | The final bit to draw attention to is the two different types of catalogs - static and dynamic.
102 |
103 | A static catalog is one that is implemented as a set of flat files on a web server or an object store like S3 or Google Cloud Storage.
104 | A dynamic catalog is one that generates its responses dynamically, generally backed by some sort of server.
105 | The core Item, Catalog and Collection specs can be fully implemented by either, and the spec is designed to be agnostic to how it is implemented. This decision was made to make the lowest possible barrier to exposing data as STAC. For many the simplest thing to do is to simply create files and put them online. But large data providers like Planet and DigitalGlobe have already invested significant effort and resources in generating dynamic API’s and indexes for their customers to query their imagery holdings. For them it is actually easier to implement a dynamic STAC instead of trying to re-architect their core platforms. But static catalogs have an additional use cases for large providers, enabling a fail safe point of truth. A static catalog can be generated from the dynamic index, stored on the cloud, and then easily used for disaster recovery due to the incredible reliability of AWS S3 and Google Cloud Storage.
106 |
107 | Client libraries like STAC Browser are able to treat dynamic and static catalogs the same, as they both expose the exact same information. The one thing dynamic catalogs can do that static ones can't is offer the /search/ endpoint. Though as the ecosystem of dynamic STAC servers improves it will be quite easy to use an off the shelf server to ingest the static catalog and provide a dynamic version of it to enable search.
108 | `,
109 | 'lo-ip':
110 | 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Eveniet, quia! Vel sit doloribus commodi expedita dolores a reiciendis magni facilis velit! Dolore, eveniet corporis aspernatur architecto odio amet sit fugiat?',
111 | };
112 |
113 | module.exports = {
114 | meta,
115 | hero,
116 | content,
117 | };
118 |
--------------------------------------------------------------------------------
/content/about/tools-resources.js:
--------------------------------------------------------------------------------
1 | const meta = {
2 | title: {
3 | en: 'STAC Tools & Resources',
4 | },
5 | description: {
6 | en: 'Learn about the growing list of tools help facilitate the use of the STAC spec.',
7 | },
8 | }
9 |
10 | const hero = {
11 | preheading: {
12 | en: 'About STAC',
13 | },
14 | heading: {
15 | en: 'Tools & resources',
16 | },
17 | body: {
18 | en: `A range of tools help facilitate the use of the STAC spec. For the most up-to-date information on the growing STAC ecosystem, visit [stacindex.org/ecosystem](https://stacindex.org/ecosystem)`,
19 | },
20 | };
21 |
22 | module.exports = {
23 | meta,
24 | hero,
25 | };
26 |
--------------------------------------------------------------------------------
/content/categories.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | 'getting-started': {
3 | name: {
4 | en: 'Introduction to STAC',
5 | },
6 | },
7 | 'python': {
8 | name: {
9 | en: 'Python Tutorials',
10 | },
11 | },
12 | 'qgis': {
13 | name: {
14 | en: 'QGIS Tutorials',
15 | },
16 | },
17 | 'r': {
18 | name: {
19 | en: 'R Tutorials',
20 | },
21 | },
22 | 'cli': {
23 | name: {
24 | en: 'CLI Tutorials',
25 | },
26 | },
27 | 'how-to-guides': {
28 | name: {
29 | en: 'How-to Guides',
30 | },
31 | },
32 | };
33 |
--------------------------------------------------------------------------------
/content/get-involved/data-providers.js:
--------------------------------------------------------------------------------
1 | const { route } = require('../_util');
2 |
3 | const meta = {
4 | title: {
5 | en: 'STAC for Data Providers',
6 | },
7 | description: {
8 | en: 'STAC is a standardized way to expose collections of spatial temporal data. If you are a provider of data about the earth needing to catalog your holdings, STAC is driving a uniform means for indexing assets.'
9 | }
10 | }
11 |
12 | const hero = {
13 | preheading: {
14 | en: 'STAC',
15 | },
16 | heading: {
17 | en: `For Data Providers`
18 | },
19 | body: {
20 | en: `STAC is a standardized way to expose collections of spatial temporal data. If you are a provider of data about the earth needing to catalog your holdings, STAC is driving a uniform means for indexing assets.`
21 | }
22 | }
23 |
24 | const bullets = [
25 | {
26 | icon: {},
27 | heading: {
28 | en: 'Easy to host',
29 | },
30 | content: {
31 | en: `Because STAC APIs can be hosted without complex servers or infrastructure, hosting your data can be as simple as dropping your static files into an a public folder on AWS or a service of your choice. Making your content searchable and secure is easier too, with [numerous server side tools](${route('about.toolsResources', 'en')}) out there to streamline the process and get your data online and accessible.`,
32 | },
33 | },
34 | ];
35 |
36 | const closingContent = {
37 | en:
38 | `## STAC Community
39 |
40 | If you'd like to get involved with the STAC community, the [How to Help](https://stacspec.org/en/get-involved/) page is a good place to learn about our active needs. If you're not sure where to begin, find us on the [CNG Discourse](https://cng.discourse.group/c/stac/15), and you'll likely find someone who will be more than happy to point you in the right direction.`
41 | }
42 |
43 | module.exports = {
44 | meta,
45 | hero,
46 | bullets,
47 | closingContent,
48 | };
--------------------------------------------------------------------------------
/content/get-involved/data-users.js:
--------------------------------------------------------------------------------
1 | const { route } = require('../_util');
2 |
3 | const meta = {
4 | title: {
5 | en: 'STAC for Data Users',
6 | },
7 | description: {
8 | en: 'Users of spatial temporal data are often burdened with building unique pipelines for each different collection of data they consume. The STAC community has defined this specification to remove this complexity and spur common tooling.'
9 | }
10 | }
11 |
12 | const hero = {
13 | preheading: {
14 | en: 'STAC',
15 | },
16 | heading: {
17 | en: `For Data Users`
18 | },
19 | body: {
20 | en: `Users of spatial temporal data are often burdened with building unique pipelines for each different collection of data they consume. The STAC community has defined this specification to remove this complexity and spur common tooling.`
21 | }
22 | }
23 |
24 | const bullets = [
25 | {
26 | icon: {},
27 | heading: {
28 | en: 'Public data',
29 | },
30 | content: {
31 | en: `If you're looking for [public data](${route('about.datasets', 'en')}) to conduct research or to interact with SpatioTemporal data for the first time, the STAC spec is a consistent format that is used by many of the biggest providers of remote sensing & spatiotemporal data.`,
32 | },
33 | },
34 | ];
35 |
36 | const closingContent = {
37 | en:
38 | `## STAC Community
39 |
40 | If you'd like to get involved with the STAC community, the [How to Help](https://stacspec.org/en/get-involved/) page is a good place to learn about our active needs and community meetings.`
41 | }
42 |
43 | module.exports = {
44 | meta,
45 | hero,
46 | bullets,
47 | closingContent,
48 | };
49 |
--------------------------------------------------------------------------------
/content/get-involved/developers.js:
--------------------------------------------------------------------------------
1 | const { route } = require('../_util');
2 |
3 | const meta = {
4 | title: {
5 | en: 'STAC for Developers',
6 | },
7 | description: {
8 | en: 'STAC offers a simple and flexible format for developers to interact with SpatioTemporal data, and a community and ecosystem of open source tools and innovation.'
9 | }
10 | }
11 |
12 | const hero = {
13 | preheading: {
14 | en: 'STAC',
15 | },
16 | heading: {
17 | en: 'For developers',
18 | },
19 | body: {
20 | en: `STAC offers not only a simple and flexible format for developers to interact with SpatioTemporal data, but an excellent community and ecosystem of open source tools and innovation.`,
21 | },
22 | };
23 |
24 | const bullets = [
25 | {
26 | icon: {},
27 | heading: {
28 | en: 'Small, Flexible JSON Core',
29 | },
30 | content: {
31 | en: `[STAC's core JSON](${route('about.stacSpec', 'en')}) is the bare minimum needed to interact with any geospatial data collection. Additionally, STAC standardizes metadata fields, naming conventions, query language, and catalog structure. The core JSON is fully extensible, allowing developers to add attributes to better capture their use case or dataset.`,
32 | },
33 | },
34 | {
35 | icon: {},
36 | heading: {
37 | en: 'Tooling Ecosystem',
38 | },
39 | content: {
40 | en: `The STAC community has built [numerous tools](${route('about.toolsResources', 'en')}) to make it easier to browse, serve, validate, and visualize STAC data in your programming language of choice. Most of these tools are open source and offer a great opportunity to improve and build upon meaningful projects.`,
41 | },
42 | },
43 | {
44 | icon: {},
45 | heading: {
46 | en: `Resources to Learn and Explore`
47 | },
48 | content: {
49 | en: `There are plenty of [APIs and static catalogs](${route('about.datasets', 'en')}) available to the public to get started quickly with real spatiotemporal data. If you're looking for a place to start, check out the [STAC tutorial library](${route('tutorials', 'en')}) to learn the basics or explore a sample project.`,
50 | }
51 | }
52 | ]
53 |
54 | const closingContent = {
55 | en:
56 | `## STAC Community
57 |
58 | If you'd like to get involved with the STAC community, the [How to Help](https://stacspec.org/en/get-involved/) page is a good place to learn about our active needs and community meetings.`
59 | }
60 |
61 | module.exports = {
62 | meta,
63 | hero,
64 | bullets,
65 | closingContent,
66 | };
67 |
--------------------------------------------------------------------------------
/content/get-involved/index.js:
--------------------------------------------------------------------------------
1 | const meta = {
2 | title: {
3 | en: 'How to Help with STAC',
4 | },
5 | description: {
6 | en: 'The STAC community prides itself on being welcoming and collaborative. Learn how about our ongoing needs and how you can contribute!'
7 | }
8 | }
9 |
10 | const hero = {
11 | preheading: {
12 | en: 'Get Involved',
13 | },
14 | heading: {
15 | en: 'How to Help with STAC',
16 | },
17 | body: {
18 | en: `Welcome! The STAC community prides itself on being welcoming and collaborative, and we are excited you clicked on this page to learn how you might help!
19 |
20 | If you aren't sure where to begin, join the [STAC Community Google Group](https://groups.google.com/a/cloudnativegeo.org/g/stac-community).
21 | Upon signup, you will receive invitations to the biweekly STAC Community meetup (every other Monday at 11 am EST). [Use this time zone converter if needed](https://www.timeanddate.com/worldclock/converter.html?iso=20231121T160000&p1=224&p2=75&p3=64&p4=263&p5=168).
22 |
23 | Looking for online discussions and activity around STAC? Check out the [stac-spec repo](https://github.com/radiantearth/stac-spec), [stac-api-spec repo](https://github.com/radiantearth/stac-api-spec), and the [stac-utils repo](https://github.com/stac-utils) to see
24 | discussions and updates to STAC and its ecosystem. We are also have a [STAC category in the CNG Discourse](https://cng.discourse.group/c/stac)`,
25 | },
26 | cta_text: {
27 | en: 'Join STAC Google Group',
28 | },
29 | cta_url: {
30 | en: 'https://groups.google.com/a/cloudnativegeo.org/g/stac-community',
31 | },
32 | };
33 |
34 | const howToHelp = {
35 | heading: {
36 | en: 'How to help',
37 | },
38 | body: {
39 | en: `Coming to the STAC Community meeting (join the [STAC Community Google Group](https://groups.google.com/a/cloudnativegeo.org/g/stac-community) for invite) is a great place to begin.`,
40 | },
41 | };
42 |
43 | const currentNeeds = {
44 | 1: {
45 | body: {
46 | en: `
47 | ### Help with data
48 |
49 | Perhaps the biggest way to help push forward STAC is by helping to translate more data into STAC compliant catalogs. There are a number of existing open data sets that we would like to make accessible as STAC, which need a volunteer who is tech savvy to use STAC tools or develop new ones.
50 |
51 | If you are a data provider and are contemplating exposing data with STAC we'd love to talk to you. There are likely community members who can help if your data is going to be open. And we are happy to give advice on STAC best practices for proprietary. You can use STAC to help expose downsampled assets to attract customers, or as a format for your paying users or on your intranets.
52 |
53 | One of the biggest goals right now is to bring in more diverse types of data. So those who have data that is different and are up for pioneering a new extension are highly appreciated. We want to ensure that the core spec is able to handle a wide variety of extensions representing lots of different data types before we settle in at 1.0, so we can ensure stability of the core.
54 | `,
55 | },
56 | },
57 | 2: {
58 | body: {
59 | en: `
60 | ### Help with Software Development
61 |
62 | While there are already a handful of STAC implementations, our goal is to have tools in every language, and integrations in every major geospatial-aware software project. So if you are a software developer who would like to help just get in touch and we can find a project for you. It could be helping with an existing one or starting something new - it's up to you. We have opportunities with servers, javascript clients, command line tools, client libraries, testing tools and more. And we are happy for those who have existing projects that they want to bring into the STAC ecosystem.`,
63 | },
64 | },
65 | 3: {
66 | body: {
67 | en: `
68 | ### Help with Web Design
69 |
70 | There are copious opportunities for web designers, as we have none in our community as of yet. Even if you are just starting out with web design, we welcome your contribution and can give you meaningful projects. There is helping with this website, but also cool projects customizing different STAC HTML implementations in STAC Browser, so they don't all look the same. Creativity is welcome!`,
71 | },
72 | },
73 | 4: {
74 | body: {
75 | en: `
76 | ### Help with Outreach
77 |
78 | As a community we know one of the most important things is to spread the word about our work. This could be presenting at conferences or meet-ups, writing blog posts or whitepapers, or helping refine the website. We welcome anything from minor fixes on the site to creating full tutorials or new forms of outreach. We are a very open community, and are happy to help you develop skills and experience that help you.`,
79 | },
80 | },
81 | 5: {
82 | body: {
83 | en: `
84 | ### Help with the Specification
85 |
86 | The biggest way to help with the specification is to create compliant catalogs or software and give us feedback from that experience. That experience should ground you in what is possible, and then help us build the spec with pull requests from there. But we also welcome those who like to make things easier to read - organizing and editing the spec.`,
87 | },
88 | },
89 | };
90 |
91 | const communityCalls = {
92 | body: {
93 | en: `
94 | ### Community meetings
95 |
96 | We also do video calls where we discuss various issues and move the spec forward. The meeting is an hour long and informal. It is a space to discuss ongoing work, ask questions about implementations, and plan future work and sprints. We try to make sure there is always a member of the STAC PSC at these meetings.`,
97 | },
98 | };
99 |
100 | module.exports = {
101 | meta,
102 | hero,
103 | howToHelp,
104 | communityCalls,
105 | currentNeeds,
106 | developers: require('./developers'),
107 | dataUsers: require('./data-users'),
108 | dataProviders: require('./data-providers'),
109 | };
110 |
--------------------------------------------------------------------------------
/content/index.js:
--------------------------------------------------------------------------------
1 | const routes = require('../eleventy/routes').tree();
2 |
3 | module.exports = {
4 | root: {
5 | routes,
6 | homepage: require('./homepage'),
7 | about: require('./about'),
8 | getInvolved: require('./get-involved'),
9 | navigation: require('./navigation'),
10 | categories: require('./categories'),
11 | tutorials: require('./tutorials'),
12 | },
13 | };
14 |
--------------------------------------------------------------------------------
/content/tutorials.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | meta: {
3 | title: {
4 | en: 'STAC Tutorials',
5 | },
6 | description: {
7 | en: 'Here you can find our library of tutorials for learning all about STAC.'
8 | }
9 | },
10 |
11 | body: {
12 | en: `
13 | # STAC Tutorials
14 |
15 | Welcome to our library of tutorials for learning all about STAC. In addition to our own tutorials, you can also explore an
16 | extensive list of tutorials sourced from various corners of the web on the [STAC index](https://stacindex.org/learn).
17 |
18 | If you're eager to delve deeper into a specific topic, we encourage you to join our
19 | biweekly community calls (get an invite by joining the [STAC Community Google Group](https://groups.google.com/a/cloudnativegeo.org/g/stac-community)). Chances are, one of our knowledgeable community members
20 | can direct you to a relevant blog post or resource available online.
21 |
22 | We are committed to regularly expanding our tutorial collection to provide you with fresh perspectives and practical insights
23 | into leveraging STAC in real-world scenarios. We welcome contributions from users like you, so if you have an idea for a tutorial,
24 | don't hesitate to submit a pull request to the [stac-site repository](https://github.com/radiantearth/stac-site).
25 |
26 | `
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "2.4"
2 | services:
3 | etl:
4 | build:
5 | context: notebooks
6 | dockerfile: Dockerfile
7 | ports:
8 | - "8889:8889"
9 | volumes:
10 | - ./notebooks:/opt/src/etl
11 | working_dir: /opt/src/etl
--------------------------------------------------------------------------------
/eleventy.js:
--------------------------------------------------------------------------------
1 | const markdown = require('./eleventy/markdown.js');
2 | const { version: buildVersion } = require('./package.json');
3 |
4 | const { EleventyRenderPlugin } = require('@11ty/eleventy');
5 | const syntaxHighlight = require('@11ty/eleventy-plugin-syntaxhighlight');
6 | const eleventyEvents = require('./eleventy/events');
7 |
8 | module.exports = function (eleventyConfig) {
9 | eleventyEvents.init(eleventyConfig);
10 |
11 | // Filters & Shortcodes
12 | require('./eleventy/filters.js')(eleventyConfig);
13 | require('./eleventy/localize')(eleventyConfig);
14 | require('./eleventy/categories.js')(eleventyConfig);
15 | require('./eleventy/tutorials.js')(eleventyConfig);
16 | require('./eleventy/shortcodes.js')(eleventyConfig);
17 |
18 | // File Structure
19 | eleventyConfig.addPassthroughCopy('public');
20 | eleventyConfig.addPassthroughCopy({ 'assets/favicon': '/' });
21 | eleventyConfig.addPassthroughCopy({ 'assets/images': 'public/images-original' });
22 | eleventyConfig.addPassthroughCopy({ 'assets/example-catalog': 'public/example-catalog' });
23 | eleventyConfig.addPassthroughCopy('notebooks/src');
24 | eleventyConfig.addWatchTarget('../public/**/*');
25 | eleventyConfig.addWatchTarget('../config/**/*');
26 |
27 | // Settings
28 | eleventyConfig.addGlobalData('buildversion', buildVersion);
29 | eleventyConfig.setUseGitIgnore(false);
30 | eleventyConfig.setDataDeepMerge(true);
31 | eleventyConfig.setLibrary('md', markdown);
32 |
33 | // Plugins
34 | eleventyConfig.addPlugin(syntaxHighlight, {});
35 | eleventyConfig.addPlugin(EleventyRenderPlugin);
36 |
37 | // Options
38 | return {
39 | dir: {
40 | input: 'app',
41 | output: '_site',
42 | includes: '_partials',
43 | layouts: '_layouts',
44 | },
45 | markdownTemplateEngine: 'njk',
46 | htmlTemplateEngine: 'njk',
47 | };
48 | };
49 |
--------------------------------------------------------------------------------
/eleventy/categories.js:
--------------------------------------------------------------------------------
1 | module.exports = function (eleventyConfig) {
2 | eleventyConfig.addFilter('categoryTreeFromPath', function (filePathStem) {
3 | return categoryTreeFromPath(filePathStem, this.ctx);
4 | });
5 |
6 | eleventyConfig.addFilter('categorySlugFromPath', function (filePathStem) {
7 | return categorySlugFromPath(filePathStem, this.ctx);
8 | });
9 |
10 | eleventyConfig.addFilter('categoryNameFromPath', function (filePathStem) {
11 | return categoryNameFromPath(filePathStem, this.ctx);
12 | });
13 |
14 | eleventyConfig.addFilter(
15 | 'fromCategorySlug',
16 | function (collection, category) {
17 | if (!collection) return [];
18 |
19 | let filtered = collection.filter((item) => {
20 | return item.data.categorySlug === category;
21 | });
22 |
23 | return filtered;
24 | }
25 | );
26 |
27 | eleventyConfig.addFilter(
28 | 'fromCategoryTree',
29 | function (collection, category, locale) {
30 | if (!collection) return [];
31 |
32 | let filteredByCategory = collection.filter((item) => {
33 | return (
34 | item.data.categoryTree &&
35 | item.data.categoryTree.split('/').indexOf(category) !== -1
36 | );
37 | });
38 |
39 | if (!locale) return filteredByCategory;
40 |
41 | let filteredByLocale = filteredByCategory.filter(
42 | (item) => item.data.locale === locale
43 | );
44 |
45 | return filteredByLocale;
46 | }
47 | );
48 |
49 | eleventyConfig.addFilter(
50 | 'fromCategoryTreeExact',
51 | function (collection, category) {
52 | if (!collection) return [];
53 |
54 | // if (!locale) return collection;
55 |
56 | let filtered = collection.filter((item) => {
57 | return item.data.categoryTree === category;
58 | });
59 |
60 | return filtered;
61 | }
62 | );
63 |
64 | eleventyConfig.addFilter('findBySlug', function (collection, slug) {
65 | return collection.find((item) => item.categorySlug === slug);
66 | });
67 |
68 | eleventyConfig.addCollection('category', function (collectionApi) {
69 | const tutorials = collectionApi.getFilteredByTag('tutorial');
70 |
71 | const categories = {};
72 |
73 | tutorials.forEach((tutorial) => {
74 | if (categories[tutorial.data.categoryTree]) return;
75 |
76 | categories[tutorial.data.categoryTree] = {
77 | categorySlug: tutorial.data.categorySlug,
78 | categoryTree: tutorial.data.categoryTree,
79 | categoryName: tutorial.data.categoryName,
80 | };
81 | });
82 |
83 | return Object.values(categories);
84 | });
85 | };
86 |
87 | function categoryTreeFromPath(filePathStem, ctx) {
88 | const treeAndId = filePathStem
89 | .replace(/\/*tutorials/, '')
90 | .replace(ctx.page.fileSlug, '')
91 | .replace(/\/+$/, '')
92 | .replace(/^\/+/, '')
93 | .split('/');
94 |
95 | const tree = treeAndId.slice(0, treeAndId.length - 1).join('/');
96 |
97 | return tree;
98 | }
99 |
100 | function categorySlugFromPath(filePathStem, ctx) {
101 | const categoryTree = categoryTreeFromPath(filePathStem, ctx);
102 |
103 | if (!categoryTree || categoryTree.length < 1) return null;
104 |
105 | const slugs = categoryTree.split('/');
106 | const slug = slugs[slugs.length - 1];
107 |
108 | return slug;
109 | }
110 |
111 | function categoryNameFromPath(filePathStem, ctx) {
112 | const categorySlug = categorySlugFromPath(filePathStem, ctx);
113 |
114 | if (!categorySlug) return 'Uncategorized';
115 |
116 | const category = categorySlug
117 | .split('-')
118 | .map((cat) => cat.slice(0, 1).toUpperCase() + cat.slice(1, cat.length))
119 | .join(' ');
120 |
121 | return category;
122 | }
123 |
--------------------------------------------------------------------------------
/eleventy/events.js:
--------------------------------------------------------------------------------
1 | const events = require('events');
2 | const emitter = new events.EventEmitter();
3 |
4 | module.exports = {
5 | emitter,
6 | init: function (eleventyConfig) {
7 | // Hook into the "create filters" lifecycle stage
8 | // usage emitter.on('eleventy.createFilters')
9 | eleventyConfig.addFilter('event_filter', function () {
10 | emitter.emit('eleventy.createFilters', eleventyConfig);
11 | return null;
12 | });
13 |
14 | // Hook into the "create collections" lifecycle stage
15 | // Allows use of the collectionApi without creating new collection
16 | // usage emitter.on('eleventy.createCollections')
17 | eleventyConfig.addCollection(
18 | 'event_collections',
19 | function (collectionApi) {
20 | emitter.emit(
21 | 'eleventy.createCollections',
22 | eleventyConfig,
23 | collectionApi
24 | );
25 | return [];
26 | }
27 | );
28 | },
29 | };
30 |
--------------------------------------------------------------------------------
/eleventy/filters.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const fs = require('fs');
3 | const markdown = require('./markdown.js');
4 |
5 | module.exports = function (eleventyConfig) {
6 | eleventyConfig.addFilter('markdown', function (value) {
7 | return markdown.render(value);
8 | });
9 |
10 | eleventyConfig.addFilter('fromCourse', function (collection, course) {
11 | if (!collection) return [];
12 | if (!course) return collection;
13 |
14 | let filtered = collection.filter((item) => {
15 | return (
16 | item.data.courses && item.data.courses.indexOf(course) !== -1
17 | );
18 | });
19 |
20 | return filtered;
21 | });
22 |
23 | eleventyConfig.addFilter('fromTag', function (collection, tag) {
24 | if (!collection) return [];
25 | if (!tag) return collection;
26 |
27 | let filtered = collection.filter((item) => {
28 | return item.data.tags && item.data.tags.indexOf(tag) !== -1;
29 | });
30 |
31 | return filtered;
32 | });
33 |
34 | eleventyConfig.addFilter('whereLang', function (collection, locale) {
35 | if (!collection) return [];
36 | if (!locale) return collection;
37 |
38 | let filtered = collection.filter((item) => {
39 | return item.data.locale === locale;
40 | });
41 |
42 | return filtered;
43 | });
44 |
45 | eleventyConfig.addFilter('svg', function (filename) {
46 | const svgPath = path.join(
47 | __dirname,
48 | `../assets/svg/${filename.replace('.svg', '')}.svg`
49 | );
50 | const fileContents = fs.readFileSync(svgPath);
51 |
52 | return this.env.filters.safe(fileContents.toString('utf8'));
53 | });
54 |
55 | eleventyConfig.addFilter('notebook', function (filename) {
56 | const sanitizedFilename = filename
57 | .replace(/(\.ipynb|\.html)/, '')
58 | .trim();
59 | const notebookPath = path.join(
60 | __dirname,
61 | `../notebooks/build/${sanitizedFilename}.html`
62 | );
63 | const branch = 'main';
64 | const publicPath = `/notebooks/src/${sanitizedFilename}.ipynb`;
65 | const colabUrl = `https://colab.research.google.com/github/radiantearth/stac-site/blob/${branch}/notebooks/src/${sanitizedFilename}.ipynb`;
66 | const binderUrl = `https://mybinder.org/v2/gh/radiantearth/stac-site/${branch}?filepath=notebooks/src/${sanitizedFilename}.ipynb`;
67 |
68 | const notebookHtml = fs.readFileSync(notebookPath, 'utf8');
69 |
70 | let downloadLink = `Download`;
71 |
72 | let colabLink = `Open in Colab`;
73 | let binderLink = `Launch Binder`;
74 |
75 | let template = `