postgresql+postgis基础语法

1.创建空间表

    CREATE TABLE public.my_polygon
    (
        id bigserial,
        name character(100) COLLATE pg_catalog."default" NOT NULL,
        mypolygon geometry NOT NULL,
        salary integer,
        CONSTRAINT my_polygon_pkey PRIMARY KEY (id)
    )

    空间字段:mypolygon; 数据类型为geometry;
    
    bigserial: 主键自增类型;
    
2.psql表操作

    //添加点
    1) insert into my_polygon values (1,'点','POINT(0 0)');
    
    //添加线,多边形也是线点存储
    2) insert into my_polygon values (2,'线条','LINESTRING(0 0,1 1,1 2)');  

    
    //查看所有表记录
    3)select * from 表名;
    
        select * from my_polygon;  //数据不进行处理,空间字段展示增强的16进制编码
        
        select id,name,ST_AsText(mypolygon) from my_polygon; //空间几何字段处理展示文本类型,POINT(1 1)等
        
    
    //更新数据
    4)UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN  WHERE [condition];
    
        update my_polygon SET name = '点',mypolygon = 'POINT(1 1)' where id = 1
        update my_polygon SET name = '点',mypolygon = ST_AsText('POINT(1 1)') where id = 1;
        update my_polygon SET name = '点',mypolygon = ST_GeomFromText('POINT(1 1)') where id = 1
        
        注释:效果一样,最终表数据16进制展示;
    
    //删除记录
    5)delete from my_polygon where id = 3
    
    //排序查询
    6)SELECT column-list FROM table_name [WHERE condition] [ORDER BY column1, column2, .. columnN] [ASC | DESC];
    
        select id,name,ST_AsText(mypolygon) from my_polygon order by name;

    //分组查询
    7)SELECT column-list FROM table_name WHERE [conditions ] GROUP BY column1, column2....columnN 
    
        select name,sum(salary) from my_polygon group by name; //正确
        
        select id,name,sum(salary) from my_polygon group by id,name //正确,salary是添加的integer字段
        
        select id,name from my_polygon group by name; //错误,当查询字段含有id,group by后也必须添加id;
        
        select id,name from my_polygon group by id,name; //正确
        
        select name from my_polygon group by name; //正确,查询字段不含id,group by后id无要求,可要可不要;
        
        select name from my_polygon group by id,name; //正确
        
    //条件查询
    8)SELECT column1, column2, ..... columnN FROM table_name WHERE [search_condition] AND [search_condition];

        //and
        select * from my_polygon where id >= 2 and salary <5000;
        
        //or
        select * from my_polygon where id >= 2 or salary <5000;
        
        //and & or
        select * from my_polygon where id >=2 and salary >5000 or id = 1;
        
        //not
        select * from my_polygon where name is not null;
        
        //like
        select * from my_polygon where name like '_青%';
        
        //in
        select * from my_polygon where salary in (1000,1500);
        
        //not in 
        select * from my_polygon where salary not in (1000,1500);
        
        //between ... and ...
        select * from my_polygon where salary between 0 and 2000;
        
        
    //别名
    9)SELECT column_name AS alias_name FROM table_name conditions...  ;
    
        select ST_AsText(mypolygon) as polygon from my_polygon;  //字段别名
        
    //主键自增
    10)创建表时候使用
        
        CREATE TABLE tablename (
            id SERIAL PRIMARY KEY
        );
    
   
3.空间字段函数

    a) ST_AsText  -返回没有SRID元数据的几何/地理的知名文本(WKT)表示。
    
        text ST_AsText(几何 g1) ;   //g1 必须为geometry类型
    
        WKT格式不保持精度,以防止浮动截断,使用ST_AsBinary或ST_AsEWKB格式进行传输。
        
        
    b)ST_GeomFromText -从知名文本表示(WKT)返回指定的ST_Geometry值。

        geometry ST_GeomFromText(text WKT); //不知道srid时候默认srid=0

        geometry ST_GeomFromText(text WKT, integer srid);    //SRID=4326,WGS84坐标系; SRID=900913,900913坐标系;
        
        当空间字段类型不适用geometry类型,使用text类型时候使用;
        
        SQL: select ST_GeomFromText(text类型的字段) from 表名 ; 
        
        
    
    c)ST_AsBinary - 返回没有SRID元数据的几何/地理的已知二进制(WKB)表示。支持3维数据;
        
        bytea ST_AsBinary(几何 g1) ;

        bytea ST_AsBinary(几何 g1,文本NDR_or_XDR) ;

        bytea ST_AsBinary(地理 g1) ;

        bytea ST_AsBinary(地理 g1,文本NDR_or_XDR) ;
    
        地理类型为三维,不考虑;
        
        
    d)ST_Within  - 如果几何A完全位于几何B内,则返回true    
    
        boolean ST_Within(几何 A,几何 B) ;  //矩形,多边形电子围栏可用
        
    e)ST_Contains - 当且仅当B的点没有位于A的外部并且B的内部至少有一个点位于A的内部时,才返回true。
    
        boolean ST_Contains(几何几何 geomA,几何 geomB) ;
    
    f)ST_Equals - 如果给定的几何图形代表相同的几何图形,则返回true。方向性被忽略
    
        boolean ST_Equals(几何 A,几何 B) ;
    
    g)ST_OrderingEquals - 如果给定的几何体表示相同的几何体并且点的方向顺序相同,则返回true。
    
        boolean ST_OrderingEquals(geometry A, geometry B);
    
    h)ST_Transform - 返回一个新的几何体,其坐标转换为不同的空间参考。
        
        geometry ST_Transform(几何 g1,整数 srid) ;

        geometry ST_Transform(几何 GEOM,文字 to_proj) ;

        geometry ST_Transform(几何 GEOM,文字 from_proj,文字 to_proj) ;

        geometry ST_Transform(几何 的geom,文本 from_proj,整数 to_srid) ;
        
    j)ST_DWithin -以g1为中心,半径为distance_of_srid,这个范围内包不包含g2,如果包含反回true,否则即为假
    
        boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);//圆电子围栏
        
    h)ST_MakePolygon - 创建由给定外壳形成的多边形。输入几何必须是封闭的LINESTRINGS。
    
        geometry ST_MakePolygon(几何线串) ;

        geometry ST_MakePolygon(几何外部字符串,几何[] 内部线) ;
        
    
4.高级空间数据检索

    //获取区域的最大范围,是个矩形
    select st_xmin(geom),st_ymin(geom),st_xmax(geom),st_ymax(geom) from  表名 ;
    
    //返回含有指定点的geometry对应记录列表
    select * from my_polygon where ST_Within(st_geomfromtext('POINT(1 1)'),mypolygon) ;
    
    //计算距离,单位是度
    SELECT ST_Distance(
        ST_GeomFromText('POINT(114.1235 34.3521)',4326),
        ST_GeomFromText('LINESTRING(114.1260 34.45, 114.123 34.1546)', 4326)
    );
    
    //计算距离,单位是米
    SELECT ST_Distance(
            ST_Transform(ST_GeomFromText('POINT(-72.1235 42.3521)',4326),900913),
            ST_Transform(ST_GeomFromText('LINESTRING(-72.1260 42.45, -72.123 42.1546)', 4326),900913)
        );
    
    //判断指定A点是否在以B点为圆心,指定半径长度C的圆上; 圆电子围栏
    select ST_DWithin(B,A,C) 
    
    示例:select ST_DWithin('POINT(2 2)','POINT(3 3)',2) ;
        
    //判断A点(0,0.5)是否在多边形上
    SELECT ST_Contains((SELECT mypolygon FROM my_polygon WHERE id = 4), st_geometryfromtext('POINT(0 0.5)'));
    
    
    //查找以(-87.71 43.741)为中心半径1500米范围内的兴趣点,之后按与这个中心点由近到远的顺序排列结果
                    
    select * from my_polygon where ST_DWithin(
        ST_Transform(ST_GeomFromText('POINT(-87.71 43.741)',4326),900913),
        ST_Transform(ST_GeomFromText(st_astext(mypolygon),4326),900913),
        1500
    ) 
    order by ST_Distance(
                ST_Transform(ST_GeomFromText('POINT(-87.71 43.741)',4326),900913),
                ST_Transform(ST_GeomFromText(st_astext(mypolygon),4326),900913)
    );
        
    

注: 自己学习整理,数据库表名,字段,很多不太规范,希望大家指正,共同进步。
    
    
    
    
    
    
    

你可能感兴趣的:(数据库)