首页 > > > 当3D数据遇上PostgreSQL
随着人类社会数字化进程的推进,越来越多的物理内容开始以数字化的方式呈现。但长久以来这些重要的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;
当然点只是最简单的结构,复杂的应用场景可以看德哥写文章:
最后详细的函数用法推荐大家直接读官方文档:Chapter 8. PostGIS Reference
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3133825/ ,如需转载,请注明出处,否则将追究法律责任。