百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

PostgreSQL与PostGIS的基础入门

toyiye 2024-06-21 12:23 10 浏览 0 评论

特别说明:该专栏文章均来源自微信公众号《大数据实战演练》,欢迎关注!

PostgreSQL版本:9.6.12

PostGIS版本:2.4.6

一、概述

1.1 PostgreSQL概述

PostgreSQL是一个功能强大的对象关系型数据库管理系统(ORDBMS)。用于安全地存储数据,支持最佳做法,并允许在处理请求时检索它们。

PostgreSQL的特点如下:

  • PostgreSQL支持SQL的许多功能,例如复杂SQL查询、SQL子选择、外键、触发器、视图、事务、多进程并发控制、流式复制、热备等。
  • 支持更多的数据类型,除了支持SQL基本的数据类型以外,还支持uuid,monetary, enumerated,geometric,binary,network address,bit string,text search,xml,json,array,composite和range数据类型,以及一些内部对象标识和日志位置类型。
  • 可以安装多个扩展以向PostgreSQL添加附加功能,比如支持PostGIS扩展。
  • 继承表,分区表就是依赖于继承实现的。
  • 搜索索引:全文搜索索引足以应对简单场景;丰富的索引类型,支持函数索引,条件索引。
  • 支持OLAP:citus分布式插件,ANSI SQL兼容,窗口函数,CTE,CUBE等高级分析功能,任意语言写UDF。

1.2 PostGIS概述

PostGIS作为新一代空间数据存储标准模型,将空间地理信息数据结构规范为关系型数据库可以承载的sp模式(simple features),这样,使得之前门槛颇高的gis空间数据存储模式变得通俗易懂、简单明了。

最重要的只要接触过SQL语言,就可以利用PostGIS的SQL语法便捷的操纵装载着空间信息的数据框(数据表),这些二维表除了被设定了一个特殊的空间地理信息字段(带有空间投影信息、经纬度信息等)之外,与主流数据管理系统所定义的各种字段并无两样。

PostGIS安装不仅依赖于PostgreSQL,还依赖于很多插件:

  • GEOS几何对象库
  • GDAL栅格功能
  • LibXML2
  • LIBJSON

PostGIS的特点如下:

  • PostGIS支持所有的空间数据类型,这些类型包括:点(POINT)、线(LINESTRING)、面(POLYGON)、多点 (MULTIPOINT)、多线(MULTILINESTRING)、多面(MULTIPOLYGON)和几何集合 (GEOMETRYCOLLECTION)等。PostGIS支持所有的对象表达方法,比如WKT和WKB。
  • PostGIS支持所有的数据存取和构造方法,如GeomFromText()、AsBinary(),以及GeometryN()等。
  • PostGIS提供简单的空间分析函数(如Area和Length)同时也提供其他一些具有复杂分析功能的函数,比如Distance。
  • PostGIS提供了对于元数据的支持,如GEOMETRY_COLUMNS和SPATIAL_REF_SYS。同时,PostGIS也提供了相应的支持函数,如AddGeometryColumn和DropGeometryColumn。
  • PostGIS提供了一系列的二元谓词(如Contains、Within、Overlaps和Touches)用于检测空间对象之间的空间关系,同时返回布尔值来表征对象之间符合这个关系。
  • PostGIS提供了空间操作符(如Union和Difference)用于空间数据操作。
  • 数据库坐标变换
  • 球体长度运算
  • 三维的几何类型
  • 空间聚集函数
  • 栅格数据类型

二、安装

如何安装PostgreSQL + PostGIS请点击:如何查找并下载rpm依赖包并使用yum离线安装rpm包

PostgreSQL与PostGIS版本的依赖关系可点击:http://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS 。

三、基本使用

3.1 PostgreSQL

3.1.0 启停PostgreSQL

如果是初次安装Postgresql9.6的话,需要初始化数据库,执行以下命令:

# 初次启动需要初始化数据库
/usr/pgsql-9.6/bin/postgresql96-setup initdb

数据库初始化完毕之后,在/var/lib/pgsql/9.6/data/目录下会生成很多文件。

接下来罗列一下postgresql的启动、停止、查看状态的命令:

# 启动postgresql
systemctl start postgresql-9.6.service
# 查看postgresql状态
systemctl status postgresql-9.6.service
# 停止postgresql
systemctl stop postgresql-9.6.service

3.1.1 psql登陆

# 切换用户
su postgres
# 执行psql命令
psql

默认连接postgres数据库,会出现“postgres=#”的字符串,执行效果如下图所示:

3.1.2 创建数据库

创建testdb数据库:

CREATE DATABASE testdb;

3.1.3 复制数据库

创建demo数据库,内容与testdb数据库一致:

CREATE DATABASE demo TEMPLATE=testdb;

3.1.4 删除数据库

删除demo数据库:

drop database demo;

3.1.5 查看数据库列表

执行\l来查看数据库列表:

\l

执行效果如下图所示:

3.1.6 连接数据库

连接数据库有两种方式:

  • psql模式内连接

假如连接testdb数据库,执行以下代码:

postgres=# \c testdb

执行效果如下图所示:

  • psql模式外连接
postgres=# \q # 退出psql模式
bash-4.2$ psql -d testdb

执行效果如下图所示:

3.1.7 创建表

创建一个表,用来存储城市的最高及最低温度。代码如下所示:

CREATE TABLE location_city (
 name varchar(80),
 location point
);

3.1.8 列出数据表

在testdb数据库下,执行\d命令列出数据表:

\d

执行效果如下:

3.1.9 查看表结构

使用\d [tableName]命令来查看表结构,比如查看location_city表:

\d location_city;

执行效果如下图所示:

3.1.10 批量插入数据

批量插入数据有两种常用的方式:

  • 多values方式
INSERT INTO location_city VALUES ('San Francisco', '(-194.0, 53.0)'), ('New York', '(-184.0, 43.0)'), ('北京', '(-94.0, 133.0)'), ('Los Angeles', '(-297.0, 63.0)'), ('Chicago', '(-94.0, 283.0)');
  • copy方式

首先,在/tmp创建一个文件location_city.csv,插入如下数据,其中第一行的内容为空:

"Denver","(123,34)"
"Fort Worth","(-23,21)"
"上海","(45,66)"

执行如下代码:

COPY location_city FROM '/tmp/location_city.csv' delimiter ',' csv header;

执行结果如下图所示:

copy扩展

copy location_city to '/tmp/location_city_out.csv' delimiter ',' csv header encoding 'GBK';

打开该文件后效果:

  • 通过window的excel查看,正常。
  • 用linux的vim命令查看,中文乱码。解决方案:

解决linux下查看文件乱码问题:

vim ~/.vimrc
set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936

查看文件编码:

# 在Vim中可以直接查看文件编码
:set fileencoding

3.1.11 查询数据

查询location_city表中name与position字段的所有数据:

SELECT * FROM location_city;

3.1.12 更新数据

使用UPDATE … SET …命令来更新location_city表的数据:

UPDATE location_city SET location = '(52,53)' WHERE name = 'Fort Worth';

3.1.13 删除数据

  • 删除指定数据,比如删除name为“San Francisco”的数据:
DELETE FROM location_city WHERE name = 'San Francisco';
  • 清空cities表数据:
DELETE FROM location_city;
# 或者
TRUNCATE location_city;

3.2 PostGIS

PostgreSQL数据库安装PostGIS扩展,数据库将可以进行空间数据管理、数量测量与几何拓扑分析。

3.2.1 在testdb数据库下安装PostGIS扩展

安装PostGIS扩展:

CREATE EXTENSION postgis;

验证PostGIS扩展是否安装成功:

SELECT postgis_full_version();

执行效果如下图所示:

还可以安装其它的一些扩展:

-- Enable Topology
CREATE EXTENSION postgis_topology;
-- Enable PostGIS Advanced 3D-- and other geoprocessing algorithms
-- sfcgal not available with all distributions
CREATE EXTENSION postgis_sfcgal;
-- fuzzy matching needed for Tiger
CREATE EXTENSION fuzzystrmatch;
-- rule based standardizer
CREATE EXTENSION address_standardizer;
-- example rule data set
CREATE EXTENSION address_standardizer_data_us;
-- Enable US Tiger Geocoder
CREATE EXTENSION postgis_tiger_geocoder;

可使用\dx命令查看已安装的扩展。

3.2.2 创建空间数据表

  • 先建立一个常规的表存储
CREATE TABLE cities(id smallint,name varchar(50));
  • 添加一个空间列,用于存储城市的位置。
  • 习惯上这个列叫做 “the_geom”。它记录了数据的类型(点、线、面)、有几维(这里是二维)以及空间坐标系统。这里使用 EPSG:4326 坐标系统:
SELECT AddGeometryColumn ('cities', 'the_geom', 4326, 'POINT', 2);

3.2.3 插入数据到空间表

批量插入三条数据:

INSERT INTO cities(id, the_geom, name) VALUES (1,ST_GeomFromText('POINT(-0.1257 51.508)',4326),'London, England'), (2,ST_GeomFromText('POINT(-81.233 42.983)',4326),'London, Ontario'), (3,ST_GeomFromText('POINT(27.91162491 -33.01529)',4326),'East London,SA');

3.2.4 简单查询

标准的PostgreSQL语句都可以用于PostGIS,这里我们查询cities表数据:

SELECT * FROM cities;

执行效果如下图所示:

这里的坐标是无法阅读的 16 进制格式。要以WKT文本显示,使用ST_AsText(the_geom)或ST_AsEwkt(the_geom)函数。也可以使用ST_X(the_geom)和ST_Y(the_geom)显示一个维度的坐标:

SELECT id, ST_AsText(the_geom), ST_AsEwkt(the_geom), ST_X(the_geom), ST_Y(the_geom) FROM cities;

执行效果如下图所示:

3.2.5 空间查询

以米为单位并假设地球是完美椭球,上面三个城市相互的距离是多少?

执行以下代码计算距离:

SELECT p1.name,p2.name,ST_Distance_Sphere(p1.the_geom,p2.the_geom) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;

执行效果如下图所示:

四、总结

本文首先说明了PostgreSQL与PostGIS的基本概念,又罗列了两者的yum安装教程及版本兼容关系,最后讲解了一下PostgreSQL的简单使用及PostGIS的空间查询的简单示例。

关于PostgreSQL的一些官方学习资料如下,请参考:

  • https://www.postgresql.org/files/documentation/pdf/9.6/postgresql-9.6-A4.pdf
  • https://wiki.postgresql.org/wiki/9.1%E7%AC%AC%E4%BA%8C%E7%AB%A0
  • https://wiki.postgresql.org/wiki/Main_Page
  • 易百教程:https://www.yiibai.com/postgresql/postgresql-datatypes.html
  • 中文手册:http://www.postgres.cn/docs/9.6/index.html
  • Postgres中文社区:http://www.postgres.cn/v2/home

关于PostGIS的官方学习资料如下,请参考:

  • 英文官方资料:http://www.postgis.net/stuff/postgis-2.4.pdf
  • 中文社区资料:http://www.postgres.cn/docs/PostGis-2.2.0dev_Manual.pdf

--END--

码字不易,如果您觉得文章写得不错,请关注作者~ 您的关注是我写作的最大动力

友情提示:原文排版精美,可点击分享链接查看。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码