Homework: Map Drawing

Homework: Map Drawing

Your job is to use turtle graphics and file input to draw a roadmap from a description given to you in a map data file.

The input file format is a series of lines of text. Each line consists of fields separated by commas.

The first field is an item type field. The item type is a single character. The possible item types are:

  • 'c': The item is a city. The next fields are the x-coordinate, the y-coordinate, the name and the population. The x and y coordinates are numbers in the range -200 to 200. The name is a string of letters, digits spaces and underscores. Every city item will have a unique name. The population is an non-negative integer.

    If the city has a population of zero, it is just a point on the map: it need not be drawn. If it has a population in the range 1 to 90000 it is a town, and should be drawn as a small open circle with its name to its right. If it has more than 90000 it is a large city, and should be drawn as a larger filled circle with its name to its right.

  • 'r': The item is a road. The next fields are the names of the two endpoints of that road, which will have previously been given by 'c' commands. The road should be drawn as a solid line.

You may read the map data file from stdin, or from a file whose name is given on the command line&emdash;whichever is easier for you.

You can download a couple of sample map data files. The first is testmap.csv, a very simple demo map. The output of my program when given this map as input is

test map rendering

The second sample map data file is oregonmap.csv. I'll let you render that one for yourself.

At the very least you'll need to import the Python 3 turtle graphics library module. Its documentation is here. This assignment will use much more of the library than we have in class, so study its documentation a bit. In particular you'll need the turtle.write() and turtle.circle() functions as well as the turtle.begin_fill() and turtle.end_fill() functions to complete the assignment. Depending on your platform, you may want to finish the program with a call to turtle.done() to get it to wait for you to look at the output.

You'll probably also want to import the Python 3 csv library module for reading files of comma-separated values. Its documentation is here. You could instead "roll your own", but this module is pretty easy to use and will take care of most of the heavy lifting for you. Don't forget to convert strings to numbers when you need to, though!

You'll need to import the sys module if you want stdin. If you decide to go with reading arguments and then opening a file, you can either read the filename directly out of sys.argv or use something heavyweight like the argparse module. (I don't recommend the optparse or getopt modules, as the former is deprecated and the latter has a terrible programmer interface.)

You'll probably want a dictionary of cities keyed by name, which means that you'll want a City class to describe city information.

Last modified: Tuesday, 29 July 2014, 3:04 PM