与postgis相关的一些常用的sql

create table NODES (ID SERIAL not null,geometry geography(POINTZ, 4326) null);
create table EDGES (ID SERIAL not null,geometry geography(LINESTRINGZ, 4326) null);


insert into nodes(geometry) values(ST_GeographyFromText('SRID=4326; POINT(-110 30 40)'));
insert into edges(geometry) values(ST_GeographyFromText('SRID=4326; LINESTRING(-110 30 40,11 22 33)'));

alter table public.nodes alter column geometry set data type geography(PointZ,4326);

select ST_AsText(geometry) from nodes;
select ST_AsText(geometry) from edges;

  注意!!!!注意!!!!!

上面的字段geometry的数据类型是有问题的,我当时也是随便找了个博客一看就按照人家的写上了,然后现在我被坑哭了。。。。

geography应该是表示经纬度的数据类型,经过亲身经历发现,x的范围只有(-180,180),y的范围只有(-90,90),超出范围之后,数据就会和实际存储的不同,会被一定的算法转换

 

所以真正的3D几何类型为

 

create table NODES (ID SERIAL not null,geometry geometry(POINTZ, 4326) null);
create table EDGES (ID SERIAL not null,geometry geometry(LINESTRINGZ, 4326) null);
 
 
insert into nodes(geometry) values(ST_GeomFromEWKT('SRID=4326; POINT(-110 30 40)'));
insert into edges(geometry) values(ST_GeomFromEWKT('SRID=4326; LINESTRING(-110 30 40,11 22 33)'));
 
alter table public.nodes alter column geometry set data type geography(PointZ,4326);
 
select ST_AsText(geometry) from nodes;
select ST_AsText(geometry) from edges;

惭愧,惭愧,当时照搬的时候甚至都没有想过geography是什么意思。。。哎。。╮(╯▽╰)╭

需要注意的是插入的时候 ST_GeomFromEWKT 和 GeomFromEWKT  都可以,我还没发现他们的区别,为了统一,我暂时使用的是 ST_GeomFromEWKT

posted on 2017-05-12 14:43  斜月三星一太阳  阅读(758)  评论(0编辑  收藏  举报