[postgis-users] help with functions/looking to buy data

Mark Thomas javaguru at ieee.org
Tue Apr 11 19:42:38 PDT 2006

Hello All,

I am looking for anyone (company or individual) who has data consisting
of zip codes, carrier routes, and the geometries for each carrier route.
I currently have the USPS TIGER/ZIP+4 product to match USPS carrier
routes to TIGER/line records by TLID, but alas, it is missing over 15000
zip codes worth of data.  What I am doing is allowing the user to input
an address and one or more radii in miles and I am returning the
demographics associated with the resulting region of interest.  I have
all the geocoding complete and all the demographics at the carrier route
level complete, but what I'm missing is the in-between step of
determining which carrier routes apply to the ROI by using PostGIS
functions on the carrier route geometries.  Of course this is only a
problem for the missing zip codes all others work great.  I am also open
to other forms of calculating these values such as using census
block/tract geometries to match against ROI, percetange of ZCTA covered
by ROI, etc. and if anyone has any advice or suggestions they are warmly

I could also really use some advice on how to make these functions below
the most efficient.  

create or replace function getdemographicsbyaddress (text, numeric) returns setof demographics as $$
    g geometry;
    e geometry;
    rec record;
    d demographics;
    --returns polygon resulting from buffing point geometry result of geocode function by $2 miles
    select getBufferedGeometry(geocode($1),$2) into g;
    select Envelope(g) into e;
    for rec in (
        select distinct(zipcode)
        from usps_tiger_zipplus4
        where geom && e
            and Intersects(geom,g)
        order by zipcode
    ) loop
        select * from getDemographicsByAddress(rec.zipcode,g,e) into d;
        return next d;
    end loop;
$$ language plpgsql;

create or replace function getdemographicsbyaddress (varchar, geometry, geometry) returns demographics as $$
    d demographics;
    select * from getDemographicsByZip($1) into d;
    select sum(homes), sum(apts), sum(businesses)
        into d.homes, d.apts, d.businesses
    from carrier_route_address_totals
    where zipcode = $1
        and carrierroute in (
            select distinct(carrierroute)
            from usps_tiger_zipplus4
            where geom && $3
                and Intersects(geom,$2)
                and zipcode = $1
    return d;
$$ language plpgsql;

        Table "public.usps_tiger_zipplus4"
    Column    |         Type          | Modifiers
 zipcode      | character varying(5)  |
 tlid         | character varying(10) |
 carrierroute | character varying(4)  |
 geom         | geometry              | not null
    "idx_geom_usps_tiger_zipplus4" gist (geom)
Check constraints:
    "enforce_dims_wkb_geometry" CHECK (ndims(geom) = 2)
    "enforce_geotype_wkb_geometry" CHECK (geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)
    "enforce_srid_wkb_geometry" CHECK (srid(geom) = 32767)

   Table "public.carrier_route_address_totals"
    Column    |         Type         | Modifiers
 zipcode      | character varying(5) | not null
 carrierroute | character varying(4) | not null
 homes        | integer              |
 apts         | integer              |
 businesses   | integer              |
    "carrier_route_address_totals_zipcode" btree (zipcode)

If any more info is needed I'm happy to share.


Mark Thomas
Sun Certified Java 5 Programmer
Sun Certified Java 2 Programmer
Sun Certified Web Component Developer
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20060411/0540656c/attachment.html>

More information about the postgis-users mailing list