postgresql - 根据输入数据填充字段 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”
任何帮助将不胜感激。
谢谢
解决方案
在遵循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;
推荐阅读
- django - 如何在 Django 中创建自定义菜单结构
- java - 如何计算与视锥体的碰撞
- android - 如何从 Firebase 推送通知中获取字幕
- html - 如何绑定 HTML 表单和 nodejs 代码
- spring-cloud - 从long类型的HashMap中接收到整数类型的LinkedHashMap?
- python - Python 3.7 既不从命令行也不从 pycharm 打印
- java - 如何从 java soap web 服务返回 JSON 结果
- php - 在php中foreach循环内的第一项之后添加条件
- javascript - React Router 生成的链接默认被阻止
- android - 在 TextView 中显示数据时如何在 Sqlite 中添加换行符