Hacker News new | past | comments | ask | show | jobs | submit login
Guide to Making 3D Maps with Satellite Imagery in R (tylermw.com)
232 points by tylermw 36 days ago | hide | past | web | favorite | 29 comments

Author here, I wrote this to show how you can use the rayshader package to generate 3D maps in R using free and open data (in this case, Landsat 8 imagery and SRTM elevation data). You can check out rayshader's Github repo here:

Github: https://www.github.com/tylermorganwall/rayshader

And browse the documentation (with rendered examples) and README on its website: https://www.rayshader.com

Cudos to this code and the beautiful artwork (great README file for a github repository, btw). As somebody who worked a bit in visualization in scipy and blender, I can appreciate how much hard work have been put there. I did visualization as a small side project during my astrophysics PhD, and it was a pain in the ass to get anything good looking out of the data.

Today there is a nice GIS plugin for blender which makes life much easier:


Thanks! I always enjoy when a library has a solid README with examples, especially when it's a visualization library. Wanted to make sure I had one myself.

On a side note - you don't know a free tile server that serves elevation tiles, do you?

This is the best option for free terrain tiles. There are four formats, though "Terrarium" is the most used. It maps RGB pixels in a PNG to raw elevation values using this formula [0]. If you're using Mapbox GL, you can just point your map to [1] to fetch the tiles, and then use it as a hillshade. I do that in my topographic map style [2].

[0]: https://github.com/tilezen/joerd/blob/master/docs/formats.md...

[1]: https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/...

[2]: https://nst-guide.github.io/osm-liberty-topo/

Additionally, the `elevatr` package (https://github.com/jhollist/elevatr) serves tiles directly from AWS Open Data Terrain Tiles. I don't believe it requires a key.

Here are a couple more ways to get SRTM tiles:

- OpenTopography (also has 3DEP/LIDAR data): https://portal.opentopography.org/datasetMetadata?otCollecti...

- SRTM 30M tile tool: https://dwtkns.com/srtm30m/

Related: in my masterclass (free and open source, materials here: https://github.com/tylermorganwall/MusaMasterclass) I also walk through how you can convert LIDAR data into hi-res DEMs to generate 2D and 3D maps

Unfortunately, SRTM 30M tile tool is asking for credentials for me.

You can also query elevation tiles using the `elevatr` package and use them in a similar way.

Mapbox has an API you can query from--I believe they have a free tier. The `ceramic` package makes this easy to pull from, but you need to get a Mapbox key first:


This is super interesting - I had no idea you could do this kind of thing with R. Very cool and a great step-by-step guide.

I also second the "rite of passage to fight with GDAL" sentiment :)

I'd also recommend Robert Simmon's introduction to GDAL for stitching, etc: http://www.openvisconf.com/2017/#rsimmon-video-item

The R GIS ecosystem has seen great strides recently! I've just been working on one part of it: 3D visualization and computational hillshading/raytracing.

And that video looks like a great resource--I'll put it on my watch list.

You should check out Mapdeck [0]. It's R bindings to deck.gl, a JS 2D/3D geo-visualization package that I've been contributing to. As of version 8.1, there's a TerrainLayer [1] to render an interactive map with a 3D terrain mesh.

[0]: https://github.com/SymbolixAU/mapdeck [1]: https://deck.gl/#/documentation/deckgl-api-reference/layers/...

A self plug. I'd once put together a ppt that's cherry picked 'can R do this kind of examples' https://speakerdeck.com/amrrs/r-in-the-real-world

Here I thought you'd be doing photogrammetry or something to produce 3d maps directly from 2d imagery.

Maybe title should be "making 3d maps with satellite imagery and 3d maps" ;)

Is this similar to what vricon[1] does?

I was searching around and found something noting they won a contract to build the Army's One World Terrain 3d model. This OWT appears to be some kind of classification for applying sat imagery over terrain data sets, maybe?

[1] https://www.vricon.com

It looks like they're a firm that does large-scale photogrammetry to build 3D models worldwide--this is just a tutorial on how to combine existing topographic datasets (e.g SRTM or a USGS elevation product) with satellite imagery to generate small-scale 3D maps in R. Similar in concept, vastly different in scale and execution

Ok thanks for the explanation! I read through the tutorial and it looks like a fun project to get started in.

One thing also for readers is that https://dwtkns.com/srtm30m requires an account with https://urs.earthdata.nasa.gov to download tiles.

Good to know, thanks! I'll add a note mentioning the need for an account.

Has this been tried on something like a cityscape?

If so, it seems like you could fly a drone with two cameras at relatively low altitude and get insane resolution for things like cityscapes at a pretty low cost

====== EDIT: Meant to add that your webpage discussion was great & thanks for sharing!

Most "satellite view" imagery of cities is actually done with planes and drones. I just looked up a 3D model of my house in Apple Maps and can see stuff with a few centimeter resolution, which is much higher than any satellite can do.

Thanks! For your question, check out Open Drone Map, which is an open source toolkit for doing just that:


I also provide instructions in my (free and open source!) masterclass on how to take LIDAR data from cities and build 3D surface models that includes buildings:

Github Course Materials:


Is anyone else getting a mandatory login page when trying using the SRTM tile downloader?

this is super cool. i think we should do this in tiles and after that assemble a map of all of the US. The Sattelite data seems to be there, it's just time to download, build + stich, right?

How do I 3d print it with colors?

No color support, but you can export the map to an STL file with the function `save_3dprint()`. You can declare the maximum width/depth and it will scale the model to the size you've specified.

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | Legal | Apply to YC | Contact