plsql根据3度投影计算面积

postgis的经纬度数据,为了稍微精确计算面积,通过获取中心点的经度坐标,计算3都投影的epsg,并计算面积(cgcs2000坐标系)。

原来用select ST_AREA(ST_Transform(ST_SetSRID(geom,4326), epsg)) into area;

会非常慢;

更改为直接处理,如下所示:

create or replace function area_3dgree_new(geom geometry)
returns double precision as
$$
declare
area double precision=0;
lon double precision=ST_X(ST_Centroid(geom));
dh integer=floor((lon+1.5)/3);
epsg integer=(dh - 25)+4534;
srid integer=ST_Srid(geom);
begin
	if position('polygon' in lower(GeometryType(geom))) > 0 then
		if (srid<=0 and lon < 360) or srid=4326 then
			srid=4490;
			geom=ST_SetSRID(geom,srid);
		end if;

		if srid in (4490) then
			area= ST_AREA(ST_Transform(geom, epsg));
		else
			area=ST_AREA(geom);
		end if;
	end if;
	return area;
end
$$
language 'plpgsql' stable;

获取2000坐标系三度带带号:

create or replace function epsg_3dgree(geom geometry,onlyGeography bool = true)
returns integer as
$$
declare
srid integer=ST_Srid(geom);
area double precision=0;
lon double precision;
dh integer;
epsg integer;
begin	
	if onlyGeography then
		if not srid in (4326,4490) then
			return srid;
		end if;
	end if;
	if srid in (4326,4490) then
		lon = ST_X(ST_Centroid(geom));
	else
		lon=ST_X(ST_Centroid(ST_Transform(geom,4490)));
	end if;
	dh=floor((lon+1.5)/3);
	epsg=(dh - 25)+4534;
	return epsg;
end
$$
language 'plpgsql' stable;

转换投影:

create or replace function epsg_transform(geom geometry,target_srid integer)
returns geometry as
$$
declare
srid integer=ST_Srid(geom);
begin	
	if target_srid=srid then
		return geom;
	end if;
	if srid=0 or target_srid=0 then
		return ST_SetSRID(geom,target_srid);
	end if;
	if srid=4326 then
		if target_srid=4490 then
			return ST_SetSRID(geom,target_srid);
		else
			return ST_Transform(ST_SetSRID(geom,4490),target_srid);
		end if;
	end if;
	if target_srid=4326 then
		if srid=4490 then
			return ST_SetSRID(geom,target_srid);
		else
			return ST_SetSRID(ST_Transform(geom,4490),target_srid);
		end if;
	end if;
	return ST_Transform(geom,target_srid);
end
$$
language 'plpgsql' stable;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值