Skip to content

Commit

Permalink
added triggers to update generalized routes which for some reason bea…
Browse files Browse the repository at this point in the history
…k during the time
  • Loading branch information
zdila committed Jul 24, 2024
1 parent 504781f commit e2a13c2
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 0 deletions.
105 changes: 105 additions & 0 deletions sql/additional.sql
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,111 @@ CREATE INDEX osm_route_members_idx1 ON osm_route_members (member);

CREATE INDEX osm_route_members_idx2 ON osm_route_members (type);

create index osm_route_members_idx1_g1 on osm_route_members_gen1(member);

create index osm_route_members_idx2_g1 on osm_route_members_gen1(type);

create index osm_route_members_idx1_g0 on osm_route_members_gen0(member);

create index osm_route_members_idx2_g0 on osm_route_members_gen0(type);

-- There seems to be a bug in imposm3. Workaround by using a trigger.
-- https://github.com/omniscale/imposm3/issues/293

CREATE OR REPLACE FUNCTION osm_route_members_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO osm_route_members_gen1 (osm_id, member, role, type, geometry)
VALUES (NEW.osm_id, NEW.member, NEW.role, NEW.type, ST_SimplifyPreserveTopology(NEW.geometry, 50));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION osm_route_members_update_trigger()
RETURNS TRIGGER AS $$
BEGIN
UPDATE osm_route_members_gen1
SET member = NEW.member,
role = NEW.role,
type = NEW.type,
geometry = ST_SimplifyPreserveTopology(NEW.geometry, 50)
WHERE osm_id = NEW.osm_id AND type = NEW.type;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION osm_route_members_delete_trigger()
RETURNS TRIGGER AS $$
BEGIN
DELETE FROM osm_route_members_gen1
WHERE osm_id = OLD.osm_id AND type = OLD.type;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER osm_route_members_after_insert
AFTER INSERT ON osm_route_members
FOR EACH ROW
EXECUTE FUNCTION osm_route_members_insert_trigger();

CREATE TRIGGER osm_route_members_after_update
AFTER UPDATE ON osm_route_members
FOR EACH ROW
EXECUTE FUNCTION osm_route_members_update_trigger();

CREATE TRIGGER osm_route_members_after_delete
AFTER DELETE ON osm_route_members
FOR EACH ROW
EXECUTE FUNCTION osm_route_members_delete_trigger();


CREATE OR REPLACE FUNCTION osm_route_members_gen0_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO osm_route_members_gen0 (osm_id, member, role, type, geometry)
VALUES (NEW.osm_id, NEW.member, NEW.role, NEW.type, ST_SimplifyPreserveTopology(NEW.geometry, 200));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION osm_route_members_gen0_update_trigger()
RETURNS TRIGGER AS $$
BEGIN
UPDATE osm_route_members_gen0
SET member = NEW.member,
role = NEW.role,
type = NEW.type,
geometry = ST_SimplifyPreserveTopology(NEW.geometry, 200)
WHERE osm_id = NEW.osm_id AND type = NEW.type;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION osm_route_members_gen0_delete_trigger()
RETURNS TRIGGER AS $$
BEGIN
DELETE FROM osm_route_members_gen0
WHERE osm_id = OLD.osm_id AND type = OLD.type;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER osm_route_members_gen0_after_insert
AFTER INSERT ON osm_route_members
FOR EACH ROW
EXECUTE FUNCTION osm_route_members_gen0_insert_trigger();

CREATE TRIGGER osm_route_members_gen0_after_update
AFTER UPDATE ON osm_route_members
FOR EACH ROW
EXECUTE FUNCTION osm_route_members_gen0_update_trigger();

CREATE TRIGGER osm_route_members_gen0_after_delete
AFTER DELETE ON osm_route_members
FOR EACH ROW
EXECUTE FUNCTION osm_route_members_gen0_delete_trigger();

-- z-order
--
DROP TABLE IF EXISTS z_order_poi;
Expand Down
43 changes: 43 additions & 0 deletions sql/route_gen_workaround.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
-- There seems to be a bug in imposm3. Simple workaround is to run this regulary, but for better one create a trigger.
-- https://github.com/omniscale/imposm3/issues/293
INSERT INTO
osm_route_members_gen1 (osm_id, member, role, type, geometry)
SELECT
osm.osm_id,
osm.member,
osm.role,
osm.type,
ST_SimplifyPreserveTopology(osm.geometry, 50) AS geometry
FROM
osm_route_members osm
WHERE
NOT EXISTS (
SELECT
1
FROM
osm_route_members_gen1 osm_gen1
WHERE
osm_gen1.osm_id = osm.osm_id
AND osm_gen1.type = osm.type
);

INSERT INTO
osm_route_members_gen0 (osm_id, member, role, type, geometry)
SELECT
osm.osm_id,
osm.member,
osm.role,
osm.type,
ST_SimplifyPreserveTopology(osm.geometry, 200) AS geometry
FROM
osm_route_members osm
WHERE
NOT EXISTS (
SELECT
1
FROM
osm_route_members_gen0 osm_gen0
WHERE
osm_gen0.osm_id = osm.osm_id
AND osm_gen0.type = osm.type
);

0 comments on commit e2a13c2

Please sign in to comment.