A CNC-Made 3D Topo Map

3d-topo-map-side-view-fullTopo maps are great for figuring out how the elevation changes in certain geographic areas, however, they may be difficult for some (most?) to visualize.  I recently had an idea that if you could get a topo map in a vector graphics format (.svg), this could easily be converted into tool paths to make a 3D topo map with my CNC router.  Each step could then be scaled depending on the elevation change and a realistic model of an area could then be cut in three dimensions.

The first topo map that I found on Wikimedia was of Ross Island off of Antartica.  It’s a relatively small island, but is the 6th tallest in the world, giving it some interesting topography.  I used a combination of “profile” and “pocket” commands to achieve the effect I wanted.  In the end “pocket” was used much too liberally, causing this operation to take FOREVER (like 5 hours or so).  Fortunately, I figured out how to pause the CNC cycle with Mach3 and come back to it, which is explained here.

To begin with, I opened the .svg file in Inkscape, and extracted the topo lines from everything else (see video below or the post it came from for how to do this).  Using techniques described in another post, I straightened the segments. (curved polylines weren’t working well here for some reason).  I then saved it as a .dxf file.  This was then opened up in Draftsight (see my review) and scaled to dimensions that my router could cut.

From here, I had to figure out how much distance each step should be.  After measuring the length of the island with Google Earth, and comparing it to my drawing, it appeared that in the scale I was using 6 inches was 80,000 meters, or 13,000 meters/inch.  Reversing this, the scale on my model was .000076932 inches per meter.  Multiply that by 200 meters per line, and you get .0154 inches/elevation line.  I used this number to scale each cut so that a realistic model was generated.

From here, the DXF was exported to CAMBam, a Computer Aided Machining program, which translates the drawing into Gcode that a CNC machine (like mine) can understand.  The lowest layer was cut first, then the next higher layer was cut and so on.  Since there were 19 layers, the first depth of cut came out to be .0154 x 19 or .293 inches.  I actually used a pocketing tool to take out all the material inside an outer square that I’d drawn.  From here, the layers that weren’t too far apart could be profiled, until several peaks appeared.  Several more surface cuts were made to take care of the material between these peaks.

measuring-ross-island-google-mapsAs mentioned in the beginning, I should have been much more conservative with the pocketing command, and been a bit smarter with how I profiled everything too.  A lot of time was wasted “cutting” air, since a lot of the profiles involved cutting everything inside my border square except for the mountains.  An offset of the island would have made a better border, and probably saved much time.

As you can probably see from the pictures, I made a mistake on one of the layers, which caused it to jump several steps in elevation at once.  I’m not sure if this was in the code, or if I made a mistake when pausing the operation.

Other than this misstep, it would have been a quite successful project.  I may try this again with the knowledge I’ve picked up, and possibly with a topo map that has fewer peaks.  Something like this could also be done with a water/laser jet machine by “slicing” each level into individual parts and stacking them after the fact.

  1. My trick for cutting topos is to use the contour after next as the limit for the pocketing area. I generally start at the top, clear the area between the 1st and 3rd countours, then 2nd and 4th, etc. This saves quite a bit of machining time.

  2. You could also use a laser to burn in features like labels, roads, landmarks etc.

Leave a Comment

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>