<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Spectral Reflectance: Developer's Orbit]]></title><description><![CDATA[Code Samples and Advanced Tutorials]]></description><link>https://www.spectralreflectance.space/s/dev-orbit</link><image><url>https://substackcdn.com/image/fetch/$s_!mQ62!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2edd3cb7-2ffd-48ee-aac3-ed1927536d5a_1280x1280.png</url><title>Spectral Reflectance: Developer&apos;s Orbit</title><link>https://www.spectralreflectance.space/s/dev-orbit</link></image><generator>Substack</generator><lastBuildDate>Thu, 25 Jun 2026 07:12:31 GMT</lastBuildDate><atom:link href="https://www.spectralreflectance.space/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Akis Karagiannis]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[spectralreflectance@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[spectralreflectance@substack.com]]></itunes:email><itunes:name><![CDATA[Akis Karagiannis]]></itunes:name></itunes:owner><itunes:author><![CDATA[Akis Karagiannis]]></itunes:author><googleplay:owner><![CDATA[spectralreflectance@substack.com]]></googleplay:owner><googleplay:email><![CDATA[spectralreflectance@substack.com]]></googleplay:email><googleplay:author><![CDATA[Akis Karagiannis]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The EO community probably does not need your weekend package]]></title><description><![CDATA[Weekendware, zero forks, and the open-source stack underneath.]]></description><link>https://www.spectralreflectance.space/p/the-eo-community-probably-does-not</link><guid isPermaLink="false">https://www.spectralreflectance.space/p/the-eo-community-probably-does-not</guid><dc:creator><![CDATA[Akis Karagiannis]]></dc:creator><pubDate>Mon, 25 May 2026 12:07:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tltk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tltk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tltk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!tltk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!tltk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!tltk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tltk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2077949,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.spectralreflectance.space/i/199160514?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tltk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png 424w, https://substackcdn.com/image/fetch/$s_!tltk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png 848w, https://substackcdn.com/image/fetch/$s_!tltk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png 1272w, https://substackcdn.com/image/fetch/$s_!tltk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94553eca-dc42-4486-9039-7fcfc649b38f_1672x941.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The weekendware Monday. Image generated with AI.</figcaption></figure></div><p>Every Monday, or at least it feels like every Monday, I open LinkedIn and see another post announcing a new Earth Observation tool, Python package, dashboard, wrapper, or &#8220;AI-powered workflow&#8221;. Maybe it is not always Monday, but in my head it has become a very specific kind of Monday post: the README is clean, the name is neat, there are a few screenshots, maybe a demo notebook or a small Streamlit app, and the whole thing has that familiar &#8220;I built this over the weekend&#8221; energy.</p><p>Very Garfield of me, I know, but I have started to hate those Mondays.</p><p>Not because people are experimenting. Most of us learned by building small, messy things that nobody else used, and I still think that is one of the best ways to learn. You try something, you break it, you misunderstand the library, you go back to the documentation, you fix one thing and accidentally break another, and somewhere in that loop you start to understand what you are doing. I also do not have a problem with people using LLMs. I use them too. A lot. They are useful, they save time, and they can make several steps of a project much less painful.</p><p>What bothers me is what often happens after the experiment. A learning exercise gets a name, the name gets a logo, the logo gets a GitHub repository, the repository gets a package structure, the package gets a launch post, and before anyone has really asked whether this thing should exist as a tool, it is being presented as one.</p><h2><strong>A GitHub portfolio does not mean what it used to</strong></h2><p>The old advice about building a GitHub portfolio probably needs updating. For years, graduates and early-career developers were told to build public projects because it would help them stand out, and for a long time that advice made sense. A small GitHub project usually showed that someone had spent time with the problem, even if it said very little about whether they were a brilliant engineer. They had written code, fought with dependencies, read documentation, tried to understand an API, and pushed a small idea far enough that it ran on their machine. It also gave them something concrete to talk about in an interview: what they tried, where they got stuck, what they changed, and what they understood by the end.</p><p>With Claude Code, Codex, Copilot, ChatGPT, or any similar tool, a weekend can now produce something that looks like a finished project before the person has really worked through how it should be built. Examples, tests, documentation, a demo app, and even a confident explanation of what the project is for can appear very quickly, giving the repo the shape of something more mature than it really is. From the outside, it becomes harder to tell whether someone understands the code, or whether they managed to prompt their way to something that runs.</p><p>Someone can still learn a lot by building with an LLM, especially if they read the code, change it, test it properly, and understand the trade-offs. The repo, though, is only the visible part. What I would want to know is whether the person can explain what they built: what the model generated, what they changed, why they chose those dependencies, what breaks when the input data changes, which assumptions they made, and why this should be a new package rather than a pull request, a tutorial, or a small example added to an existing project.</p><h2><strong>Using the tool without skipping the science</strong></h2><p>Oddly enough, this makes me think of Star Trek. The characters had access to absurdly advanced tools. They could ask the computer things, run simulations, scan atmospheres, translate languages, diagnose systems, and get answers that hid a lot of work behind the interface. But Spock still knew the science, and Scotty still understood the engineering. The tools made parts of the work easier, but they did not remove the need to understand the work itself.</p><p>That is how I want coding with LLMs to feel, useful and fast and sometimes surprisingly helpful, but never a shortcut around understanding what we are building. If that happens, we are not really becoming more capable; we are mostly getting better at making unfinished work look finished.</p><p>A nice RGB composite, a green NDVI layer, a few polygons on a basemap, a simple dashboard, a STAC search box, a cloud-free-looking image &#8212; in EO, all of this can make a method look like it works before anyone has looked too closely. How is nodata handled? Which CRS assumptions are baked into the workflow? What happens with mixed resolutions? How are clouds and shadows masked? What resampling method is used? Are sensor differences being ignored? Is the metadata complete? Does the method work outside the one AOI used in the demo? Can it scale beyond a notebook? Has it been validated, and against what?</p><p>Maps also have a way of making things look more certain than they are. Put that behind a polished interface and a GitHub repository, and a workflow with untested assumptions can start to look like something people should trust.</p><p>I remember a former colleague saying, years ago, that at the end of the day we are scientists, and we do science. I would probably call myself more of a practitioner than a researcher, but that idea has stayed with me, especially in the parts of EO where the details really count. In operational workflows, we still rely on literature, metrics, validation, interpretation, uncertainty, and domain knowledge. We still need to understand why a method makes sense, where it came from, what it assumes, and when it should not be trusted.</p><p>Before LLMs took over every other technical conversation, we had this whole &#8220;explainable AI&#8221; moment. Maybe that is another article &#8212; I am not sure where all that energy went &#8212; but the concern has not disappeared. We should not trade understanding for speed and then act as if nothing important has changed. A lot of EO work is built on science, best practice, and accumulated mistakes. If LLM-generated code hides those parts from us, the responsibility to understand them is still ours.</p><p>Weekend-package culture feels especially awkward in EO for this reason. Abandoned code is annoying, yes, but the larger problem is that a weak EO workflow can produce outputs that look more reliable than they are. The more polished the surrounding software looks, the easier it becomes for people to trust it too quickly.</p><h2><strong>The part after the announcement</strong></h2><p>I see this a lot while putting together the Spectral Reflectance newsletter. Many of the items I cover, or consider covering, first show up in my LinkedIn feed. I save the link, come back to it later, open the project page, check the repository, and try to decide whether it is something worth sharing. More than once, I have saved a release post, returned to it a month later, opened the GitHub repository, and found that nothing has happened since launch.</p><p>The first few times, I was surprised, which probably says something about my own slightly romantic view of open source. Since then, checking the commit history has become almost automatic. If someone announces a new EO package and the repository has not moved since the day of the announcement, I read that as part of the project too.</p><p>Of course, abandoned code did not begin with ChatGPT. We already had research code with no future, thin wrappers around existing libraries, notebooks that only worked on one machine, and packages with one release and no documentation. We had all of that before ChatGPT. What feels different now is how quickly an idea can become a public repository with the shape of a real project. Getting from that repository to a maintained project, and then to something other people can actually depend on, is still the slow part.</p><h2><strong>Not everything needs to be a tool</strong></h2><p>Part of the confusion, I think, is that we call too many things a &#8220;tool&#8221;. A learning project, a notebook, a reproducible workflow, a benchmark, a dataset, a tutorial, an agent skill, a Python package, and shared infrastructure can all be useful, but they do different jobs, and they should not all be talked about as if they are equally ready for other people to use.</p><p>Many weekend projects are useful precisely because they are rough. The trouble starts when they are placed in the wrong category. A personal experiment becomes a package, the package gets a launch post, the launch post suggests community value, and then the project sits there with no issues answered, no releases, no maintenance, and no clear relationship to the rest of the ecosystem.</p><p>I would rather see people be clearer about what they have actually made. If it is a learning project, say what you learned. If it is a recipe, make it useful enough that someone else can follow it. If it is a workflow, write down the assumptions: clouds, nodata, CRS, resampling, mixed resolutions, validation data. If it is a package, explain why it needs to exist as a package rather than as a contribution to something already used.</p><p>Sometimes the useful thing is not another library at all. It might be a checklist, a reproducible example, or a documented procedure that helps someone repeat the same checks. And when the hard part is agreeing what &#8220;correct&#8221; should look like, a specification may be more useful than generated code.</p><p>I do not see that as a lesser kind of contribution. In EO, a good worked example can save someone days. A short tutorial for an existing library may be more useful than a new wrapper around it, and a small upstream fix might help hundreds of users without ever becoming a LinkedIn announcement. These things just rarely feel as rewarding as launching something with a name of your own.</p><h2><strong>The work that helps but rarely gets attention</strong></h2><p>A new repository gets attention in a way that a documentation fix or a test case in someone else&#8217;s project usually does not. It feels like yours. It has a name, a shape, a page you can point people to, and the small reward of having launched something. A test case for a bug in rasterio, odc-stac, xarray, Dask, TiTiler, or any other part of the stack will probably not get the same attention as a post saying &#8220;I built a new tool&#8221;, even if it helps more people.</p><p>Ryan Abernathey, from Earthmover and the Pangeo community, made this point in <a href="https://vimeo.com/1140103431?fl=pl&amp;fe=cm#t=5h20m27s">a talk about open-source software for Earth Observation</a>. One of his slides placed billion-dollar satellite missions above the open-source projects they depend on: Python, R, GDAL, xarray, PyTorch, Zarr, GeoPandas, Leaflet, QGIS, Pangeo, STAC. Modern EO is critically dependent on open-source software, and, as he put it, <em>&#8220;there is no better software stack you can buy for working with EO&#8221;</em> [than open-source software]. Many of these projects still operate without stable funding, <em>&#8220;which sucks&#8221;</em>, although that also means they cannot be defunded in the usual way; a funny line, until you remember how much depends on them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UfYT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UfYT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png 424w, https://substackcdn.com/image/fetch/$s_!UfYT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png 848w, https://substackcdn.com/image/fetch/$s_!UfYT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png 1272w, https://substackcdn.com/image/fetch/$s_!UfYT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UfYT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png" width="1456" height="820" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:820,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1870170,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.spectralreflectance.space/i/199160514?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UfYT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png 424w, https://substackcdn.com/image/fetch/$s_!UfYT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png 848w, https://substackcdn.com/image/fetch/$s_!UfYT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png 1272w, https://substackcdn.com/image/fetch/$s_!UfYT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fe246e0-2207-408a-8bb5-a6017f937da7_2326x1310.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Credit: Ryan Abernathey. Slide from his talk on open-source software for Earth Observation. [<a href="https://vimeo.com/1140103431?fl=pl&amp;fe=cm#t=5h20m27s">link</a>]</figcaption></figure></div><p>The EO ecosystem already has plenty of shared building blocks worth improving: GDAL, PROJ, rasterio, xarray, Dask, GeoPandas, Open Data Cube, TiTiler, OGC APIs, GeoParquet, Zarr, Pangeo workflows, STAC and public STAC catalogues, cloud-native datasets. No software is perfect, so there is already a lot of useful work to do before creating another isolated package.</p><p>A better error message, a clearer example, a small tutorial using real public data, a documented failure case, a benchmark, a maintenance pull request, or a better explanation of where a method breaks can all help, especially when they land in places where people already work. A large part of modern EO runs on shared infrastructure that nobody fully owns, and many organisations depend on it without always paying back into it.</p><h2><strong>&#8220;Just contribute upstream&#8221; is not enough</strong></h2><p>Telling people to &#8220;just contribute upstream&#8221; is easy advice to give from the outside. In practice, upstream contribution can be intimidating, and the path in is often unclear. Some projects have good contribution guides, some do not, and even when the guides exist, a newcomer may not know which issue is realistic, whether a small documentation fix is welcome, or whether their contribution will sit in a review queue for months. A graduate who wants to get involved in EO open source may not know which projects need help, which maintainers are looking for contributors, or what kind of work would actually help.</p><p>If we want fewer abandoned weekend packages, then we probably need to make useful contribution easier to find. That means visible issues, mentoring, documentation sprints, community calls, small grants, travel support, local meetups, and public recognition for maintenance work, but it also means something more basic: people need to know where to go, who to talk to, and whether the work they are offering is likely to be seen.</p><p>This is why I keep coming back to Fedora as a comparison. If we want people to contribute to the shared EO stack instead of constantly creating isolated tools, what would give a motivated newcomer somewhere to start, a maintainer some help, and a company or foundation a way to support common infrastructure without having to own it?</p><h2><strong>Why Fedora keeps coming to mind</strong></h2><p>For readers outside the Linux world, <a href="https://fedoraproject.org/">Fedora</a> is a Linux distribution and open-source project with a large contributor community and a close relationship with Red Hat. People use it as an operating system, but Fedora is also where a lot of the surrounding work happens: packaging, testing, documentation, community events, governance, QA, and upstream collaboration. That is where Fedora becomes useful as a comparison. It is not just software being published; it is a system that helps people contribute to shared software.</p><p>I do not think Earth Observation needs a literal Fedora, and the comparison breaks if you push it too far, but Fedora shows how much easier contribution becomes when people are not left to figure everything out alone. There are places to meet, roles to grow into, review and QA habits to learn from, and a wider understanding that helping a shared project is not only about code. It can also be packaging, testing, documentation, support, events, and just being present enough for others to know where to go.</p><p>People from Fedora or Red Hat would probably push back on any simple version of this comparison. Fedora is not just &#8220;a community with a company behind it&#8221;, and Red Hat is not just a sponsor whose logo sits on the website. Fedora is upstream of Red Hat Enterprise Linux, Red Hat is the primary sponsor, and Red Hat also pays people to work on Fedora itself and on parts of the wider Linux stack, including the Linux kernel. Fedora still has its own community structures, governance, working groups, events, documentation efforts, QA habits, and contributor pathways. For EO, the useful lesson sits in that mix. Contribution becomes easier when there are named places to contribute, visible roles, review processes, social trust, and some institutional support for the unglamorous work that keeps the shared stack alive. Sometimes that support is money for events or infrastructure; sometimes it is paid engineering time.</p><p>EO could learn from that while still recognising that the geospatial world is not starting from zero. OSGeo has already done far more for open geospatial software than any new essay or proposal needs to rediscover. OGC provides standards. STAC has become a practical language for data discovery and access. Pangeo has helped shape open, scalable geoscience workflows. The Cloud-Native Geospatial community has pushed many of these conversations forward. Organisations such as Radiant Earth, Source Cooperative, Development Seed, Element 84, Earthmover, and others already play important roles in data, tooling, infrastructure, and practice.</p><p>So the question is narrower than creating a new organisation to replace what exists. Around modern EO work &#8212; STAC, COGs, Zarr, xarray, Dask, TiTiler, public catalogues, reproducible workflows, validation, metadata, agentic coding, and cloud-native processing &#8212; are the contribution paths visible enough? If a motivated graduate or practitioner wants to help, is it obvious where they should go? If someone is about to build yet another package, is there a place that helps them ask whether the better contribution is a pull request, a recipe, a skill, a specification, or a benchmark?</p><h2><strong>An EO contribution commons, perhaps</strong></h2><p>I am not sure what the right shape would be, but the idea I keep circling is a more visible shared layer around the things the EO community already depends on. I am not imagining a central authority or a committee deciding which tools are legitimate. I am imagining somewhere people can see which projects need help, which issues are genuinely suitable for newcomers, which workflows need better examples, and where maintainers could use support.</p><p>In practice, that could mean curated lists of projects that need help, contribution sprints at existing events, small grants for documentation and tests, templates for common EO workflows, and public recognition for maintenance work. </p><p>Programmes like ECMWF&#8217;s Code for Earth already point in this direction. They do not solve the whole problem, but they show how institutions can support open-source Earth-science software without owning every output, with defined challenges, mentors, review, deadlines, and visibility. It is not just volunteer energy; it involves institutional time, meetings, feedback, and coordination. That kind of structure is very different from a launch post and an abandoned repository.</p><p>This will never give the same quick reward as launching a new tool, which is part of the problem. The boring work is what makes the ecosystem usable, and companies or foundations could support it without owning it. They could fund maintainers, sponsor travel, support sprints, publish roadmaps, identify where contributions are needed, and pay for documentation, benchmarks, and maintenance. I do not think EO needs one company trying to play Red Hat; it is more likely to need several anchor institutions willing to support the shared stack they already depend on.</p><h2><strong>What should count as evidence of ability now?</strong></h2><p>For individuals, especially early-career people, the advice probably needs to change too. Build things, use LLMs, learn in public, make strange prototypes, write small scripts, and try ideas before they are fully formed. But do not assume that a new repository is the best way to show ability. It can be, as long as you can explain the judgement behind it. Show that you understand the code, that you know the ecosystem well enough to decide when not to create something new, that you can improve something that already exists, and that you can describe the limits of your own work without hiding behind a polished README.</p><p>I still want people to make things, and I do not want an EO community where everyone waits for permission before trying an idea. That would be awful. The field needs experimentation, weird prototypes, personal projects, and people learning by doing. We just need to be more careful with what happens after the experiment. Not every workflow needs to become a package, not every package deserves a launch post, and not every demo should be presented as a tool. Sometimes the better contribution is to explain the method, document the failure, upstream the fix, or write down the procedure clearly enough that someone else can repeat it.</p><p>The question I want more of us to ask before presenting something as a new EO tool is simple: what is this, really? If the honest answer is &#8220;a weekend experiment&#8221;, that is fine. Say that. For a learning project, share what you learned. For a workflow, make it reproducible. For a package, explain why it should exist and who will maintain it. And if it is meant for the community, show how it connects to the community.</p><p>The LLM era has made it very easy to make software appear, while the slower work remains: maintenance, validation, messy remote sensing details, and earning trust. Making something exist is no longer the hard part. Making something worth depending on still is.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.spectralreflectance.space/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Join 1,300+ readers following Spectral Reflectance</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Streaming satellite imagery into QGIS using STAC and Cloud-Optimised GeoTIFFs]]></title><description><![CDATA[I was today years old when I realised you can stream a COG into QGIS.]]></description><link>https://www.spectralreflectance.space/p/streaming-satellite-imagery-into</link><guid isPermaLink="false">https://www.spectralreflectance.space/p/streaming-satellite-imagery-into</guid><dc:creator><![CDATA[Akis Karagiannis]]></dc:creator><pubDate>Thu, 03 Apr 2025 19:04:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was playing around with <a href="https://developmentseed.org/titiler/">TiTiler</a> for visualising Cloud-Optimised GeoTIFFs (COGs) in the browser. While reviewing resources on how it works, I stumbled upon a <a href="https://youtu.be/Ix-4L2dRmRg?t=513">video</a> where someone casually loaded a COG from their own S3 bucket into QGIS.</p><p>I paused the video&#8230; <br>Stared at it&#8230; <br><strong>You can do that?!</strong></p><p><em><strong>TLDR:</strong> I searched a STAC Catalog for Sentinel-2 and Landsat imagery, accessed their COG assets and programmatically built a QGIS project that streams false-colour composites - no (persistent) download required.</em></p><div><hr></div><h3><strong>Steps to stream a Cloud-Optimised GeoTIFF (COG) in QGIS</strong></h3><ol><li><p>Open QGIS</p></li><li><p>Go to <strong>Layer &#8594; Add Layer &#8594; Add Raster Layer &#8230;</strong></p></li><li><p>In the dialog: </p><ol><li><p><strong>Source type:</strong> Protocol: HTTP(S), cloud, etc.</p></li><li><p><strong>Type:</strong> HTTP/HTTPS/FPT</p></li><li><p><strong>URI:</strong> https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/36/R/VU/2025/3/S2C_36RVU_20250313_0_L2A/TCI.tif</p></li></ol></li><li><p>Click <strong>Add</strong></p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!23lZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!23lZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png 424w, https://substackcdn.com/image/fetch/$s_!23lZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png 848w, https://substackcdn.com/image/fetch/$s_!23lZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png 1272w, https://substackcdn.com/image/fetch/$s_!23lZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!23lZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png" width="1456" height="802" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:802,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1988042,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.spectralreflectance.space/i/160484131?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!23lZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png 424w, https://substackcdn.com/image/fetch/$s_!23lZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png 848w, https://substackcdn.com/image/fetch/$s_!23lZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png 1272w, https://substackcdn.com/image/fetch/$s_!23lZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab9845df-a4f2-4443-8c62-0fa8358cdd4a_2487x1370.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Adding a raster layer to QGIS</figcaption></figure></div><p><em>Or, using AWS S3 Protocol (works for the same URI once we separate the S3 Bucket name and Object key)</em></p><ol start="3"><li><p>In the dialog: </p><ol><li><p><strong>Source type:</strong> Protocol: HTTP(S), cloud, etc.</p></li><li><p><strong>Type:</strong> AWS S3</p></li><li><p><strong>Bucket or container:</strong> sentinel-cogs</p></li><li><p><strong>Object key:</strong> sentinel-s2-l2a-cogs/36/R/VU/2025/3/S2C_36RVU_20250313_0_L2A/TCI.tif</p></li></ol></li><li><p>Click <strong>Add</strong></p></li></ol><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nnS_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nnS_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png 424w, https://substackcdn.com/image/fetch/$s_!nnS_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png 848w, https://substackcdn.com/image/fetch/$s_!nnS_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png 1272w, https://substackcdn.com/image/fetch/$s_!nnS_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nnS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png" width="1456" height="802" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:802,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2796392,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.spectralreflectance.space/i/160484131?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nnS_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png 424w, https://substackcdn.com/image/fetch/$s_!nnS_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png 848w, https://substackcdn.com/image/fetch/$s_!nnS_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png 1272w, https://substackcdn.com/image/fetch/$s_!nnS_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3ad45531-953a-4474-9837-96f24ec8c37e_2487x1370.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Adding a raster layer to QGIS</figcaption></figure></div><div><hr></div><p>And then I wondered&#8230; </p><blockquote><p><em><strong>Could I do this programmatically?</strong></em> </p></blockquote><p>Could I:</p><ul><li><p>Query a STAC catalog for relevant imagery,</p></li><li><p>Select the COG assets I care about and </p></li><li><p>Build a QGIS project that streams these COGs &#8212; on-the-fly?</p></li></ul><p>Turns out&#8230; <strong>yes</strong>.</p><p>I&#8217;m not sure whether this is relevant to others, or if people have similar use cases, but I often find myself:</p><ul><li><p>Quickly browsing satellite images when starting a new project</p></li><li><p>Overlaying ML model outputs or vector masks on imagery to visually inspect them</p></li><li><p>Or simply loading multiple scenes to compare change over time</p></li></ul><p>Traditionally, that means downloading scenes, unzipping folders, organizing files, and manually dragging them into QGIS.</p><p>Now I can build a QGIS project with a script, giving me a much better starting point, with the key layers already in place.</p><p>Head over to the Jupyter Notebook to try it out for yourself &#8594; <a href="https://gist.github.com/xen0f0n/3d872d38f033d9231d302315b5ab80d3">streaming-COGs-in-QGIS.ipynb</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xaqR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xaqR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png 424w, https://substackcdn.com/image/fetch/$s_!xaqR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png 848w, https://substackcdn.com/image/fetch/$s_!xaqR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png 1272w, https://substackcdn.com/image/fetch/$s_!xaqR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xaqR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png" width="1456" height="801" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:801,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:4845995,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.spectralreflectance.space/i/160484131?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xaqR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png 424w, https://substackcdn.com/image/fetch/$s_!xaqR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png 848w, https://substackcdn.com/image/fetch/$s_!xaqR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png 1272w, https://substackcdn.com/image/fetch/$s_!xaqR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F79cc03f3-feb1-497f-af14-da6897dd534c_2490x1370.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Screenshot of the loaded QGIS project that was built programmatically</figcaption></figure></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.spectralreflectance.space/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Spectral Reflectance! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p>]]></content:encoded></item><item><title><![CDATA[How to download an image from the EnMAP data archive]]></title><description><![CDATA[Users can now access the EnMAP data archive!]]></description><link>https://www.spectralreflectance.space/p/how-to-download-an-image-from-the-enmap-data-archive-e7417ae7c1d5</link><guid isPermaLink="false">https://www.spectralreflectance.space/p/how-to-download-an-image-from-the-enmap-data-archive-e7417ae7c1d5</guid><dc:creator><![CDATA[Akis Karagiannis]]></dc:creator><pubDate>Fri, 11 Nov 2022 16:18:26 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/aa0620e1-a7e9-4fa9-bb3d-4c58a8b299b5_800x443.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aRm1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRm1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aRm1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aRm1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aRm1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRm1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aRm1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aRm1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aRm1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aRm1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72d07c2e-f3a6-488a-ba0f-b111c6c05f6f_800x443.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">&#8220;EnMAP&#8202;&#8212;&#8202;One im&#173;age, a wealth of in&#173;for&#173;ma&#173;tion&#8221; [<a href="https://www.dlr.de/content/en/images/2022/02/enmap-firstlight-wealth-of-information.html">link</a>]. Credit:&nbsp;DLR</figcaption></figure></div><p>Users can now access the EnMAP data archive! [<a href="https://medium.com/spectral-reflectance/spectral-reflectance-newsletter-7-e0380200a604#a1d1">link</a>]</p><p>People have been curious about EnMAP images since its launch in April and are very keen to explore this new and rich data source. It is only a matter of time before the first applications and use cases start coming out, showcasing EnMAP&#8217;s value and great potential! We have already had a peek;&nbsp;<br><em><a href="https://www.enmap.org/news/2022-09-22/">Makhtesh Ramon (Israel)&#8202;&#8212;&#8202;EnMAP records the largest erosion cirque in the world</a>,&nbsp;<br><a href="https://www.enmap.org/news/2022-10-19/">EnMAP images from the Lower Lausitz&#8202;&#8212;&#8202;An East-German region in transition</a></em>.</p><p>Since early last week, people have been able to sign up to EnMAP&#8217;s Instrument Planning platform and access the archive. Follow the rest of the article for instructions on how to download your first EnMAP image!</p><p>First, take a look at the <a href="https://www.enmap.org/data/doc/EN-GS-UM-6020_Portals_User_Manual_v1.1.pdf">Portals User Manual</a>;&nbsp;<br><em>5.6 Available User Roles</em> for the role descriptions and at <em>6. Step by Step Manual for the EnMAP Data Access and Ordering Process</em> for instructions on how to register, request a role assignment and search the EnMAP data archive.</p><p>Register at <a href="https://planning.enmap.org/">https://planning.enmap.org/ips/</a></p><p>Next, view the GIF below for how to search through the EnMAP data archive, select order options and place your order! <em>(click on the GIF to view on full-screen)<br>NOTE: You don&#8217;t have to draw a polygon on the map; this way, you will get all available results.</em></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-0JR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-0JR!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif 424w, https://substackcdn.com/image/fetch/$s_!-0JR!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif 848w, https://substackcdn.com/image/fetch/$s_!-0JR!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif 1272w, https://substackcdn.com/image/fetch/$s_!-0JR!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-0JR!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-0JR!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif 424w, https://substackcdn.com/image/fetch/$s_!-0JR!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif 848w, https://substackcdn.com/image/fetch/$s_!-0JR!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif 1272w, https://substackcdn.com/image/fetch/$s_!-0JR!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd29df0b0-64e7-4922-b1aa-ce67cf2e6a69_2546x1173.gif 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>Although it is stated that <em>&#8220;<a href="https://www.dlr.de/content/en/articles/news/2022/04/20221102_ready-for-science.html">Archived data can be accessed immediately free of charge</a>&#8221;</em> it took about 30 hours for my order to move from &#8216;SUBMITTED&#8217; &#8594; &#8216;IN PROCESSING&#8217; &#8594; &#8216;PROCESSED&#8217;.&nbsp;<br>I guess a lot of people have been downloading EnMAP data these days!</p><p>Finally, once your order is processed, you will receive an email with the address of the FTP Delivery Server and the path to the data <em>(e.g. ftps://<a href="http://xen0f0n-cat1distributor@download.dsda.dlr.de//dims_op_oc_oc-en_700329792_1.tar.gz">xen0f0n-cat1distributor@download.dsda.dlr.de//dims_op_oc_oc-en_700329792_1.tar.gz</a>)</em></p><p>Follow <a href="https://eoweb.dlr.de/egp/docs/user/downloading_ordered_data.html">this guide</a> for a list of FTP clients to download your order.&nbsp;<br>Alternatively, you can use <strong>wget</strong> to do the same from the command line.</p><pre><code>wget &#8212; user {username}-cat1distributor &#8212; password {password} {ftps_link}</code></pre><p>Researchers just got an early Christmas present&#8230; and it has 230 spectral channels!</p>]]></content:encoded></item><item><title><![CDATA[How to download Earth Observation datasets using Python with Radiant MLHub, TorchGeo and Dataset4EO]]></title><description><![CDATA[I tried three different Python libraries to download Remote Sensing datasets; radiant_mlhub, torchgeo and dataset4eo.]]></description><link>https://www.spectralreflectance.space/p/how-to-download-earth-observation-datasets-using-python-with-radiant-mlhub-torchgeo-and-dataset4eo-41ed5cd7e724</link><guid isPermaLink="false">https://www.spectralreflectance.space/p/how-to-download-earth-observation-datasets-using-python-with-radiant-mlhub-torchgeo-and-dataset4eo-41ed5cd7e724</guid><dc:creator><![CDATA[Akis Karagiannis]]></dc:creator><pubDate>Sun, 23 Oct 2022 11:31:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7bd52a0f-2906-477e-8cde-88fe355bb138_800x400.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!DW7L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DW7L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png 424w, https://substackcdn.com/image/fetch/$s_!DW7L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png 848w, https://substackcdn.com/image/fetch/$s_!DW7L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png 1272w, https://substackcdn.com/image/fetch/$s_!DW7L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DW7L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DW7L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png 424w, https://substackcdn.com/image/fetch/$s_!DW7L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png 848w, https://substackcdn.com/image/fetch/$s_!DW7L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png 1272w, https://substackcdn.com/image/fetch/$s_!DW7L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aaaf7a5-748b-4c8d-a583-b6fbdd494b3b_800x400.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">Samples from the SEN12-FLOOD dataset</figcaption></figure></div><p>In a recent <a href="https://arxiv.org/abs/2210.04936">paper</a>, titled &#8220;EarthNets: Empowering AI in Earth Observation&#8221;, Xiong et al. put together a <a href="https://earthnets.retool.com/embedded/public/676aa812-0dca-4e3b-a596-b043d852571d">queryable collection</a> of 401 Remote Sensing datasets (featured in the <a href="https://medium.com/spectral-reflectance/spectral-reflectance-newsletter-4-cd66ff98e95#3102">latest Spectral Reflectance Newsletter</a>). As part of that, they also developed Dataset4EO&#8202;&#8212;&#8202;a Python library that provides an easy-to-use way of loading datasets. Having this as motivation I tried three different Python libraries we can use to download about 80 different Remote Sensing datasets; <em>radiant_mlhub</em>, <em>torchgeo</em> and <em>dataset4eo</em>.</p><p>These three Python libraries try to accomplish slightly different things;&nbsp;<br><em>radiant_mlhub.Dataset</em> provides access to 64 datasets for users to download locally, while <em>dataset4eo</em> and <em>torchgeo</em> go one step further; Both provide a PyTorch DataLoader for each of the available datasets. So, instead of having users write their own custom PyTorch Dataset/DataLoader classes, they can use pre-built ones. By doing so, users would have a streamlined way of downloading a dataset and feeding their models. Cool, right?</p><h3>Radiant MLHub</h3><p>The radiant_mlhub library just provides the means to download datasets, without any fancy DataLoader wrappers on top of it or Deep Learning models shipped with it.<br>After getting an API key things are fairly straightforward. <a href="https://mlhub.earth/datasets">Here</a> you can have a look at the 64 available datasets through radiant_mlhub. In the following code blocks there are instruction on how to request an API key, list the available datasets and download the CV4A Kenya Crop Type Competition dataset.</p><h3>Torchgeo</h3><p><a href="https://github.com/microsoft/torchgeo">Torchgeo</a> is a PyTorch domain library focused on geospatial data that provides both datasets and (pre-trained) models.&nbsp;<br>One of the great things about torchgeo is that there are available PyTorch DataLoaders for the datasets; meaning that once you download a dataset you can use an out-of-the-box DataLoader to train your model (in PyTorch)! However, in some cases torchgeo doesn&#8217;t provide a &#8220;download method&#8221; and expects that users have already downloaded the dataset. In addition, to download some datasets you need to have a Radiant MLHub API key, as a few of them are fetched from there. <a href="https://torchgeo.readthedocs.io/en/latest/api/datasets.html">Here</a> is a list of the datasets available through TorchGeo.&nbsp;<br>Once again, using torchgeo datasets is simple. Have a look at the code below for how to download the same dataset as before and iterate through a PyTorch DataLoader.</p><p><em>NOTE: At the moment of this writing, TorchGeo only supports radiant-mlhub 0.2.1&#8211;0.4. Versions 0.5+ won&#8217;t work! [<a href="https://github.com/microsoft/torchgeo/issues/711">link</a>]</em></p><p>To learn more about TorchGeo, <a href="https://arxiv.org/abs/2111.08872">here</a> is their paper on arxiv.</p><h3>Dataset4EO</h3><p>The EarthNets platform (part of which is dataset4eo) is designed to provide an easy way to apply (deep learning) models to Remote Sensing datasets. Furthermore, EarthNets pushes for a more consistent evaluation of deep learning methods on remote sensing data by selecting 5 different datasets as benchmarks on 3 different tasks; image classification, object detection ad semantic segmentation. As the authors state, &#8220;there are some difficulties in loading RS datasets, especially for researchers in other communities&#8221; and &#8220;it would be helpful to download, decompress and split the dataset [into train/val/test] automatically&#8221;.<br>The are several aspects of dataset4eo that make it very similar to TorchGeo; both provide a PyTorch (or PyTorch compatible) DataLoader and deep learning models to use out-of-the-box.<br>Here, however, we are more interested in the &#8220;dataset loading&#8221; part of it.</p><p>At the moment, I&#8217;m afraid that dataset4eo isn&#8217;t a matured enough codebase. While trying to run the code example and download the LandSlide4Sense dataset I was faced with several errors. Eventually I managed to run the LandSlide4Sense example and iterate through a PyTorch DataLoader. Check this ticket <a href="https://github.com/EarthNets/Dataset4EO/issues/2">here</a> for the steps I followed to work around the errors I was getting.</p><p>In the table below, I have put together a short comparison among the three libraries.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g669!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g669!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png 424w, https://substackcdn.com/image/fetch/$s_!g669!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png 848w, https://substackcdn.com/image/fetch/$s_!g669!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png 1272w, https://substackcdn.com/image/fetch/$s_!g669!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g669!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png" width="611" height="372" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:372,&quot;width&quot;:611,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!g669!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png 424w, https://substackcdn.com/image/fetch/$s_!g669!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png 848w, https://substackcdn.com/image/fetch/$s_!g669!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png 1272w, https://substackcdn.com/image/fetch/$s_!g669!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe6daaa09-7e3c-4135-86c5-74d55737923f_611x372.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Summary table for Radiant MLHub, TorchGeo and Dataset4EO.</figcaption></figure></div>]]></content:encoded></item></channel></rss>