[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