Creating Hundred Blocks in GIS

What are hundred blocks?

figure 1

Have you ever gotten lost going to a new place before? In the past I’ve had to walk up and down streets squinting at addresses before finding the right building. Sometimes the address numbers are difficult to spot when driving, which doesn’t help when you’ve never been there before. 

In this situation it’s helpful to consult the street signs for the hundred block number, which tells you the address number range for that street. For example, figure 1 shows the 600 Block of W Highland Ave which has houses addressed between 600-699. So if I am looking for 648 W Highland Ave, I can be sure I am going the right direction.

Figure 2 below shows the street signs for the 700 and 600 block of W Highland Ave. Using google maps we can confirm the address numbers are indeed in the 700-799 and 600-699 ranges.

figure 2

hundred blocks in GIS

While street signs typically carry this indispensable information, digital maps frequently do not. In figure 2, you can see that Google Maps has labelled the individual house numbers, but the general hundred block information is missing.

Although there are few if any public hundred block datasets, there are nationwide public street datasets maintained by the US Census Bureau. These Topologically Integrated Geographic Encoding and Referencing (TIGER) datasets make creating our own hundred block GIS data possible. The TIGER technical documentation can be found here.

Figure 3 is a diagram from the technical documentation and explains the address ranges in the TIGER dataset:
The TIGER/Line Shapefiles contain potential address ranges for city-style addresses. The edge (between
the start node and the end node) in the diagram above has two address ranges; the left side has oddnumbered addresses and the right side has the complementary even-numbered addresses. Potential
address ranges along an edge have values that encompass the addresses of existing structures, as well
as those not yet built.

TIGER Data lists the potential address range

figure 3

These ranges correspond to the attributes ‘Left From Address’/’Left To Address’ and ‘Right From Address’/ ‘Right To Address’. This is enough information to label the street with the hundred-block number as you can derive it from the range. For example, the left address range 101-119 falls in the 100-Block. In fact, you can tell almost immediately looking at the range that it’s in the 100-block by mentally replacing the last two digits with 0’s.

Now we have what we need to create a point dataset of hundred blocks. We have a great starting point for a script. In this Python snippet, we subtract the last two digits with the modulo operator.

for street in enumerate(street_features):
    hundred_block = street['LSTARTADDRESS'] - (street['LSTARTADDRESS'] % 100)
    street.addFeature('hundred_block', hundred_block) 

The ‘ % X‘ or modulo X returns the remainder after dividing by X. Using the above example:
\(101 – 1 = 100\) which is a valid hundred block.

addressing the issues

The potential address ranges for both sides already give us enough information, but we need to be aware of some caveats when using this data. Namely, what situations could arise that would give us trouble.
1. What happens when the left and right side have different hundred blocks?
Addresses with different numbering on the Right and Left

figure 4

A single street edge will have Left and Right Hundred Blocks

figure 5

In figure 4 we see that on Oak Ave the left side falls in the 6100-Block while the right side is in the 100-Block. In this case it doesn’t make sense to label the block alone as either 6100 or 100, but to instead label both the left side and right like in figure 5. Let’s modify our script to include both sides: 

for street in enumerate(street_features):
    hundred_blockL = street['LSTARTADDRESS'] - (street['LSTARTADDRESS'] % 100)
    hundred_blockR = street['RSTARTADDRESS'] - (street['RSTARTADDRESS'] % 100)
    street.addFeature('hundred_blockL', hundred_blockL)
    street.addFeature('hundred_blockR', hundred_blockR)
2. How do we label the edges that include more than one valid hundred block?
Here you see we can label both the left and right side of Oak Ave as the 100-Block or 200-Block. Now we can just randomly choose between the two, or we can use math to give us a number in between by finding the average:
For the left side: \(\frac{(101+299)}{2}=200\)
For the right side: \(\frac{(100+298)}{2}=198\)

Therefore we label the left as the 200-Block, and the right as the 100-Block. Now although these numbers are different, they encompass both hundred blocks in question and thanks to our work around problem (1), we can have both displayed. Modifying our script again:
for street in enumerate(street_features):
    left_average = (street['LSTARTADDRESS'] + street['LENDADDRESS'])/2
    right_average = (street['RSTARTADDRESS'] + street['RENDADDRESS'])/2
    hundred_blockL = left_average - (left_average%100)
    hundred_blockR = right_average - (right_average%100)
    street.addFeature('hundred_blockL', hundred_blockL)
    street.addFeature('hundred_blockR', hundred_blockR) 

a hundred-block layer

We finally have the pieces to display the hundred block information in a digital map. Below shows W Highland Ave, the same map area as figure 1. You can see that the script’s output matches the hundred-block information on the street signs in figure 1.

figure 7

Google Map of W Highland/Michillinda/N Sunnyside Ave GIS Layer with the Hundred Blocks

Leave a Comment

Your email address will not be published. Required fields are marked *