PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres - Wie wird ST_SetSRID (ST_MakePoint (lng, lat), 4326) bei Einfügungen automatisch aufgerufen?

Sie können dies tun, indem Sie einen Trigger verwenden. Ihr Einfügungsaufruf würde sich nicht mit der Geometrie befassen, sondern nur mit Lat-Long- und anderen nicht räumlichen Feldern, und die Triggerfunktion erstellt die Geometrie. Vergessen wir nicht, beim Aktualisieren der Zeile dasselbe zu tun. Beachten Sie, dass ich die SRID fest codiert habe, da es nicht möglich ist, zusätzliche dynamische Parameter an die Triggerfunktion zu übergeben. Fügen Sie bei Bedarf ein Feld zu Ihrer Tabelle hinzu, das diesen Wert enthält, und Sie können darauf als new.srid verweisen

CREATE OR REPLACE FUNCTION markers_geog_tg_fn() RETURNS trigger AS
$BODY$BEGIN
  IF TG_OP = 'INSERT' AND (NEW.lat ISNULL or NEW.lng ISNULL  ) THEN
    RETURN NEW; -- no  geometry
  ELSIF TG_OP = 'UPDATE' THEN
    --Lat Long updated to null, erase geometry
    IF NEW.lat ISNULL or NEW.lng ISNULL THEN
        NEW.geography = NULL;
    END IF;

    IF NEW.lat IS NOT DISTINCT FROM OLD.lat and NEW.lng IS NOT DISTINCT FROM OLD.lng THEN
      RETURN NEW; -- same old geometry
    END IF;
  END IF;
  -- Attempt to transform a geometry
  BEGIN
    NEW.geography := ST_SetSRID(ST_MakePoint(NEW.lng::decimal, NEW.lat::decimal), 4326))
  EXCEPTION WHEN SQLSTATE 'XX000' THEN
    RAISE WARNING 'geography  not updated: %', SQLERRM;
  END;
  RETURN NEW;
END;$BODY$ LANGUAGE plpgsql;

CREATE TRIGGER markers_geog_tg BEFORE INSERT OR UPDATE
   ON markers FOR EACH ROW
   EXECUTE PROCEDURE markers_geog_tg_fn();