首页 > 数据库 >Postgresql结合Postgis实现大批量矢量点数据转换为线面数据

Postgresql结合Postgis实现大批量矢量点数据转换为线面数据

时间:2023-09-17 09:55:25浏览次数:38  
标签:Postgresql name geometry Postgis ST fid csv 数据 线面

最近在测试客户给的csv数据时,发现了系统中处理的csv导入功能,存在内存处理不当的问题,问题背景是客户给的csv矢量点数据接近100万条,而我们工程师之前实现的时候,是将csv的数据全部查出到VO层,然后再分批插入,这种传统处理方式,在数据体量比较小的情况下,可以满足业务需求,但是当数据体量比较大时,就会造成内存的瞬间增长,严重影响系统使用。 针对这个问题,我们做了如下的处理,不仅不需要使用过多内存,业务层的代码也简化了,更重要的是效率也提升了。 今天就来总结下Postgresql在处理csv数据中存在海量数据时的解决思路。 第一、一定要使用Postgresql的copy命令来实现csv中大量数据的快速插入,关于postgresql的copy命令我在上一篇文章中已经介绍过,大家可以去查看。   第二、导入后的数据处理过程,一般csv(或者excel)中的几何信息都是以经纬度的信息录入,而在一般的项目中我们肯定是需要新建geom字段的,因此需要用到postgis的函数,如果是点数据则直接使用postgis函数 st_makepoint()来构造点的geom对象。   第三、对于线面数据,一般csv中的数据,也是按照点记录的,但是每一条线或每一个面都有多少个点组成,一般csv中都有一个字段来标识,只不过对于面数据而言,每一个面的组成点,起点和终点肯定是一样的,因为面需要闭合,而由点转化为线面的过程我们需要借助postgis的线面处理函数:

geometry ST_MakeLine(geometry geom1, geometry geom2);  //输入起点和终点

geometry ST_MakeLine(geometry[] geoms_array);  //参数是组成该线的点数据
geometry ST_MakeLine(geometry set geoms);  //参数是一个聚合查询,必须使用order by 以确保点的顺序,这个也是我们遇到的问题

 

geometry ST_MakePolygon(geometry linestring);  //参数接收闭合的线环

geometry ST_MakePolygon(geometry outerlinestring, geometry[] interiorlinestrings);
//参数介绍一个内外线环,构成一个带有空心的面数据

 

有了以上的理论知识,我们只需要将这个写理论知识,转成我们的sql语句即可,下面以test.csv为例,这是一个从globalmapper导出的矢量面数据,导出的数据是以点数据存储的,具体涉及到gid、name、lon、lat、fid这几个字段,其中gid是点数据的存储顺序(记住这个很重要),fid是面矢量数据的聚合字段,也就那些点构成一个面,接下俩我们只需要实在sql中执行如下命令就可将test.csv插入到postgresql:

 

CREATE TABLE IF NOT EXISTS public.test
(
    gid int primary key,
    name character varying(100),
    lon double precision,
    lat double precision,
    fid character varying(5) ,
    geom geometry(Polygon)
)

 数据批量插入使用如下命令

Copy test(gid,name,lon,lat,fid) from 'D:/test.csv' csv header DELIMITER ','  

数据插入后接下来就需要将点数据转换为面数据, 这个时候就需要用到上面的ST_MakeLine(geometry[] geoms_array)和ST_MakePolygon(geometry linestring)函数,如何将同一个面数据的点集合批量处理呢,这里我们要用到array_agg()函数,这个函数是postgresql的聚合为数组的函数(这个函数不在这里具体介绍),我们最终的具体sql如下:

select name,st_makepolygon(st_makeline(array_agg(st_makepoint(lon,lat) order by gid))) from test
group by fid,name

通过使用数据库来处理这种海量数据的批量插入,相比在业务代码层次处理,更加的高效。

标签:Postgresql,name,geometry,Postgis,ST,fid,csv,数据,线面
From: https://www.cnblogs.com/share-gis/p/17706523.html

相关文章

  • 申通ubuntu1804快速装postgresql
    先eridocker一套初始化sudosh-c'echo"debhttp://apt.postgresql.org/pub/repos/apt$(lsb_release-cs)-pgdgmain">/etc/apt/sources.list.d/pgdg.list'wget--quiet-O-https://www.postgresql.org/media/keys/ACCC4CF8.asc|sudoapt-keyad......
  • ubuntu22.04.3 安装postgresql 16 rc1数据库
    ubuntu22.04.3安装postgresql16rc1数据库一、直接安装#Createthefilerepositoryconfiguration:sudosh-c'echo"debhttps://apt.postgresql.org/pub/repos/apt$(lsb_release-cs)-pgdgmain">/etc/apt/sources.list.d/pgdg.list'#Importthe......
  • postgresql将表移动到另一个表空间
    创建新的表空间数据库版本pg12主机上创建表空间需要的目录[postgres@db1~]$cd/app/pg/tbs_test[postgres@db1~]$mkdirtbs_test使用root用户登录数据库,创建表空间并授权给u1用户使用mydb=#createtablespacetbs_testlocation'/app/pg/tbs_test';CREATETABLESPACEmydb......
  • PostgreSQL-分区表介绍
    一、分区简介表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案。一般建议当单表大小超过内存就可以考虑表分区了。表的分区就是将一个逻辑上的大表(主要指数据量大),切分为多个小的物理的分片。1.分区的优点1)在某些情况......
  • PostgreSQL技术大讲堂 - 第29讲:执行计划与成本估算
     PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。 第29讲:执行计划与成本估算 内容1:PostgreSQL中查询执行......
  • ubuntu22.04安装并初始化postgresql
    ubuntu22.04自带其实是有数据库的,通过以下命令可以查看当前数据库的版本信息aptshowpostgresql 如果要安装新的数据库,可以执行以下命令sudoaptupdatesudoaptinstallpostgresqlpostgresql-contribpostgresql-contrib或者说contrib包,包含一些不属于P......
  • Docker配置PostgreSQL数据本地持久化
    原文:https://www.cnblogs.com/yangyangming/p/13502405.html主机中的本地目录作为Docker容器内的持久存储卷装载,以便在主机和Docker容器之间共享数据。如果主机希望访问或定期备份在Docker容器内运行的DB服务器写入文件夹的数据或数据库,则此方法非常有用。创建本地数据卷#创建......
  • postgis如何判断要素的类型&判断要素的个数
    st_geometrytypeST_NumGeometries而ST_GeometryN是?参考:https://qastack.cn/gis/28835/changing-geometry-type-from-point-to-multipoint-within-existing-table-in-postgis......
  • postgis 点到线上的投影(垂足)
    参考1:https://blog.csdn.net/xujingzhong0077/article/details/90168277(线性参考)参考2:https://blog.csdn.net/qq_35629963/article/details/127369447......
  • PostgreSQL 通过SQL获取建表语句实现 show create table
    有scheme参数创建函数CREATEORREPLACEFUNCTIONshow_create_table(in_schema_namevarchar,in_table_namevarchar)RETURNStextLANGUAGEplpgsqlVOLATILEAS$$DECLARE--theddlwe'rebuildingv_table_ddltext;--dataaboutt......