From: Regina Obe Date: Fri, 18 Aug 2017 03:53:05 +0000 (+0000) Subject: Reverse geocoder missing street suffix direction. X-Git-Tag: 2.4.0beta1~56 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6a26dd10fea6c07732870f2b4fe3dab84ebfbd81;p=postgis Reverse geocoder missing street suffix direction. References #3806 for PostGIS 2.4.0 git-svn-id: http://svn.osgeo.org/postgis/trunk@15553 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/extras/tiger_geocoder/geocode/reverse_geocode.sql b/extras/tiger_geocoder/geocode/reverse_geocode.sql index ce3e3da3a..9f0053652 100644 --- a/extras/tiger_geocoder/geocode/reverse_geocode.sql +++ b/extras/tiger_geocoder/geocode/reverse_geocode.sql @@ -1,6 +1,6 @@ /*** * - * Copyright (C) 2011-2014 Regina Obe and Leo Hsu (Paragon Corporation) + * Copyright (C) 2011-2017 Regina Obe and Leo Hsu (Paragon Corporation) **/ -- This function given a point try to determine the approximate street address (norm_addy form) -- and array of cross streets, as well as interpolated points along the streets @@ -68,7 +68,7 @@ BEGIN IF var_zip > '' THEN var_addy.zip := var_zip ; END IF; - + var_stmt := 'SELECT z.name FROM place As z WHERE z.statefp = $1 AND ST_Intersects(the_geom, $2) LIMIT 1;'; EXECUTE var_stmt INTO var_place USING var_state, var_pt ; IF var_place > '' THEN @@ -91,7 +91,7 @@ BEGIN -- We don't have any data for this county RETURN; END IF; - + var_addy.stateAbbrev = var_stusps; -- Find the street edges that this point is closest to with tolerance of 0.005 but only consider the edge if the point is contained in the right or left face @@ -121,7 +121,7 @@ BEGIN FROM e LEFT JOIN addr As a ON (a.statefp = ' || quote_literal(var_state) || ' AND e.tlid = a.tlid and e.eside = a.side) ) SELECT * - FROM (SELECT DISTINCT ON(tlid,side) foo.fullname, foo.predirabrv, foo.streetname, foo.streettypeabbrev, foo.zip, foo.center_pt, + FROM (SELECT DISTINCT ON(tlid,side) foo.fullname, foo.predirabrv, foo.streetname, foo.sufdirabrv, foo.streettypeabbrev, foo.zip, foo.center_pt, side, to_number(CASE WHEN trim(fromhn) ~ ''^[0-9]+$'' THEN fromhn ELSE NULL END,''99999999'') As fromhn, to_number(CASE WHEN trim(tohn) ~ ''^[0-9]+$'' THEN tohn ELSE NULL END,''99999999'') As tohn, ST_GeometryN(ST_Multi(line),1) As line, dist FROM @@ -133,11 +133,11 @@ BEGIN WHERE featnames.statefp = ' || quote_literal(var_state) ||' ) AS n ON (n.statefp = e.statefp AND n.tlid = e.tlid) ORDER BY dist LIMIT 50 ) As foo ORDER BY foo.tlid, foo.side, '; - + -- for numbered street/road use var_rating_highway to determine whether to prefer numbered or not (0 no pref, 1 prefer numbered, 2 prefer named) var_stmt := var_stmt || ' CASE $1 WHEN 0 THEN 0 WHEN 1 THEN CASE WHEN foo.fullname ~ ''[0-9]+'' THEN 0 ELSE 1 END ELSE CASE WHEN foo.fullname > '''' AND NOT (foo.fullname ~ ''[0-9]+'') THEN 0 ELSE 1 END END '; var_stmt := var_stmt || ', foo.fullname ASC NULLS LAST, dist LIMIT 50) As f ORDER BY f.dist, CASE WHEN fullname > '''' THEN 0 ELSE 1 END '; --don't bother penalizing for distance if less than 20 meters - + IF var_debug = true THEN RAISE NOTICE 'Statement 1: %', replace(var_stmt, '$1', var_rating_highway::text); END IF; @@ -156,6 +156,7 @@ BEGIN var_addy.streetname = var_redge.streetname; var_addy.streettypeabbrev := var_redge.streettypeabbrev; var_addy.predirabbrev := var_redge.predirabrv; + var_addy.postDirAbbrev := var_redge.sufdirabrv; END IF; IF ST_Intersects(var_redge.line, var_primary_line) THEN @@ -210,12 +211,13 @@ BEGIN var_addy_alt.streetname := var_addy.streetname; var_addy_alt.streettypeabbrev := var_addy.streettypeabbrev; var_addy_alt.predirabbrev := var_addy.predirabbrev; + var_addy_alt.postDirAbbrev := var_addy.sufdirabrv; addy[array_upper(addy,1) - 1 ] := var_addy_alt; IF var_debug THEN RAISE NOTICE 'Replaced with : %, %', var_addy_alt, clock_timestamp(); END IF; END IF; - + IF var_debug THEN RAISE NOTICE 'End Get matching edges loop: %', clock_timestamp(); RAISE NOTICE 'Final addresses: %, %', addy, clock_timestamp(); diff --git a/extras/tiger_geocoder/regress/reverse_geocode_regress b/extras/tiger_geocoder/regress/reverse_geocode_regress index 0bc6ccb96..ea260e870 100644 --- a/extras/tiger_geocoder/regress/reverse_geocode_regress +++ b/extras/tiger_geocoder/regress/reverse_geocode_regress @@ -5,3 +5,4 @@ I- 90, Auburn, MA 01501|{"(,,90,I-,,,Auburn,MA,01501,)"} 58 Massachusetts Ave, Cambridge, MA 02139|{"(58,,Massachusetts,Ave,,,Cambridge,MA,02139,)","(7,,Wellesley,St,,,Cambridge,MA,02139,)","(7,,Massachusetts,Ave,,,Cambridge,MA,02139,)"} #1913|I- 95, Needham, MA 02494 #2927|77 N Washington St, Boston, MA 02114 +#3806|212 3rd Ave N, Minneapolis, MN 55401 diff --git a/extras/tiger_geocoder/regress/reverse_geocode_regress.sql b/extras/tiger_geocoder/regress/reverse_geocode_regress.sql index 47b21f016..1fef50ee1 100644 --- a/extras/tiger_geocoder/regress/reverse_geocode_regress.sql +++ b/extras/tiger_geocoder/regress/reverse_geocode_regress.sql @@ -6,4 +6,5 @@ SELECT pprint_addy(addy[1]), addy FROM reverse_geocode(ST_Point(-71.123848,42.41 SELECT pprint_addy(addy[1]), addy FROM reverse_geocode(ST_Point(-71.09436,42.35981)); -- 58 Massachusetts Ave, Cambridge, MA 02139 (this gives me different answer but might be tiger change) SELECT '#1913' As ticket, pprint_addy(addy[1]) FROM reverse_geocode(ST_Point(-71.2248416, 42.30344833)); -- I- 95, Needham, MA 02494 SELECT '#2927', pprint_addy(addy[1]) FROM reverse_geocode(ST_Point(-71.058246,42.36514)); -- 77 N Washington St, Boston, MA 02114 -\timing \ No newline at end of file +SELECT '#3806', pprint_addy(addy[1]) FROM reverse_geocode(ST_Point(-93.271872, 44.98510)); -- 212 3rd Ave N, Minneapolis, MN 55401 +\timing