Skip to content

Creating Triggers for the Geocoder

Mario Basa edited this page Apr 27, 2022 · 2 revisions

The following are the steps that can be taken to automatically geocode an address in a table on each INSERT and/or UPDATE action.

Create the Trigger Function:

CREATE OR REPLACE FUNCTION geocder_trigger_func()
  RETURNS TRIGGER 
  LANGUAGE PLPGSQL
  AS
$$
BEGIN
	IF NEW.address IS NOT NULL AND NEW.address <> '' THEN
		 NEW.gc = geocoder(NEW.address);
	END IF;

	RETURN NEW;
END;
$$

Create a Sample Table

CREATE TABLE trigtable (id SERIAL,address TEXT,gc GEORES);

Create a Trigger on the Sample Table

CREATE TRIGGER trigtable_trigger1
  BEFORE INSERT OR UPDATE
  ON trigtable
  FOR EACH ROW
  EXECUTE PROCEDURE geocder_trigger_func();

The table definition will be like this:

                             Table "public.trigtable"
 Column  |  Type   | Collation | Nullable |                Default                
---------+---------+-----------+----------+---------------------------------------
 id      | integer |           | not null | nextval('trigtable_id_seq'::regclass)
 address | text    |           |          | 
 gc      | geores  |           |          | 
Triggers:
    trigtable_trigger1 BEFORE INSERT OR UPDATE ON trigtable FOR EACH ROW EXECUTE FUNCTION geocder_trigger_func()

Insert Address Data

INSERT INTO trigtable (address) VALUES 
  ('京都府京都市上京区御前通今出川上ル馬喰町885'),
  ('京都府京都市中京区二条通富小路東入晴明町673-2'),
  ('京都府京都市中京区河原町蛸薬師東側塩屋町324古城ビル地下1F'),
  ('京都府京都市中京区御池通寺町東入下本能寺前町492番地1他'),
  ('京都府京都市上京区今出川通六軒町西入西上善寺町207-6');

Display the inserted data:

select id,address from trigtable;
 id |                            address                             
----+----------------------------------------------------------------
  1 | 京都府京都市上京区御前通今出川上ル馬喰町885
  2 | 京都府京都市中京区二条通富小路東入晴明町673-2
  3 | 京都府京都市中京区河原町蛸薬師東側塩屋町324古城ビル地下1F
  4 | 京都府京都市中京区御池通寺町東入下本能寺前町492番地1他
  5 | 京都府京都市上京区今出川通六軒町西入西上善寺町207-6
(5 rows)

Display the Geocoder Data:

select (gc).code,(gc).todofuken,(gc).shikuchoson,
  (gc).ooaza,(gc).chiban,(gc).x,(gc).y from trigtable;
 code | todofuken | shikuchoson  |    ooaza     | chiban |     x      |     y     
------+-----------+--------------+--------------+--------+------------+-----------
    2 | 京都府    | 京都市上京区 | 馬喰町       | 885    | 135.736477 | 35.030054
    2 | 京都府    | 京都市中京区 | 晴明町       | 673    | 135.765329 | 35.013509
    2 | 京都府    | 京都市中京区 | 塩屋町       | 324    | 135.769512 | 35.005731
    2 | 京都府    | 京都市中京区 | 下本能寺前町 | 492    | 135.767985 | 35.010143
    2 | 京都府    | 京都市上京区 | 西上善寺町   | 207    | 135.740488 | 35.029396
(5 rows)

Updating An Address Data

update trigtable set address = '北海道札幌市白石区東札幌五条5-4-30-2' where id = 5;

Display the updated data:

select id,address from trigtable;
 id |                            address                             
----+----------------------------------------------------------------
  1 | 京都府京都市上京区御前通今出川上ル馬喰町885
  2 | 京都府京都市中京区二条通富小路東入晴明町673-2
  3 | 京都府京都市中京区河原町蛸薬師東側塩屋町324古城ビル地下1F
  4 | 京都府京都市中京区御池通寺町東入下本能寺前町492番地1他
  5 | 北海道札幌市白石区東札幌五条5-4-30-2
(5 rows)

Display the Geocoder Data:

select (gc).code,(gc).todofuken,(gc).shikuchoson,
  (gc).ooaza,(gc).chiban,(gc).x,(gc).y from trigtable;
 code | todofuken | shikuchoson  |      ooaza       | chiban |     x      |     y     
------+-----------+--------------+------------------+--------+------------+-----------
    2 | 京都府    | 京都市上京区 | 馬喰町           | 885    | 135.736477 | 35.030054
    2 | 京都府    | 京都市中京区 | 晴明町           | 673    | 135.765329 | 35.013509
    2 | 京都府    | 京都市中京区 | 塩屋町           | 324    | 135.769512 | 35.005731
    2 | 京都府    | 京都市中京区 | 下本能寺前町     | 492    | 135.767985 | 35.010143
    2 | 北海道    | 札幌市白石区 | 東札幌五条五丁目 | 4      | 141.395119 | 43.049696
(5 rows)