[postgis-commits] svn - r2650 - in trunk/extras/tiger_geocoder: .
geocode normalize
postgis-commits at postgis.refractions.net
postgis-commits at postgis.refractions.net
Sun Jul 8 19:20:01 PDT 2007
Author: snowman
Date: 2007-07-08 19:20:00 -0700 (Sun, 08 Jul 2007)
New Revision: 2650
Added:
trunk/extras/tiger_geocoder/normalize/pprint_addy.sql
Modified:
trunk/extras/tiger_geocoder/create_geocode.sql
trunk/extras/tiger_geocoder/geocode/geocode.sql
Log:
- Added print-print function for norm_addy type (norm_addy -> varchar)
- Restructured geocode(), accept address in parsed norm_addy form
as well as unparsed varchar form. Return norm_addy type instead of
varchar (use pprint_addy() if you want a varchar result instead)
Modified: trunk/extras/tiger_geocoder/create_geocode.sql
===================================================================
--- trunk/extras/tiger_geocoder/create_geocode.sql 2007-07-08 21:56:47 UTC (rev 2649)
+++ trunk/extras/tiger_geocoder/create_geocode.sql 2007-07-09 02:20:00 UTC (rev 2650)
@@ -37,6 +37,7 @@
\i normalize/location_extract.sql
-- Normalization API, called by geocode mainly.
\i normalize/normalize_address.sql
+\i normalize/pprint_addy.sql
---- Geocoder functions
-- General helpers
Modified: trunk/extras/tiger_geocoder/geocode/geocode.sql
===================================================================
--- trunk/extras/tiger_geocoder/geocode/geocode.sql 2007-07-08 21:56:47 UTC (rev 2649)
+++ trunk/extras/tiger_geocoder/geocode/geocode.sql 2007-07-09 02:20:00 UTC (rev 2650)
@@ -1,12 +1,11 @@
CREATE OR REPLACE FUNCTION geocode(
input VARCHAR,
- OUT NORM_ADDY VARCHAR,
+ OUT ADDY NORM_ADDY,
OUT GEOMOUT GEOMETRY,
OUT RATING INTEGER
) RETURNS SETOF RECORD
AS $_$
DECLARE
- parsed norm_addy;
result REFCURSOR;
rec RECORD;
BEGIN
@@ -16,34 +15,76 @@
END IF;
-- Pass the input string into the address normalizer
- parsed := normalize_address(input);
- IF NOT parsed.parsed THEN
+ ADDY := normalize_address(input);
+ IF NOT ADDY.parsed THEN
RETURN;
END IF;
+ OPEN result FOR SELECT * FROM geocode(ADDY);
+
+ LOOP
+ FETCH result INTO rec;
+
+ IF NOT FOUND THEN
+ RETURN;
+ END IF;
+
+ ADDY := rec.addy;
+ GEOMOUT := rec.geomout;
+ RATING := rec.rating;
+
+ RETURN NEXT;
+ END LOOP;
+
+ RETURN;
+
+END;
+$_$ LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION geocode(
+ IN_ADDY NORM_ADDY,
+ OUT ADDY NORM_ADDY,
+ OUT GEOMOUT GEOMETRY,
+ OUT RATING INTEGER
+) RETURNS SETOF RECORD
+AS $_$
+DECLARE
+ result REFCURSOR;
+ rec RECORD;
+BEGIN
+
+ IF NOT IN_ADDY.parsed THEN
+ RETURN;
+ END IF;
+
+ raise NOTICE 'in_addy: %', IN_ADDY;
+
-- Go for the full monty if we've got enough info
- IF parsed.address IS NOT NULL AND
- parsed.streetName IS NOT NULL AND
- (parsed.zip IS NOT NULL OR parsed.stateAbbrev IS NOT NULL) THEN
+ IF IN_ADDY.address IS NOT NULL AND
+ IN_ADDY.streetName IS NOT NULL AND
+ (IN_ADDY.zip IS NOT NULL OR IN_ADDY.stateAbbrev IS NOT NULL) THEN
- result := geocode_address(parsed);
+ result := geocode_address(IN_ADDY);
END IF;
-- Next best is zipcode, if we've got it
- IF result IS NULL AND parsed.zip IS NOT NULL THEN
- result := geocode_zip(parsed);
+ IF result IS NULL AND IN_ADDY.zip IS NOT NULL THEN
+ result := geocode_zip(IN_ADDY);
END IF;
-- No zip code, try state/location, need both or we'll get too much stuffs.
- IF result IS NULL AND parsed.stateAbbrev IS NOT NULL AND parsed.location IS NOT NULL THEN
- result := geocode_location(parsed);
+ IF result IS NULL AND IN_ADDY.stateAbbrev IS NOT NULL AND IN_ADDY.location IS NOT NULL THEN
+ result := geocode_location(IN_ADDY);
END IF;
IF result IS NULL THEN
RETURN;
END IF;
- ans := false;
+ ADDY.address := IN_ADDY.address;
+ ADDY.internal := IN_ADDY.internal;
+
LOOP
FETCH result INTO rec;
@@ -51,32 +92,19 @@
RETURN;
END IF;
- NORM_ADDY := cull_null(parsed.address::text)
- || CASE WHEN rec.fedirp IS NOT NULL THEN ' ' ELSE '' END
- || cull_null(rec.fedirp)
- || CASE WHEN rec.fename IS NOT NULL THEN ' ' ELSE '' END
- || cull_null(rec.fename)
- || CASE WHEN rec.fetype IS NOT NULL THEN ' ' ELSE '' END
- || cull_null(rec.fetype)
- || CASE WHEN rec.fedirs IS NOT NULL THEN ' ' ELSE '' END
- || cull_null(rec.fedirs)
- || CASE WHEN
- parsed.address IS NOT NULL OR
- rec.fename IS NOT NULL
- THEN ', ' ELSE '' END
- || cull_null(parsed.internal)
- || CASE WHEN parsed.internal IS NOT NULL THEN ', ' ELSE '' END
- || cull_null(rec.place)
- || CASE WHEN rec.place IS NOT NULL THEN ', ' ELSE '' END
- || cull_null(rec.state)
- || CASE WHEN rec.state IS NOT NULL THEN ' ' ELSE '' END
- || cull_null(lpad(rec.zip,5,'0'));
+ ADDY.preDirAbbrev := rec.fedirp;
+ ADDY.streetName := rec.fename;
+ ADDY.streetTypeAbbrev := rec.fetype;
+ ADDY.postDirAbbrev := rec.fedirs;
+ ADDY.location := rec.place;
+ ADDY.stateAbbrev := rec.state;
+ ADDY.zip := rec.zip;
+ ADDY.parsed := TRUE;
GEOMOUT := rec.address_geom;
RATING := rec.rating;
RETURN NEXT;
- END IF;
END LOOP;
RETURN;
Added: trunk/extras/tiger_geocoder/normalize/pprint_addy.sql
===================================================================
--- trunk/extras/tiger_geocoder/normalize/pprint_addy.sql 2007-07-08 21:56:47 UTC (rev 2649)
+++ trunk/extras/tiger_geocoder/normalize/pprint_addy.sql 2007-07-09 02:20:00 UTC (rev 2650)
@@ -0,0 +1,36 @@
+CREATE OR REPLACE FUNCTION pprint_addy(
+ input NORM_ADDY
+) RETURNS VARCHAR
+AS $_$
+DECLARE
+ result VARCHAR;
+BEGIN
+ IF NOT input.parsed THEN
+ RETURN NULL;
+ END IF;
+
+ result := cull_null(input.address::text)
+ || CASE WHEN input.preDirAbbrev IS NOT NULL THEN ' ' ELSE '' END
+ || cull_null(input.preDirAbbrev)
+ || CASE WHEN input.streetName IS NOT NULL THEN ' ' ELSE '' END
+ || cull_null(input.streetName)
+ || CASE WHEN input.streetTypeAbbrev IS NOT NULL THEN ' ' ELSE '' END
+ || cull_null(input.streetTypeAbbrev)
+ || CASE WHEN input.postDirAbbrev IS NOT NULL THEN ' ' ELSE '' END
+ || cull_null(input.postDirAbbrev)
+ || CASE WHEN
+ input.address IS NOT NULL OR
+ input.streetName IS NOT NULL
+ THEN ', ' ELSE '' END
+ || cull_null(input.internal)
+ || CASE WHEN input.internal IS NOT NULL THEN ', ' ELSE '' END
+ || cull_null(input.location)
+ || CASE WHEN input.location IS NOT NULL THEN ', ' ELSE '' END
+ || cull_null(input.stateAbbrev)
+ || CASE WHEN input.stateAbbrev IS NOT NULL THEN ' ' ELSE '' END
+ || cull_null(lpad(input.zip,5,'0'));
+
+ RETURN result;
+
+END;
+$_$ LANGUAGE plpgsql;
More information about the postgis-commits
mailing list