3D指向2D点转换 - Postgresql

时间:2015-11-09 03:46:28

标签: postgresql postgis

我正在为地理空间应用程序构建后端。它涉及纬度,经度和海拔的存储(可选)。

表格中的Location列的类型为Location geography(POINtZ,4326)

插入声明 "INSERT INTO someTable (Location) VALUES(ST_GeographyFromText('SRID=4326;POINT(?)');

我在插入3d点(用String格式)代替"?"时没有问题,但是我如何处理我只有经度和纬度的情况?出于显而易见的原因,我不想操纵位置字符串以将第三个值(高度)设置为零。

我希望有人可以帮我解决这个问题。

提前致谢。

2 个答案:

答案 0 :(得分:1)

PostGIS功能只能支持特定维度,并且不灵活,第三个坐标是可选的,我继续坚持将数据类型Location作为PointZ并检查维度位置。

如果发现该点是2D,则位置字符串附加一个垃圾值,如-34567891,以避免插入错误和位置检索时,请注意解析这些类型的位置点。

答案 1 :(得分:0)

您的列是3d点类型(POINTZ)。这就是为什么你必须提供3d点。我认为有两种方法可以解决您的问题:

1.使用以下内容将列转换为geometry(point, 4326)(2d点)类型:

alter table someTable
    alter Location type geometry(point, 4326)
        using st_force2d(Location);

然后你就可以插入2d点了。

2.修改您的插入查询,如下所示:

INSERT INTO someTable (Location)
    VALUES(st_force3d(ST_GeographyFromText('SRID=4326;POINT(?)'));.

在这种情况下,你将它传递给2d点,查询会将其转换为3d点,使用零作为第三维。

如果z-dimension的零值不是一个选项,那么您可以在表格中有一列来显示几何体的尺寸。例如:

alter table someTable add geomdim int;

然后在插入时用当前尺寸填充它。例如:

with geom_t as (
    select st_geomfromtext('POINT(?)', 4326) as geom
)
insert into someTable(Location, geomdim)
    select st_force3d(geom)::geography, st_coorddim(geom) from geom_t;