首页 > 解决方案 > 根据输入数据填充字段 x、y 或 long、lat,并根据输入创建点

问题描述

我有一个如下创建的表:

CREATE TABLE public."EESsite" (
   "ID" integer NOT NULL,
   "Name" character varying(254),
   "LatitudeDe" double precision,
   "Longitud_1" double precision,
   "Easting" double precision,
   "Northing" double precision,
   geom geometry(Point,32636),
    CONSTRAINT "PrimaryKey" PRIMARY KEY ("ID"))
      WITH (
      OIDS=FALSE
      );
ALTER TABLE public."EESsite"

我想要做的是根据输入数据填充 Longitud_1,LatitudeDE 或 Easting ,Northing。例如,有时我有 LonLat 格式的坐标,但有时我有它们是 UTM,但我的列中都需要它们。从每对坐标中,我想使用函数和触发器创建一个点。我已经能够自动生成点并从 geom 中提取坐标以将它们放入列中,但我无法以编程方式完成。我试过这个:

CREATE OR REPLACE FUNCTION update_latlon_column() 
  RETURNS TRIGGER AS
  $BODY$
   BEGIN
    IF NEW."Longitud_1" IS NULL THEN
    NEW.geom =(ST_Transform(ST_SetSRID(ST_MakePoint(NEW."Longitud_1"::float8,NEW."LatitudeDe"::float8),4326),32636));
    end if;
    IF NEW."Easting" IS NULL THEN
    NEW.geom = ST_SetSRID(ST_MakePoint(NEW."Easting"::float8, NEW."Northing"::float8), 32636),
    NEW.Longitud_1 = (ST_SetSRID(ST_Y(geom),32636),4326),
    NEW.LatitudeDe = (ST_SetSRID(ST_X(geom),32636),4326);
    end if;
   RETURN new;
   END;
  $BODY$
 language plpgsql;


 CREATE TRIGGER update_geom
    BEFORE INSERT OR UPDATE
    ON public."EESsite"
    FOR EACH ROW
    EXECUTE PROCEDURE  update_latlon_column();

我可以同时创建函数和触发器,但是每当我尝试添加新行时,我都会遇到这个问题:

错误:记录“新”没有字段“longitud_1”

任何帮助将不胜感激。

谢谢

标签: postgresqlfunctiontriggerspostgis

解决方案


在遵循wildplasser建议避免使用混合大小写标识符后,我解决了这个问题。我仔细检查了我的代码——它还有其他主要问题——经过一些试验,我的脚本终于可以工作了。如果您有任何改进它的建议,将不胜感激。现在,这段代码的工作方式如下:

如果我填写一个字段并写入 LonLat 坐标(EPSG:4326;但您当然可以更改它),它将使用这些坐标将 geom 填充为 UTM(EPSG:32636)点,然后将填充字段 Easting并使用适当的坐标进行北移。它反过来工作,如果你填充东向和北向,它将在 geom 中创建一个点,然后填充纬度和经度。

尽管如此,这是您可以改进的地方,如果您更改任何这些值,它不会更新任何列。不过,我希望你觉得它有用。

CREATE OR REPLACE FUNCTION public.update_latlon_column()
  RETURNS trigger AS
  $BODY$BEGIN

IF NEW.longitude IS NOT NULL THEN
        NEW.geom = (ST_Transform(ST_SetSRID(ST_MakePoint(NEW.longitude::float8,NEW.latitude::float8),4326),32636));
        NEW.easting = (ST_X(NEW.geom));
        NEW.northing = (ST_Y(NEW.geom));
  ELSIF NEW.easting IS NOT NULL THEN
        NEW.geom = ST_SetSRID(ST_MakePoint(NEW."easting"::float8,NEW."northing"::float8), 32636);
        NEW.longitude = (ST_X(ST_Transform(ST_SetSRID((NEW.geom),32636),4326)));
        NEW.latitude = (ST_Y(ST_Transform(ST_SetSRID((NEW.geom),32636),4326)));
   END IF;

  RETURN new;
  END;
  $BODY$
language plpgsql;

推荐阅读