Georeferencing and Vectorising old scanned maps with QGIS and geocoder.us

I found this lovely image of the Brooklyn trolley car network in 1924 on the nycsubway site. I wanted to georeference it so i could draw a shape representing the cable lines over the top, using Quantum GIS.

Picking Ground Control Points

GCPs should be points that are easy to definitely identify, of which you already the know the latitude and longitude. You need at least three known points to georeference a map; the more the better. I picked mine by looking for prominent intersections on the map and geocoding them using the free geocoder.us.

Now i have a text file containing lat/long pairs for various points. I wanted to reference my map to a projected coordinate system - into UTM, which "looks right" for a lot of places, rather than the squashed-looking WGS84. I converted each WGS84 poitn pair into UTM using proj:

    jo@frot:~/nyc/subway$ proj +proj=utm +zone=18
    [ the next line is me typing in ]
    -73.978634 40.637911
    586367.51       4499064.40

Now i have X and Y coordinates for each points, i can use QGIS to generate a world file, which tells GIS software how the map needs to be stretched and skewed to fit onto 'real space'. I have six waypoints, attempting to distribute them around the edges at all the corners, for optimally correct 'warping' onto real space.

Once you've added all your GCPs to the map it should something like this. Now you can generate a world file and either save it and exit, or load the map into your QGIS project.

I didn't get my world file quite right first time - the scan wasn't very high resolution, and my local knowledge is flaky. It was close enough to be able to correct by 'tweaking' the bottom two numbers on the shape file, the north shift and south shift respectively, to more or less align the old map with the modern street data from the Census Bureau TIGER data set.

Extracting vector layers

QGIS 0.7 has a vector drawing capacity, but i couldn't get the hang of it. I used GRASS's v.digit, Schuyler set this up for me by waving dead chickens, but here is the gist of the conversation with GRASS. v.digit automatically saves nodes, lines or shapes to a shapefile as you are drawing.


    GRASS 6.0.0beta2:~/nyc/subway > d.rast trolley-lines.1

    GRASS 6.0.0beta2:~/nyc/subway > v.digit -n map=trolley bgcmd="d.rast trolley-lines.1"