Where do I find population data to link to DMA / MMA or zip code? I need to be more granular then state. Any free data source? ArcGIS?


American Fact Finder

This data is maintained by the Census Bureau. Once you download what you need, and the matching TIGER boundaries/lines, you should be able to join/relate with a common field.


Well you can download the US Census Tiger data, and they even have some sets pre-populated with certain demographic details. That is available for download at http://www.census.gov/geo/maps-data/data/tiger.html and they have one of the grographic levels are zipcode tabulation areas. Depending on if the pre-populated file includes the demographic data you need, you could also, as another answer suggests, go to the American Fact Finder website and download additional demographic data as needed and create table joins to get the data in the shapefile/feature class.

Hope that helps. (Of course, all of this is assuming you are talking about data for the US, not some other country, since you didn't specify in your question.)


I would add nhgis.org to the list. See here for their geographic levels. You can register for free.


This folder in the ftp server contains all the information from the 2012 5-Year ACS, which includes Zip Code Tabulation Areas, Census Tracts, Census Block Groups, and many other area types.

You may need ArcGIS 10.1 for it though. If there is a file geodatabase converter from ESRI to open source, I would love to know.


If you have the wget tool and perl, can use open street map web services and adopt this little harvester solution written in perl. If you harvest OSM be nice and use small bbox patches in your selection (not larger than 1x1 degree). The granularity for you matter is given by the [place=city|town...] filter. For more infos visit the OSM Web page.

#!/usr/bin/perl -w 
# --------------------------------------------------------
# Simple OSM Harvester 
# --------------------------------------------------------
use strict;
use XML::XPath;
use XML::XPath::XMLParser;

# Use UFT 8
binmode(STDOUT, ":utf8");
# --------------------------------------------------------
# Parameter @todo put that stuff into the arguments
# --------------------------------------------------------
# set the granulatrity [places=city|town|village|hamlet]
my $level="town";

# set an OSM friendly BBOX
#    + --- 53N --- +
#    |             |
#   12E           13E
#    |             |
#    + --- 52N --- +
my $east=13; my $west=12; my $north=53; my $south=52;

# --------------------------------------------------------
# OS Call wget
# --------------------------------------------------------
my @call =`wget -O osm-town-$west-$south-$east-$north.xml "http://open.mapquestapi.com/xapi/api/0.6/node[place=$level][bbox=$west,$south,$east,$north]"`;    

# --------------------------------------------------------
# Parse the stuff
# --------------------------------------------------------

# Open and parse the xml file
my $xp = XML::XPath->new(filename => "osm-town-$west-$south-$east-$north.xml");

# Make a list of all nodes
my $nodes = $xp->find('/osm/node'); # find all paragraphs

# Iterate over all nodes
for my $node ($nodes->get_nodelist) {

    # Find the latitude in XML Context
    my $lat = $xp->find('./@lat', $node);

    # Find the longitude in XML Context
    my $lon = $xp->find('./@lon', $node);

    # Find the name in XML Context
    my $name = $xp->find('./tag[@k=\'name\']/@v', $node);

    # Find the polulation pattern in XML Context
    my $pop  = $xp->find('./tag[@k=\'population\']/@v', $node);

    # --> ZIP pattern inserted in XML Context
    my $zip  = $xp->find('./tag[@k=\'openGeoDB:postal_codes\']/@v', $node);

    # --> Community identification pattern inserted in XML Context
    my $cid  = $xp->find('./tag[@k=\'openGeoDB:community_identification_number\']/@v', $node);

    # Skip all empty entries of zip and pop
    next if ! ($zip && $pop);
    # output result
    print "cid=$cid zip=$zip name=$name logitude=$lon latitude=$lat population=$pop\n";

# --------------------------------------------------------
# --------------------------------------------------------

Some where arround Berlin, Germany:

cid=12063244 zip=14727 name=Premnitz logitude=12.3384178 latitude=52.5310487 population=9671
cid=15363047 zip=39539 name=Havelberg logitude=12.0733335 latitude=52.8234367 population=7400
cid=12063252 zip=14712 name=Rathenow logitude=12.3333 latitude=52.6 population=27230
cid=12068320 zip=16816 name=Neuruppin logitude=12.809573 latitude=52.9243135 population=32145
cid=12063088 zip=14662 name=Friesack logitude=12.5782641 latitude=52.7395263 population=2904
cid=12068264 zip=16866 name=Kyritz logitude=12.3966896 latitude=52.9430648 population=10343
cid=15358014 zip=39307 name=Genthin logitude=12.1565319 latitude=52.4067182 population=14524
cid=12069020 zip=14806 name=Bad Belzig logitude=12.5868514 latitude=52.1406356 population=11407
cid=15363095 zip=39524 name=Sandau (Elbe) logitude=12.0480053 latitude=52.7890696 population=1047
cid=12068280 zip=16835 name=Lindow (Mark) logitude=12.9864931 latitude=52.9745453 population=3200
cid=12068324 zip=16845 name=Neustadt (Dosse) logitude=12.440522 latitude=52.8550517 population=4013
cid=12069656 zip=14542 name=Werder (Havel) logitude=12.9329125 latitude=52.3715809 population=23000
cid=12063208 zip=14641 name=Nauen logitude=12.8762945 latitude=52.6066728 population=11024
cid=12069696 zip=14793 name=Ziesar logitude=12.288347 latitude=52.2666425 population=2910
cid=12068117 zip=16833 name=Fehrbellin logitude=12.7652143 latitude=52.8142217 population=9000
cid=12068477 zip=16868 name=Wusterhausen/Dosse logitude=12.4640151 latitude=52.8871321 population=6400
cid=15363002 zip=39596 name=Arneburg logitude=12.0035022 latitude=52.674454 population=1728
cid=12051000 zip=14770,14772,14774,14776 name=Brandenburg an der Havel logitude=12.5497359 latitude=52.4168004 population=72516
cid=15358025 zip=39319 name=Jerichow logitude=12.0259375 latitude=52.4974869 population=2311
cid=12069632 zip=14929 name=Treuenbrietzen logitude=12.8734896 latitude=52.0966552 population=8001
cid=12069017 zip=14547 name=Beelitz logitude=12.9695977 latitude=52.237682 population=12000
cid=15151034 zip=39279 name=Loburg logitude=12.0770309 latitude=52.1140753 population=2437
cid=12069076 zip=14822 name=Brück logitude=12.7617358 latitude=52.1986251 population=3885
cid=12069448 zip=14823 name=Niemegk logitude=12.6889448 latitude=52.0749361 population=2327
cid=12063148 zip=14669 name=Ketzin logitude=12.8443972 latitude=52.4769264 population=3942
cid=12063260 zip=14728 name=Rhinow logitude=12.3410614 latitude=52.7508589 population=2012

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.