-CREATE OR REPLACE FUNCTION create_interpolation(wayid INTEGER, interpolationtype TEXT) RETURNS INTEGER
- AS $$
-DECLARE
-
- newpoints INTEGER;
- waynodes integer[];
- nodeid INTEGER;
- prevnode RECORD;
- nextnode RECORD;
- startnumber INTEGER;
- endnumber INTEGER;
- stepsize INTEGER;
- orginalstartnumber INTEGER;
- originalnumberrange INTEGER;
- housenum INTEGER;
- linegeo GEOMETRY;
- search_place_id INTEGER;
-
- havefirstpoint BOOLEAN;
- linestr TEXT;
-BEGIN
- newpoints := 0;
- IF interpolationtype = 'odd' OR interpolationtype = 'even' OR interpolationtype = 'all' THEN
-
- select nodes from planet_osm_ways where id = wayid INTO waynodes;
---RAISE WARNING 'interpolation % % %',wayid,interpolationtype,waynodes;
- IF array_upper(waynodes, 1) IS NOT NULL THEN
-
- havefirstpoint := false;
-
- FOR nodeidpos in 1..array_upper(waynodes, 1) LOOP
-
- select min(place_id) from placex where osm_type = 'N' and osm_id = waynodes[nodeidpos]::INTEGER and type = 'house' INTO search_place_id;
- IF search_place_id IS NULL THEN
- -- null record of right type
- select * from placex where osm_type = 'N' and osm_id = waynodes[nodeidpos]::INTEGER and type = 'house' limit 1 INTO nextnode;
- select ST_SetSRID(ST_Point(lon::float/10000000,lat::float/10000000),4326) from planet_osm_nodes where id = waynodes[nodeidpos] INTO nextnode.geometry;
- ELSE
- select * from placex where place_id = search_place_id INTO nextnode;
- END IF;
-
---RAISE WARNING 'interpolation node % % % ',nextnode.housenumber,ST_X(nextnode.geometry),ST_Y(nextnode.geometry);
-
- IF havefirstpoint THEN
-
- -- add point to the line string
- linestr := linestr||','||ST_X(nextnode.geometry)||' '||ST_Y(nextnode.geometry);
- endnumber := ('0'||substring(nextnode.housenumber,'[0-9]+'))::integer;
-
- IF startnumber IS NOT NULL and startnumber > 0 AND endnumber IS NOT NULL and endnumber > 0 THEN
-
---RAISE WARNING 'interpolation end % % ',nextnode.place_id,endnumber;
-
- IF startnumber != endnumber THEN
-
- linestr := linestr || ')';
---RAISE WARNING 'linestr %',linestr;
- linegeo := ST_GeomFromText(linestr,4326);
- linestr := 'LINESTRING('||ST_X(nextnode.geometry)||' '||ST_Y(nextnode.geometry);
- IF (startnumber > endnumber) THEN
- housenum := endnumber;
- endnumber := startnumber;
- startnumber := housenum;
- linegeo := ST_Reverse(linegeo);
- END IF;
- orginalstartnumber := startnumber;
- originalnumberrange := endnumber - startnumber;
-
--- Too much broken data worldwide for this test to be worth using
--- IF originalnumberrange > 500 THEN
--- RAISE WARNING 'Number block of % while processing % %', originalnumberrange, prevnode, nextnode;
--- END IF;
-
- IF (interpolationtype = 'odd' AND startnumber%2 = 0) OR (interpolationtype = 'even' AND startnumber%2 = 1) THEN
- startnumber := startnumber + 1;
- stepsize := 2;
- ELSE
- IF (interpolationtype = 'odd' OR interpolationtype = 'even') THEN
- startnumber := startnumber + 2;
- stepsize := 2;
- ELSE -- everything else assumed to be 'all'
- startnumber := startnumber + 1;
- stepsize := 1;
- END IF;
- END IF;
- endnumber := endnumber - 1;
- delete from placex where osm_type = 'N' and osm_id = prevnode.osm_id and type = 'house' and place_id != prevnode.place_id;
- FOR housenum IN startnumber..endnumber BY stepsize LOOP
- -- this should really copy postcodes but it puts a huge burdon on the system for no big benefit
- -- ideally postcodes should move up to the way
- insert into placex (osm_type, osm_id, class, type, admin_level, housenumber, street, isin,
- country_code, parent_place_id, rank_address, rank_search, indexed_status, geometry)
- values ('N',prevnode.osm_id, prevnode.class, prevnode.type, prevnode.admin_level, housenum, prevnode.street, prevnode.isin,
- prevnode.country_code, prevnode.parent_place_id, prevnode.rank_address, prevnode.rank_search, 1, ST_Line_Interpolate_Point(linegeo, (housenum::float-orginalstartnumber::float)/originalnumberrange::float));
- newpoints := newpoints + 1;
---RAISE WARNING 'interpolation number % % ',prevnode.place_id,housenum;
- END LOOP;
- END IF;
- havefirstpoint := false;
- END IF;
- END IF;
-
- IF NOT havefirstpoint THEN
- startnumber := ('0'||substring(nextnode.housenumber,'[0-9]+'))::integer;
- IF startnumber IS NOT NULL AND startnumber > 0 THEN
- havefirstpoint := true;
- linestr := 'LINESTRING('||ST_X(nextnode.geometry)||' '||ST_Y(nextnode.geometry);
- prevnode := nextnode;
- END IF;
---RAISE WARNING 'interpolation start % % ',nextnode.place_id,startnumber;
- END IF;
- END LOOP;
- END IF;
- END IF;
-
---RAISE WARNING 'interpolation points % ',newpoints;
-
- RETURN newpoints;
-END;
-$$
-LANGUAGE plpgsql;
-
-CREATE OR REPLACE FUNCTION placex_insert() RETURNS TRIGGER