DOI: 10.14714/CP94.1599
© by the author(s). This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0.
Eleanor Lutz (she/her), TabletopWhale.com | tabletopwhale@outlook.com
Over the past couple of years, I designed a collection of ten maps of outer space using open-source data, including an animated map of the seasons on Earth, a map of Martian geology, and a map of asteroid orbits. My goal for the project was to make a set of decorative posters that people from any background could enjoy, whether or not they were scientists.
This article explains my design process for one of the most challenging maps in the project: a geologic map of the Moon. This Moon map was particularly difficult because the geologic data was split into six different datasets. Each dataset had unique labels (and sometimes different data formats) so I spent a lot of time piecing the data together to create a cohesive map. Though it was difficult to make, it was also one of my favorites, because there were so many unique geologic features, such as large impact craters, broad plains, and textured ridges. The Moon has no significant atmosphere, and there is little wind to erode meteorite craters once they have formed. Several huge impacts have created large geologic features still visible today, such as the Orientale basin on the southern far side visualized in bright red on my map.
After finally finishing the map collection, I’m very excited to share with you my workflow for making this particular map with open astronomy data from the USGS, IAU, and NASA. My Github page (github.com/eleanorlutz) provides my open-source code, along with more detailed instructions on technical steps, including special instructions for beginners who are new to coding or design. The software I used includes Python, GDAL, Illustrator, and Photoshop (CC 2019), but other open-source design software like Inkscape and GIMP can achieve similar results.
The main map is composed of three basic elements: geology, elevation, and nomenclature labels. I needed to understand and plot each data type separately before I could incorporate them into one cohesive map.
To give a little context, the geology of the Moon was mapped in the 1970s using data from the Lunar Orbiter program, Zond 7, Zond 8, Mariner 10, Apollos 15–17, and telescope photographs. In 2013 all six of these original maps were compiled into a digital dataset by the USGS. However, the digital version was still separated into six different sections, each with their own folder full of shapefiles, symbology, and metadata (illustrated in Figure 2). Because of this, the geologic data was probably the most complicated dataset to pre-process.
One complication with having six datasets instead of one was that they were sometimes inconsistent. Some geologic categories were described differently between datasets, like “Basin Material, Rugged” vs. “Material of Rugged Basin Terrain,” The imprecise geologic timescales offered another complication. Some areas were described with uncertainty—for example, some plains were classified as being from the “Imbrian or Nectarian” era, which are two periods of geologic time on the Moon. And some geologic categories combined many time periods, like craters from “Imbrian, Nectarian, and pre-Nectarian” time periods. These time-scale estimates also differed between datasets.
I thought it would be too visually complicated to show all these uncertain aggregations in one map, and I also needed to find a way to reconcile labels across the six datasets. To solve both of these problems, I decided to omit timescale data entirely. I reviewed the descriptions of each feature type in the USGS data, and re-assigned them to 29 colors based on morphology (craters, basins, etc.) without including geologic timescales. This meant that the final map had much less detail than the original data—but the information flowed consistently across the entire planet, instead of fragmenting visually into six sections.
Figure 2. Each of the six geologic datasets making up the final map. In the design phase of the project I created each of these maps separately in Python, then combined them together in Photoshop. This allowed me to experiment with the order of each layer to see which combinations would show the fewest discrepancies across data borders.
One additional issue with this data was that the shapes in the two polar datasets were encoded in meters, while the rest of the data was encoded in degrees. This was an issue for my particular workflow, which involved using the programming language Python to convert the USGS data files into vector illustrations. The default globe in Python is based on Earth, which has a much larger circumference than the Moon, so data plotted in meters didn’t cover the correct amount of space. To fix the issue I created a custom sphere with the Moon’s radius:
axis = 1737.1 * 1000 # radius of the Moon, in meters globe = ccrs.Globe(semimajor_axis=axis, semiminor_axis=axis, ellipse=None) large_proj = ccrs.EckertIV(globe=globe)
To make the hillshade and slope textures for this map I used a digital elevation model (DEM) from the USGS. The original DEM file uses a plate carrée projection, which is a fairly simple projection that distorts the area of features across the globe. In this geologic map I wanted to use an equal-area projection, like Eckert IV, so that I could accurately compare the relative areas of each type of geologic feature. To convert the plate carrée map into the Eckert IV projection, I used the command line installation of GDAL. The code below uses the original raster file to create a new file using the eck4 (Eckert IV) projection:
gdalwarp -t_srs “+proj=eck4” ./path_to_intif.tif ./path_to_outtif.tif
Next, I downsampled the file by decreasing the resolution of each pixel to 1500×1500 meters. It’s useful to decrease file size to reduce computation times, and it’s much faster to downsample at this point than to scale images later on in the process.
gdalwarp -tr 1500 1500 -r average ./path_to_intif.tif ./path_to_outtif.tif
Next, I used the downsampled DEM to generate hillshade and slope maps for each hemisphere of the Moon. For this map I used a particularly high vertical exaggeration, multiplying elevation values by 20, because the map colors would be matched to geologic units instead of topography. This increased visual contrast helps the hillshade show up under all of the other map elements.
gdaldem hillshade -z 20 ./path_to_intif.tif ./path_to_hillshade.tif gdaldem slope ./path_to_intif.tif ./path_to_slope.tif
In addition to the main Eckert IV map, I also mapped the four hemispheres of the Moon (northern, southern, eastern, and western). The Eckert IV map isn’t great for visualizing the polar regions (which are flattened excessively), so the northern and southern hemisphere insets were particularly important for understanding these areas. To make the hillshade and slope for each of the four corner maps, I repeated the same code as above, modified slightly for the orthographic projection and specifying the center latitude and longitude for each map. The code for the north pole is shown below:
gdalwarp -t_srs “+proj=ortho +lat_0=90 +lon_0=90” ./path_to_intif.tif ./path_to_outtif.tif gdalwarp -tr 1500 1500 -r average ./path_to_intif.tif ./path_to_outtif.tif gdaldem hillshade -z 20 ./path_to_intif.tif ./path_to_hillshade.tif gdaldem slope ./path_to_intif.tif ./path_to_slope.tif
I downloaded the official feature names for the Moon from the International Astronomical Union, which is responsible for naming features of extraterrestrial objects. The full data includes about 9000 named features, and in my map I included about 400 of them. Many of the features I omitted were near the landing sites of various spacecraft—in these areas many more objects were named because they could be observed and studied at high resolution from the lunar surface.
To download a CSV file of all features, I used the IAU’s Advanced Search Function and selected:
After cleaning the data, I switched gears and developed a design style that would be appropriate for both this map and the others in my collection. I wanted to make sure it could tie together each map into a cohesive collection.
For this project I wanted to combine large datasets with a hand-crafted design style. I was particularly inspired by artists like William Morris or Alphonse Mucha, whose textile designs and Art Nouveau paintings were known for their colorful, detailed decorations. For this scrollwork design I started with a pencil sketch, and tried several iterations of leafy scrolls before finally picking a less botanically inspired design.
When I paint decorations like these in Photoshop, I begin each design as a solid white shape and then gradually break away pieces into detailed chunks. Next, I brush away pieces of each section with the brush eraser tool until the pieces look like a fully-shaded monochrome design. I wait to add color until the very last step, where I use many different colors and overlay layers for a richer effect.
Figure 4. The completed scrollwork (far left), as well as separate layers from the file including color overlays and the monochromatic segments separated out for painting.
The original geologic maps of the Moon—like this one—were published in the 1970s, and I loved the bright neon color schemes in these historical maps. I tried to keep as many of the same colors as possible, though I re-arranged the palette to save the more extreme colors for smaller or more unusual geologic formations. The color design was also influenced by the other maps in my astronomy series, as I traded colors between them.
Figure 5. The color map used as a reference for all 10 of the maps in my space atlas project. The two large color blocks on the far left are the two base colors used in every map for the background and text. For the lunar map I used 29 colors, and I tried to choose those that were as different from each other as possible, producing a set that spanned a large range of brightness and hue.
To construct the different pieces of this map, I designed five plots in Python to import into Illustrator. I often split up data for plotting so I can easily apply layer-specific effects, such as drop shadows or blurs, in Photoshop or Illustrator.
Layer 1, Geologic units: Geologic units are morphological categories such as plains, basins, or craters. In geologic maps, including this one, each unit is typically mapped in a separate color. In this dataset, each geologic unit is tagged with a code identifying the rock type. I assigned a color to each letter code by making a table of code-color pairs, and referenced this file when plotting each unit in Python. Saving my graphics parameters in a separate file makes it easier to try different color schemes, and compartmentalizes the design from the code. I saved each of the six geologic datasets as a separate figure, because some areas of the six maps overlapped and I wanted to try different layering sequences in Photoshop.
Layer 2, Geologic contacts: In this map, geologic contacts are the boundaries between different colors. Most of these boundary lines are solid black lines, but in some cases where the boundary is hidden underneath the ground or approximate, the contact line is shown as a dotted black line.
Layer 3, Geologic features: Geologic features include fractures and folds such as ridges, buried crater rims, or basin rims. These features don’t necessarily mark the boundary between different geologic unit colors. For example, there may be many ridges within a single plain. To map geologic features in a distinct style, I plotted each one in a different color in Python, and then stylized the lines in Illustrator. The geologic features data was particularly different between datasets, so in the end I only included features that were present in more than one dataset.
Layer 4, Nomenclature: I plotted each label with a font sized approximately according to the size of the object. I actually changed the font sizes substantially in Illustrator after plotting them in Python, but this first step helped add a framework for some of the label choices. I also plotted each type of feature in a separate color, so that I could use the Select Same Color feature in Illustrator to quickly group and edit feature types like craters, mountains, and plains. For this map I used the Redflower typeface for the title, and Moon for all of the nomenclature labels.
Layer 5, Gridlines and Data boundaries: I also used Python to plot gridlines for each map projection. I included the borders of each of the six datasets, to give an idea of where geologic contacts and features overlapped. Because there were some visible discrepancies at the borders between the six datasets, I decided to add a more detailed key showing the age and area coverage of each of the six scientific studies used in this map. To make this key I plotted the outlines of each dataset, from the perspective of each of the four hemispheres of the Moon.
Figure 6. The extent of each dataset mapped on the southern (far left), northern (left), near (right), and far (far right) hemispheres. Each color visualizes one dataset included in the set of six.
By now there are many human-made objects on the Moon, from crash landings and successful missions alike. I wanted to include a guide to these landing sites to add historical context to the different areas of the Moon. To create the backdrop for the landing site maps, I used a digitally enhanced image of the Moon from the open-source astronomy tool Stellarium as the backdrop, reprojected into four orthographic projections. To plot the landing sites themselves, I collected a list of successful (and some failed) lunar missions from the Planetary Society and looked up their exact landing coordinates. I then plotted each one in Python, using different colors to show missions from different decades.
Figure 7. Digitally enhanced Moon images from Stellarium (top) and landing sites (bottom). Left to right: southern, northern, near, and far hemispheres.
For most of my maps generated in Python, I save each figure as a PDF so I can edit the text and shapes in Illustrator. There are a couple standard commands I use to export these figures so they’re easy to edit:
import matplotlib import matplotlib.pyplot as plt import matplotlib.backends.backend_pdf as pdf # Export text as editable text instead of shapes: matplotlib.rcParams[‘pdf.fonttype’] = 42 # Remove borders and ticks from subplots: ax.axis(‘off’) # Remove padding and margins from the figure and all its subplots plt.margins(0,0) plt.subplots_adjust(top=1, bottom=0, right=1, left=0, hspace=0, wspace=0) plt.gca().xaxis.set_major_locator( plt.NullLocator()) plt.gca().yaxis.set_major_locator( plt.NullLocator()) # Save the Matplotlib figure as a PDF file: pp = pdf.PdfPages(‘./savename.pdf’, keep_empty=False) pp.savefig(fig) pp.close()
After saving the figure, I edit the PDF file so that each object can be manipulated individually. In Illustrator, I select everything in the file and then go to Object → Clipping Mask → Release. At this point the file is ready to edit, allowing me to make changes to line widths, font, or any other effects.
If I don’t need to edit vector paths, I save the file as a PNG so I can import it directly into Photoshop. For this particular map, I saved the geologic unit maps in PNG format, because I didn’t plan to change the colors or shapes after mapping. To save my figures as a PNG I use this code instead:
plt.savefig(‘./savename.png’, format=’png’, dpi=600, pad_inches=0, transparent=True)
Figure 8. A finished section of the combined map (far left), as well as some of the individual pieces including the hillshade, slope, geologic unit colors, and geologic structures.
After each map layer was finished, I combined them all in Photoshop using layer effects. For this specific map I added the slope over the hillshade layer at 50% opacity. This combination adds some extra detail to steep areas, and softens areas of extreme hillshade. The color layer is duplicated four times, with one layer each set to Multiply (100%), Overlay (35%), Soft Light (50%), and Lighter Color (50%), at different opacities. I also add a shadowy blur around the text labels by including a field blur (Filter → Blur Gallery → Field Blur). To give a softer effect I usually stack two differently sized blur layers: one small blur close to the text, and another larger blur to soften the edges. In many cases I duplicate layers and apply several different effects, because some Photoshop effects are better for darker colors and others for lighter colors.
I really enjoyed working on this project, and learning how to map many different kinds of open data! Overall I was very happy with the design of the final Moon map, but in the future I think it would be fun to redo the map using the original geologic data separated by age. I think this kind of map would require much more careful planning—and perhaps might work best as several maps in a series—but it would be an exciting challenge to visualize the entire dataset. In addition to this Moon map, I also designed a geologic map of Mars in a similar style. Other maps in the collection include topographic maps of the rocky planets, constellations from cultures around the world, and a map of 18,000 asteroids in the Solar System. As a final note, I’ve open sourced all of my code for this Moon map project, so if you found this article interesting please feel free to use the code for your own maps.
Thank you to Henrik Hargitai, Chloe Pursey, and Leah Willey for their helpful advice in working with digital elevation models and designing this map. In addition, thank you to everyone who helped me and gave me advice throughout my entire project of maps of outer space: Oliver Fraser, Michael Ruxton, Nadieh Bremer, Mark van der Sluys, and James Skinner. Finally, thank you to two anonymous reviewers for their time, advice, and helpful suggestions, which made this manuscript significantly better.
Andrew Fraknoi, David Morrison, Sidney C. Wolff, et al. 2016. Astronomy. Houston, TX: OpenStax.
International Astronomical Union (IAU) Working Group for Planetary System Nomenclature (WGPSN). 2019. “Gazetteer of Planetary Nomenclature.” https://planetarynames.wr.usgs.gov.
LOLA Science Team. 2018. “LRO LOLA Elevation Model 118m (LDEM GDR).” https://astrogeology.usgs.gov/search/details/Moon/LRO/LOLA/Lunar_LRO_LOLA_Global_LDEM_118m_Mar2014/cub.
The Planetary Society. 2019. “Missions to the Moon.” https://www.planetary.org/explore/space-topics/space-missions/missions-to-the-moon.html.
USGS Astrogeology Science Center. 2016. “Lunar 5M Geologic Map Renovation.” https://astrogeology.usgs.gov/search/map/Moon/Geology/Lunar_Geologic_GIS_Renovation_March2013.
USGS Federal Geographic Data Committee. “FGDC Digital Cartographic Standard for Geologic Map Symbolization.” https://ngmdb.usgs.gov/fgdc_gds/geolsymstd/fgdc-geolsym-sec25.pdf.