ITPub博客

首页 > > > 当3D数据遇上PostgreSQL

当3D数据遇上PostgreSQL

作者:浪花小雨滴 时间:2020-06-17 17:03:34 0 删除 编辑

随着人类社会数字化进程的推进,越来越多的物理内容开始以数字化的方式呈现。但长久以来这些重要的3D数据资产,大都以文件的形式零散的分布在各个应用内部。这极大的限制了这些资产价值的发挥。

PostGIS是PostgreSQL下的一个非常强大的扩展,虽然名字带GIS但它强大的功能却使它的作用范围不止局限在地理信息领域。今天我们就尝试一下如何用SQL,这种最常见的数据操作手段来处理3D数据资产。


在Linux(Ubuntu 16.04)下Postgresql和PostGIS的安装方式非常简单,只需要一行命令:

sudo apt install postgresql postgresql-contrib postgis postgresql-9.5-postgis-2.2


安装完成启动服务:

sudo service postgresql start


然后切换到postgres用户下,创建测试库并且用3d扩展

 sudo -u postgres -i
 createdb test3d
 psql -c "CREATE EXTENSION hstore;" -d test3d
 psql -c "CREATE EXTENSION postgis;" -d test3d
 psql -c "CREATE EXTENSION postgis_topology;" -d test3d
 psql -c "CREATE EXTENSION fuzzystrmatch;" -d test3d
 psql -c "CREATE EXTENSION postgis_tiger_geocoder;" -d test3d


进入数据库:

psql -d test3d


接下来我们从最基础的3d结构 "点" (Point)的开始:

先创建一个存放点的表

create table point_test(id serial primary key, name varchar );

然后向其中添加可存放空间信息的字段pt

select AddGeometryColumn('point_test','pt',-1,'Point',3);


向其中添加三个点:

insert into point_test (name,pt) values ('p1',ST_GeomFromText('Point(0 0 0)'));
insert into point_test (name,pt) values ('p2',ST_GeomFromText('Point(0 1 0)'));
insert into point_test (name,pt) values ('p3',ST_GeomFromText('Point(0 1 1)'));


既然存在表里了接下来当然就可以通过强大的select来做分析咯:

看一下他们到空间原点的距离

 select id,name,ST_3DDistance(ST_GeomFromText('Point(0 0 0)'),pt)  from point_test;


找到离坐标原点最近的两个点:

select id,name,ST_3DDistance(ST_GeomFromText('Point(0 0 0)'),pt) as distance  from point_test order by distance limit 2;


找出三个点之间相隔最远的两个点:

select p1.name,p2.name,ST_3DDistance(p1.pt,p2.pt) as distance  from point_test as p1,point_test as p2 where p1.id > p2.id order by distance desc limit 1;



当然点只是最简单的结构,复杂的应用场景可以看德哥写文章:

PostgreSQL 在3D 数据内容管理中的应用

PostgreSQL 3D City 应用


最后详细的函数用法推荐大家直接读官方文档:Chapter 8. PostGIS Reference

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3133825/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39927