From charlesreid1

Shapefiles (.shx, .shp, and .dbf bundle of files) are a data format for storing geospatial vector data. Shapefiles can describe vector features like points, lines, and polygons, and can add extra attributes to shapes.

The shapefile format stores everything as a vector feature, i.e., as a set of points. This means that any curvature is discretely represented, and resolution therefore relies on scale. (Compare this to other formats that use things like splines to maintain smooth curvature at arbitrary scales).

Converting Shapefiles to STL Files

Typically, GIS information comes as shapefiles, which are readable by GIS programs and libraries. However, if we want to do non-GIS-specific tasks with GIS information (like 3D Printing), we need to convert the Shapefile (GIS-specific) to an STL file (readable by CAD software).

I downloaded contour elevation data for the Seattle area, which was contained in a zip file called Elev_322166_Seattle_E_1X1.zip.

Unzipping results in a pile of files of various formats:

NationalMapViewerFiles.png

The one I'll use there is the shapefile.

We'll use the shp2stl utility to convert the shapefile (GIS format) into an STL file (3D printing format).

Nice writeup/utility here: http://dougmccune.com/blog/2014/12/30/using-shp2stl-to-convert-maps-to-3d-models/

Download Node, and get npm. Use npm to install shp2stl utility:

$ npm update
$ npm install shp2stl

Here is the javascript file that I used to convert this shapefile to a stl file:

$ cat stlify.js
var fs = require('fs');
var shp2stl = require('shp2stl');
var file = 'Elev_Contour.shp';
shp2stl.shp2stl(file,
    {
        width: 100, //in STL arbitrary units, but typically 3D printers use mm
        height: 10,
        extraBaseHeight: 0,
        extrudeBy: "Pop_psmi",
        simplification: .8,
        binary: true,
        cutoutHoles: false,
        verbose: true,
        extrusionMode: 'straight'
    },
    function(err, stl) {
        fs.writeFileSync('SeattleContours.stl',  stl);
    }
);

To run this, just pass it to node:

$ node stlify.js
bounds: Infinity Infinity -Infinity -Infinity (spherical)
pre-quantization: 111.195km (1.00°) 111.195km (1.00°)
topology: 0 arcs, 0 points
topojson done
simplification: effective minimum area 0.00
simplification: retained 0 / 0 points (NaN%)
making top planes
making side planes
making bottom planes
done making 3D planes