Posted on Mon 24 June 2013

This article was translated into: Español

Shapefiles of Mexico (AGEBs, Manzanas, etc)

My post on how to download electoral shapefiles proved to be very popular, so I decided to create another script to download shapefiles of census geographies. This is all data that is freely available from the INEGI website, it’s just that they make it really hard to find, it’s only downloadable as a compressed windows executable, and the download links for the files tend to change every few months.

The shapefiles are encoded as codepage 1252 and were reprojected to WGS84. All data corresponds to the 2010 census.



Now for the ugly bits: You’ll need a recent version of innoextract, one that can work with files created by version 5.5 of Inno Setup (yes, the INEGI distributes shapefiles as windows installers), the one in Ubuntu universe is not recent enough. The version available from this repository should work.

1
2
3
4
sudo add-apt-repository ppa:arx/release
sudo apt-get update
sudo apt-get install innoextract
chmod +x download-census-shp.sh

As of now, this script has not been tested on Windows and Mac systems, only on Ubuntu. This script has been tested on Ubuntu, on a Mac you should try and use ‘brew install wget’ and ‘brew install rename’ before running it, and on Windows use cygwin.

The script will create a directory called shps where all the shapefiles are located, if something goes wrong when downloading be sure to delete it and try again. Once you finish running the script you’ll end up with about 5.5 gigabytes of shapefiles containing all available levels of geographical granularity for the 2010 Mexican census.

Census Geographies:

States -> Municipios (Counties) -> Localidades (Polygon if urban otherwise point) -> AGEB (Census Areas - Urban only) -> Manzana (Census Blocks - Urban only)

Plus, you’ll also get a bunch of shapefiles of parks, rivers, schools, etc.

Municipios (Counties)

Localidades (Urban Polygons and Rural Points)

AGEB (Census Areas)

Manzanas (Blocks)

Ejes viales (Streets)

Servicios A (polygons and lines)

Camellón, Metro Station, Hospitals, Parks, Schools, etc

Servicios L (polygons and points)

Bridges, Railways, Tren Metropolitano, Lindero, etc

Servicios P (points)

Churches, Schools, Hospitals, etc

Here’s the script you need to run to download the shapefiles:

#!/bin/bash
# Author: Diego Valle-Jones
# Web: http://www.diegovalle.net
# Purpose: Download shapefiles of manzanas (blocks), agebs (census areas), ejes
# viales (streets), interesting areas and a whole bunch of other stuff
# Note that you'll need a recent version of innoextract
# http://constexpr.org/innoextract/, one that can work with files
# created by version 5.5 of Inno Setup, the one in Ubuntu universe is
# not recent enough. The version available at
# https://launchpad.net/~arx/+archive/release is good enough.
# sudo add-apt-repository ppa:arx/release
# sudo apt-get update
# sudo apt-get install innoextract
# chmod +x download-census-shp.sh
# As of now, this script has not been tested on Windows and Mac
# systems, only on Ubuntu. The script will create a directory
# called 'shps' where all the shapefiles are located, if something
# goes wrong when dowloading be sure to delete it and try again
set -e
# Projection compatible with Google Maps
PROJECTION="+proj=longlat +ellps=WGS84 +no_defs +towgs84=0,0,0"
# wget command
CURL="curl -fsS --retry 3 "
# The list of shapefiles of manzanas, agebs, etc
declare -a files=("ageb_urb" "eje_vial" "estatal" "loc_rur" "loc_urb"
"manzanas" "municipal" "servicios_a" "servicios_l" "servicios_p")
# List of files for the national (not state level) data
declare -a national_files=("estatal" "loc_urb" "nacional" "loc_rur" "municipal" "zonas_metro")
# State abbreviations
declare -a states=("national" "ags" "bc" "bcs" "camp" "coah" "col" "chis" "chih"
"df" "dgo" "gto" "gro" "hgo" "jal" "mex" "mich" "mor" "nay" "nl" "oax"
"pue" "qro" "qroo" "slp" "sin" "son" "tab" "tamps" "tlax" "ver" "yuc"
"zac");
# Use gdal to reproject, and then rename the shapefiles to include
# a user friendly abbreviation instead of a number
# First argument: directory of shapefiles shps/state_abbreviation
# Second argument: the state abbreviation
# TODO: convert the encoding from windows-1252 to utf-8
function reproject {
name="$3[@]"
arr=("${!name}")
for i in "${arr[@]}"
do
ogr2ogr "$1/$2_$i.shp" "$1"/$i.shp -t_srs "$PROJECTION"
rm "$1"/$i*
done
# rename the extra census data that comes with the shapefiles
cd "$1/tablas"
rename "s/^cpv2010/$2_cpv2010/" cpv2010*
rm -rf cpv2010*
cd ../../..
}
# For each of the 32 states (and national data == 00) download and reproject
for i in $(seq 0 32);
do
# The INEGI uses a leading zero for all one digit numbers
if [ "$i" -lt 10 ]
then
FILENUM="0$i"
else
FILENUM="$i"
fi
# download the files from the inegi server. 'idusr' is the id you get
# when you register at the INEGI (yes, I'm 12 years old)
$CURL "http://www.inegi.org.mx/est/scince/scince2010.aspx?_file=/est/scince/scince2010/Scince2010_$FILENUM.exe&idusr=80085" -o ${states[$i]}_scince.exe
# Extract the shapefiles from the inno setup installer windows
# executable (note that it doesn't allow you to specify the
# directory to extract the files)
innoextract --lowercase --silent ${states[$i]}_scince.exe
# Create a directory called "shps" to store the shapefiles
mkdir -p shps/${states[$i]}
# Copy the shapefiles to the new directory
cp -r app/"$FILENUM"/* shps/${states[$i]}
# Delete the temp files from innoextract
rm -rf app
rm -rf tmp
rm -rf ${states[$i]}_scince.exe
# call the reproject function above
if [ "$i" -eq 0 ]
then
reproject shps/${states[$i]} ${states[$i]} national_files
else
reproject shps/${states[$i]} ${states[$i]} files
fi
# give the server a rest before downloading the next file
sleep 20
done
# You could use the code below to merge all the states into one giant
# shapefile of Mexico. Change '_manzanas' to '_agebs' or '_eje_vial' or whatever
#for file in $(find shps -maxdepth 2 -name "*_manzanas.shp" )
#do
# ogr2ogr -update -append mexico_manzanas.shp $file -f "esri shapefile" -nln merge
#done
# Filter attributes (e.g. only include total population in the dbf)
#ogr2ogr -select POB1 mexico_manazanas.shp merge.shp


P.S. You can contact the INEGI and tell them what you think of the way they distribute data.
P.P.S. If you need shapefiles of elevation curves, archeological sites, rivers, etc, try this other script

Update: You can also use a docker image to run the script without having to install anything

1
2
3
4
5
6
docker pull diegovalle/scince2010-docker
# shared directory to store the output
mkdir /tmp/scince2010
# run ./download.sh within the container and the files should be ready
# in /tmp/since2010
docker run -v /tmp/scince2010:/shapefiles/shps -i -t diegovalle/scince2010-docker



Unless otherwise stated, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the Apache 2.0 License. Privacy policy

Disclaimer: This website is not affiliated with any of the organizations or institutions to which Diego Valle-Jones belongs. All opinions are my own.

Special Projects:

Blogs I like: