与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