GeeMap is an open-source Python library that provides tools for interactive mapping with Google Earth Engine (GEE), which is a platform for earth science data and analysis … and today you are going to hear from the creator of GeeMap!
Connect with Qiusheng Wu here: https://wetlands.io/
This episode is sponsored by Planet. Learn more at https://www.planet.com/gis/
Recommended Listening
- Introduction to Google Earth Engine
- Introduction to Sentinel Hub
- Planet – Imaging everything every day (almost)
- Introduction to Microsoft’s Planetary Computer
In Conversation
What GeeMap Is and Why It Was Built
Daniel: Let’s start with the obvious question — what is GeeMap and why did you build it?
Qiusheng: GeeMap is an open-source Python package for interactive visualization and analysis with Google Earth Engine. I built it because when I started using Earth Engine in 2017, the Python API only supported computation — there was no way to visualize your data interactively. JavaScript had always been the first-class citizen of Earth Engine, with full documentation, examples, and tutorials. Python had no native visualization support. I teach my students Python, and I kept hitting this wall: you could do the computation but you couldn’t see the results on a map. So I started experimenting with Folium, ipyleaflet, and ipywidgets to bridge that gap. I initially called the package GEE-Hydro because I was doing hydrological research, then generalized it and renamed it GeeMap.
Daniel: So it was born out of genuine frustration — you needed it for your own teaching and research.
Qiusheng: Exactly. I built it to help myself and my students. I would add a new feature and then teach it in class the next day. After I posted it on GitHub, people found it, started providing feedback, and I kept improving it — releasing new versions every week or two. If other people found it useful, great. If not, at least it benefited me and my students.
How the Cloud Streaming Model Works
Daniel: Can you walk us through what actually happens when you use GeeMap to visualize data? Are you downloading imagery to your computer?
Qiusheng: No — it’s streaming, exactly like watching a movie on Netflix. All the data stays in Google’s cloud. When you visualize an image, you’re not downloading gigabytes of satellite data to your laptop. You’re requesting map tiles based on your current view and zoom level, and those tiles stream to your browser as PNGs. The computation happens on Google’s servers in real time, and only the rendered result comes back to you. The analogy I like: it’s like having access to an entire movie library for free — the movie isn’t yours to keep, but you can watch anything in the catalog instantly.
Daniel: And when I see a global basemap without a single cloud in it — that’s not a real photograph taken on one day?
Qiusheng: Correct. Those composites are assembled pixel by pixel — each pixel comes from the best-quality, cloud-free image at that location during a given time period. Earth Engine does this by applying a median filter across thousands of images. It’s especially well-suited to this kind of pixel-based, location-based analysis, which is why you can get results like a cloud-free mosaic of the entire globe.
Client-Side vs. Server-Side Objects
Daniel: You mentioned client-side and server-side objects. What does that distinction mean for someone new to Earth Engine?
Qiusheng: In regular Python, when you define a variable it lives in your computer’s memory — you can inspect it, print it, use it immediately. In Earth Engine, when you define a variable pointing to a 10-gigabyte satellite image or a collection of millions of images, that variable is just a reference. The data stays on Google’s servers. You’re telling Earth Engine “here’s what I want to work with,” but nothing actually moves until you explicitly request it — either by exporting results or by rendering tiles for visualization.
Daniel: Is that why you shouldn’t use regular Python for-loops in Earth Engine code?
Qiusheng: Yes. A for-loop runs computation sequentially — one step waiting for the last to finish. Earth Engine’s power is parallelism: it subdivides your area of interest into thousands of tiles, sends each tile to a different server, and returns all the results in seconds. You should use the map function instead, which Earth Engine can distribute across its entire infrastructure. This is one of the most important things for beginners to understand — it’s a fundamentally different programming model from what they’re used to.
Working with Earth Engine’s Data Catalog
Daniel: How does someone access data from the Earth Engine catalog through GeeMap?
Qiusheng: The catalog has over 90 petabytes of data — 90,000 terabytes — and it grows daily. Every dataset has a unique asset ID, like a social security number. Once you know the ID, you can load any dataset in one line of code: call map.add_layer, pass in the asset ID and your visualization parameters — which bands to display, the color palette, min and max values — and the layer appears on your map. It’s like having the entire Netflix library for free. You just need to know what you want to watch.
Daniel: You mentioned creating a cloud-free mosaic of Tennessee going back four decades — in one line of code. Is that really possible?
Qiusheng: Yes. You filter the image collection to your region, filter by date range, filter by cloud cover — say, less than 10 percent — and apply a median composite. Earth Engine finds the median pixel value across all qualifying images at every location and assembles them into a seamless result. What would take days of downloading and local processing takes seconds in Earth Engine. That said, Earth Engine isn’t suitable for everything — flow-path analysis for hydrology is difficult because water flows across tile boundaries. But for time-series analysis, change detection, and spectral indices, it’s exceptional.
Adding Local Data and Exporting Results
Daniel: What about researchers who have their own local datasets — can they bring those into GeeMap?
Qiusheng: There are two approaches. For small vector files — a GeoJSON or shapefile with relatively few vertices — GeeMap can convert them to Earth Engine objects on the fly using helper functions. For larger files or raster data, you need to upload to your Earth Engine account first through the Code Editor. Once uploaded, you control the sharing: public, specific email addresses, or a Google group — very similar to how Google Drive permissions work.
Daniel: And when you want to get results out — what export formats are available?
Qiusheng: For raster you can export GeoTIFF or Cloud Optimized GeoTIFF; for vector, GeoJSON, Shapefile, or CSV. You can send results to Google Drive, Google Cloud Storage, or your local machine. My recommendation is to do as much computation as possible in the cloud and only export summary results — statistics, derived indices, processed outputs — rather than raw imagery. Downloading large amounts of raw data defeats the purpose of cloud computing and can hit rate limits. Think of it this way: if you’re calculating population counts per country, export the numbers, not the underlying population density raster.
Google’s Official Adoption of GeeMap
Daniel: Tell us about Google officially adopting GeeMap — that’s a remarkable story.
Qiusheng: I started collaborating with the Earth Engine team in June 2023. They wanted to improve Python support for Earth Engine, and since GeeMap already had a large community, they reached out. We spent several months meeting weekly to reorganize the package into two components: core features that the Earth Engine team now helps maintain, and extended features that I and the community continue to develop. In October 2023, they announced it at the Geo for Good Summit. Now if you go to the Earth Engine documentation, Python examples appear alongside JavaScript — and those Python examples use GeeMap.
Daniel: And it’s pre-installed in Google Colab now?
Qiusheng: Yes, and that’s a big deal for teaching. You can open any notebook from the Earth Engine documentation, click “Open in Colab,” and run it immediately — no installation required. The Colab team also added a secrets manager so you can save your authentication token and it authenticates automatically every session. What used to require clicking through eight different prompts now just works. It makes running workshops and university courses much simpler.
Open-Source Philosophy and What It Has Meant
Daniel: What has all of this meant for you personally and professionally?
Qiusheng: It opened up opportunities I never planned for — collaborations, funding, students reaching out. But the motivation was never recognition. I came from a poor family; I didn’t have a computer until college in 2003. I know there are many people around the world without access to high-end hardware. If someone has a browser and internet access, they should be able to do serious geospatial analysis. That’s why I try to make everything run online — no local installation required. Free data, free compute, free tools: if you have some time and patience, you can make an impact.
Daniel: You post constantly — notebooks, short screen recordings, tutorials — to show people how to actually use these tools.
Qiusheng: I post things as a record, honestly — so I can send links to my students when they have questions. It saves me time in the long run. But if it helps the wider community too, that’s wonderful. The advice I’d give anyone starting out: don’t do it to become famous, because that’s unpredictable. Do it because it genuinely helps you and others. When you share your work, your time multiplies — instead of helping just yourself, you can help thousands of people. And the community gives back in ways you didn’t expect.





