File: geocode_location.sql

package info (click to toggle)
postgis 1.3.3-3
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 10,468 kB
  • ctags: 4,310
  • sloc: sql: 73,321; ansic: 35,513; xml: 6,160; java: 6,061; sh: 3,428; perl: 1,447; cpp: 987; makefile: 727; yacc: 276; python: 192
file content (67 lines) | stat: -rw-r--r-- 2,193 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
CREATE OR REPLACE FUNCTION geocode_location(
    parsed NORM_ADDY
) RETURNS REFCURSOR
AS $_$
DECLARE
  result REFCURSOR;
  tempString VARCHAR;
  tempInt VARCHAR;
BEGIN
  -- Try to match the city/state to a zipcode first
  SELECT INTO tempInt count(*)
    FROM zip_lookup_base zip
    JOIN state_lookup sl ON (zip.state = sl.name)
    JOIN zt99_d00 zl ON (lpad(zip.zip,5,'0') = zl.zcta)
    WHERE soundex(zip.city) = soundex(parsed.location) and sl.abbrev = parsed.stateAbbrev;

  -- If that worked, just use the zipcode lookup
  IF tempInt > 0 THEN
    OPEN result FOR
    SELECT
        NULL::varchar(2) as fedirp,
        NULL::varchar(30) as fename,
        NULL::varchar(4) as fetype,
        NULL::varchar(2) as fedirs,
        coalesce(zip.city) as place,
        sl.abbrev as state,
        parsed.zip as zip,
        centroid(wkb_geometry) as address_geom,
        100::integer + levenshtein_ignore_case(coalesce(zip.city), parsed.location) as rating
    FROM
      zip_lookup_base zip
      JOIN state_lookup sl on (zip.state = sl.name)
      JOIN zt99_d00 zl ON (lpad(zip.zip,5,'0') = zl.zcta)
    WHERE
      soundex(zip.city) = soundex(parsed.location) and sl.abbrev = parsed.stateAbbrev;

    RETURN result;
  END IF;

  -- Try to match the city/state to a place next
  SELECT INTO tempInt count(*)
    FROM pl99_d00 pl
    JOIN state_lookup sl ON (pl.state = lpad(sl.st_code,2,'0'))
    WHERE soundex(pl.name) = soundex(parsed.location) and sl.abbrev = parsed.stateAbbrev;

  -- If that worked then use it
  IF tempInt > 0 THEN
    OPEN result FOR
    SELECT
        NULL::varchar(2) as fedirp,
        NULL::varchar(30) as fename,
        NULL::varchar(4) as fetype,
        NULL::varchar(2) as fedirs,
        pl.name as place,
        sl.abbrev as state,
        NULL::integer as zip,
        centroid(wkb_geometry) as address_geom,
        100::integer + levenshtein_ignore_case(coalesce(zip.city), parsed.location) as rating
    FROM pl99_d00 pl
    JOIN state_lookup sl ON (pl.state = lpad(sl.st_code,2,'0'))
    WHERE soundex(pl.name) = soundex(parsed.location) and sl.abbrev = parsed.stateAbbrev;

    RETURN result;
  END IF;
  RETURN result;
END;
$_$ LANGUAGE plpgsql;