Tuesday, December 20, 2016

Generating Novel Towns

I'm nearing completion on a database and application to gather data regarding American towns from a century ago.  The data collected should give me the details I need to reliably recreate novel yet plausible American-style towns.  However, actually creating the towns requires something else.  It requires the rest of the features I've shown in embryonic form in the spline prototype: roads, railroads, and buildings.
A portion of a Sanborn Fire Insurance Map
So what data do I plan to collect to provide the statistical basis for plausible towns?  There's general data regarding the town that determines some high-level aspects of the town layout: population, the size and shape of the central business district, whether there is a central square, and whether the town is a county seat (which requires a county courthouse).  There's data on the railroad(s) in town that need to be collected, including the spatial relationship of the railroad to the central business district. Data on individual government, religious, commercial, industrial, and utility buildings will be collected, including details of rail service.

Very little data on individual homes will be recorded. An initial glance at Google Earth imagery and Sanborn Fire Insurance maps suggests to me that house style and construction materials have far more to do with date of construction and region than with population or other factors.  Prevalence of Brick vs. stone vs. frame construction varies mostly by region and age of the town, and age of the structure.  Style is dependent upon region and date of construction.    There's also far more data on residential units than the rest of a town, and it is largely less relevant to capturing the feel of a town, in my opinion.

Also collected will be details on businesses and other institutions.  Businesses will include industrial and commercial establishments.  The business data will be tied to the building data.  What's this business data good for?  It lets me know for a given population, how many businesses, and what types, should be added to the town, and where.  While I expect the commercial establishments to vary a little between regions, I expect the industrial establishments to vary to a greater extent.  One would expect more canneries in fruit growing regions and more creameries in dairy regions.  A large town on the American plains should have more grain elevators.  I think a coal yard, lumber yard, and oil dealer could show up anywhere.

So where am I collecting the data from?  Mostly from the Sanborn Fire Insurance maps.  Utah, Indiana, and Pennsylvania all make their pre-1923 maps available online to the general public, I can access the Ohio maps by virtue of being a resident of Ohio, and the Library of Congress has partial online coverage of various states.  USGS Topographical Maps, Google Earth, and historical railroad maps may also play a part.

Screenshot of the prototype
A lot of the other data that is collected will be helpful in procedural generation of novel towns.  Street names, for example, can be pulled from the collected data in a probability-derived manner.  Building footprint size may also be useful when subdividing blocks and generating buildings.  Certainly knowing the number of floors for buildings is useful, as well - especially combined with the population data.  Knowing that, hypothetically, a town with a population of 1000 should have 10 shops along either side of Main Street, with heights of one or two floors, plus three industries along Railroad Street, is useful to make a town believable.

Even after the town data is collected and useful statistics are available, a lot more graphics code will need to be written to actually generate and visualize a new town.  The split-based code I mentioned in yesterday's post is part of the likely building generation solution.  The road and railroad code needs additional work, particularly with respect to intersections and switches, respectively.  And I need to finish up the straight skeleton calculation code, which along with buffer operations (inset/outset) is needed for both building generation and generation of lots for a block.  Speaking of blocks, I need to finish up implementation of minimum cycle basis code based upon David Eberly's paper, which is required to "recognize" the blocks in a generated plan of roads in the town.

All in all, there's still a lot to do, but a little bit more gets done each day.  Until the holidays come. Then work will likely grind to a halt for a few days.  Maybe I can find something else to blog about then.

No comments:

Post a Comment