PostgreSQL / PostGIS:创建地理要素

PostGIS详细教程可以参考官方文档:https://postgis.net/workshops/zh_Hans/postgis-intro/,并且官方文档提供了练习数据、教程、PPT版本教程。我这里参考QGIS文档中关于PostGIS的教程进行学习。

PostGIS 可以被认为是一组数据库内函数的集合,这些函数扩展了 PostgreSQL 的核心功能,以便它可以存储、检索、查询和操作空间数据。我们可以在psql中使用\df *point*查询与point有关的函数,使用\dT+ *Point*查看点数据类型。

除了PostGIS函数外,PostGIS扩展还EPSG定义的空间参考系(SRS)定义集合。这些在坐标参考系(CRS)转换等操作中使用。这些SRS被定义在spatial_ref_sys表中,可以查看该表的架构:\d spatial_ref_sys;还可以使用SELECT语句来查看特定的EPSG,例如查询常用的WGS 84坐标系。

SELECT * FROM spatial_ref_sys Where srid=4326; 

SFS模型

如何在数据库中存储和表示地理要素,可以使用开放地理空间联盟 (OGC)标准接口:Simple Feature for SQL (SFS) Model,也就是SFS模型。SFS模型是一种以非拓扑方式在数据库中存储地理空间数据方法,并定义了访问、操作和构造数据的函数,用于在SQL数据库中处理简单的空间特征数据。总的来说,SFS包括两部分内容,第一部分是描述简单要素的通用模型,定义了几何对象的基本类型,如点、线、面等;第二部分是描述第一部分模型在SQL中的实现,定义了空间SQL语句中的操作,如AsTextIntersects等。

除此之外,OGC还定义了其他多种标准接口:WMS(Web Map Service)、WFS(Web Feature Service)、WCS(Web Coverage Service)、WMTS(Web Map Tile Service)等。

(1)添加 geometry 字段

首先,修改完善之前创建的streets表和people表:

# 先完善streets表
UPDATE streets SET name='High street' WHERE id=1;
INSERT INTO streets(name) VALUES ('Main Road');
INSERT INTO streets(name) VALUES ('Low Street');
# 完善people表
insert into people (name, house_no, street_id, phone_no)
          values ('Joe Bloggs',3,2,'072 887 23 45');
insert into people (name,house_no, street_id, phone_no)
          values ('Jane Smith',55,3,'072 837 33 35');
insert into people (name,house_no, street_id, phone_no)
          values ('Roger Jones',33,1,'072 832 31 38');
insert into people (name,house_no, street_id, phone_no)
          values ('Sally Norman',83,1,'072 932 31 32'); 

接下来,为数据库pglearn添加postgis拓展:CREATE EXTENSION postgis;,然后向 people 表添加一个 point 字段:

ALTER TABLE people ADD COLUMN geom geometry;
(2)根据几何类型添加约束

geometry 字段类型并没有隐式地指定字段的几何类型,因此添加一个约束,指定几何类型只接受point类型或 null 值,这里的约束'POINT'要注意大小写,小写可能导致后续插入数据失败。

ALTER TABLE people
	ADD CONSTRAINT people_geom_point_chk
	CHECK(GeomeTryType(geom)='POINT'::text
	OR geom IS NULL);
# 删除约束
ALTER TABLE 表名
DROP CONSTRAINT 约束名;
(3)处理geometry_columns表

geometry_columns 表是 PostGIS 扩展的一部分,用于存储空间数据的元信息,这个表记录了每个空间表的详细信息,包括表名、列名、坐标系等。首先查看这个表,发现表里面已经具有了people这个表的相关信息,表中的coord_dimension等于2,表示X和Y两个纬度,但坐标系是0。

 select * from geometry_columns;

因此,修改坐标系为WGS84,我在这里使用UpdateGeometrySRID 函数(表在 public 模式中,可以省略了'public'),显示query string argument of EXECUTE is null,但是表中明明有这个字段。因此,我又使用了原生SQL语句修改,然后修改成功了。我认为可能是因为存在多个geometry_columns 文件,所以使用UpdateGeometrySRID 函数查询时没有查询到正确的表。

SELECT UpdateGeometrySRID('people', 'geom', 4326);

ALTER TABLE people
ALTER COLUMN geom TYPE geometry(Point, 4326)
USING ST_SetSRID(geom,4326);
(4)添加几何信息

使用 SQL 语句将几何记录添加到people表中,要注意ST_GeomFromText函数中不要出现多余的空格和符号等。

insert into people (name,house_no, street_id, phone_no, geom)
    values ('Fault Towers', 34, 3, '072 812 31 28',
            ST_GeomFromText('POINT(33 -33)', 4326)
           );

添加点后,可以使用QGIS连接到数据库查看点的位置。

(5)创建线

在 streets 表中插入一个 LINESTRING;创建多边形相似,需要将参数改为 POLYGON

 sudo -u postgres psql
 \c pglearn
 # 添加列
 ALTER TABLE streets ADD COLUMN geom geometry;
 # 添加约束
 ALTER TABLE streets                         
 ADD CONSTRAINT streets_geom_line_chk
 CHECK(GeomeTryType(geom)='LINESTRING'::text
 OR geom IS NULL);
 # 修改约束的投影
 ALTER TABLE streets
 ALTER COLUMN geom TYPE geometry(LINESTRING, 4326)
 USING ST_SetSRID(geom,4326);
 #添加几何信息
 UPDATE streets
 SET geom = ST_LineFromText('LINESTRING(20 -33,21 -34,24 -33)',4326)
 WHERE streets.id=2;
(6)QGIS加载PostGIS图层

在QGIS中添加PostGIS图层,在图层–添加图层–添加PostGIS图层,打开添加工具。

接下来新建连接,并输入主机IP、测试连接输入用户名和密码。

连接后,便可以看到点图层,双击便可以加载到QGIS中。

### 在无网络连接的Linux系统上安装配置PostgreSQLPostGIS #### 准备工作 为了在无网络环境中成功安装PostgreSQLPostGIS,需要提前准备必要的软件包及其依赖项。这些文件通常可以从官方仓库下载并传输到目标机器。 1. **获取RPM包** 使用有网络连接的计算机访问CentOS或Red Hat家族的YUM源站点,找到对应的PostgreSQLPostGIS RPM包以及其依赖项。例如,在引用中提到的内容显示可以通过`yum`命令来管理PostgreSQL的相关组件[^1]。因此可以手动下载以下RPM包: - `postgresql-<version>.rpm` - `postgresql-server-<version>.rpm` - `postgis31_12.x86_64.rpm` - `postgis31_12-client.x86_64.rpm` 这些包的具体版本号应与目标系统的架构匹配,并确保包含所有必需的依赖关系。 2. **复制至目标主机** 将上述下载好的RPM文件通过USB驱动器或其他介质拷贝到目标服务器上的某个目录下(如 `/tmp/rpms/`)。 --- #### 安装过程 1. **安装PostgreSQL核心服务** 利用本地存储路径中的RPM包执行安装操作。假设已将所有必要文件放置于`/tmp/rpms/`目录,则运行如下命令完成基本数据库引擎设置: ```bash rpm -ivh /tmp/rpms/postgresql*.rpm --nodeps ``` 此处参数`--nodeps`用于忽略可能存在的未解决依赖警告;如果确认所有依赖都已被满足则可省略该选项。 2. **初始化数据目录结构** 初始化新创建的数据集群之前需先定义环境变量指向默认位置或者自定义其他地方作为实际存放区域。接着调用initdb工具建立初始状态下的表空间布局等要素: ```bash export PGDATA=/var/lib/pgsql/<version>/data/ initdb $PGDATA -E UTF8 --locale=en_US.UTF-8 chown -R postgres:postgres $PGDATA chmod 700 $PGDATA systemctl enable postgresql.service && systemctl start postgresql.service ``` 上述脚本片段展示了如何指定字符编码集为UTF8的同时也设置了地区化支持标准[^2]。 3. **加载PostGIS扩展功能模块** 当前实例已经启动完毕之后就可以着手引入地理信息系统特性了。这一步骤涉及到了几个额外步骤以激活矢量图形处理能力以及其他高级属性计算方法等功能点。具体做法如下所示: ```sql CREATE EXTENSION postgis; CREATE EXTENSION postgis_topology; COMMENT ON EXTENSION postgis IS 'Support for geographic objects'; ``` SQL语句序列实现了向现有模式里加入两个主要组成部分——一个是常规几何对象的支持框架即PostGIS本身;另一个则是拓扑学方面的增强型接口设计部分[^3]。 --- #### 配置优化建议 - 修改主配置文件调整性能表现指标:编辑位于`$PGDATA`内的`postgresql.conf`文档修改诸如共享缓冲区大小(`shared_buffers`)、有效内存限制(`effective_cache_size`)等相关条目数值。 - 调整客户端认证策略提高安全性水平:打开同级目录里的`pg_hba.conf`记录重新规划允许接入方式及验证机制类别。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值