आप ट्रिगर का उपयोग करके ऐसा कर सकते हैं। आपकी सम्मिलित कॉल ज्यामिति से संबंधित नहीं होगी, केवल अक्षांश-लंबी और अन्य गैर-स्थानिक क्षेत्रों के साथ, और ट्रिगर फ़ंक्शन ज्यामिति बनाएगा। पंक्ति को अपडेट करते समय ऐसा करना न भूलें। ध्यान दें कि मैंने SRID को हार्ड-कोड किया है क्योंकि ट्रिगर फ़ंक्शन में अतिरिक्त गतिशील पैरामीटर पास करना संभव नहीं है। यदि आवश्यक हो, तो इस मान को रखने के लिए अपनी तालिका में एक फ़ील्ड जोड़ें और आप इसे new.srid
के रूप में संदर्भित कर सकते हैं
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();