每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。
放弃不难,但坚持很酷~
PostgreSQL版本:9.6.12 PostGIS版本:2.4.6
PostgreSQL是一个功能强大的对象关系型数据库管理系统(ORDBMS)。用于安全地存储数据,支持最佳做法,并允许在处理请求时检索它们。
PostgreSQL的特点如下:
PostGIS作为新一代空间数据存储标准模型,将空间地理信息数据结构规范为关系型数据库可以承载的sp模式(simple features),这样,使得之前门槛颇高的gis空间数据存储模式变得通俗易懂、简单明了。
最重要的只要接触过SQL语言,就可以利用PostGIS的SQL语法便捷的操纵装载着空间信息的数据框(数据表),这些二维表除了被设定了一个特殊的空间地理信息字段(带有空间投影信息、经纬度信息等)之外,与主流数据管理系统所定义的各种字段并无两样。
PostGIS安装不仅依赖于PostgreSQL,还依赖于很多插件:
PostGIS的特点如下:
如何安装PostgreSQL + PostGIS请参考:《如何安装PostgreSQL + PostGIS请点击》。
PostgreSQL与PostGIS版本的依赖关系可点击:http://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS
# 切换用户
su postgres
# 执行psql命令
psql
默认连接postgres数据库,会出现“postgres=#”的字符串,执行效果如下图所示:
创建testdb
数据库:
CREATE DATABASE testdb;
创建demo
数据库,内容与testdb
数据库一致:
CREATE DATABASE demo TEMPLATE=testdb;
删除demo
数据库:
drop database demo;
执行\l
来查看数据库列表:
\l
执行效果如下图所示:
连接数据库有两种方式:
假如连接testdb数据库,执行以下代码:
postgres=# \c testdb
执行效果如下图所示:
postgres=# \q # 退出psql模式
bash-4.2$ psql -d testdb
执行效果如下图所示:
创建一个表,用来存储城市的最高及最低温度。代码如下所示:
CREATE TABLE location_city (
name varchar(80),
location point
);
在testdb
数据库下,执行\d
命令列出数据表:
\d
执行效果如下:
使用\d [tableName]
命令来查看表结构,比如查看location_city表:
\d location_city;
执行效果如下图所示:
批量插入数据有两种常用的方式:
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)');
首先,在/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';
打开该文件后效果:
解决linux下查看文件乱码问题:
vim ~/.vimrc
set encoding=utf-8 fileencodings=ucs-bom,utf-8,cp936
查看文件编码:
# 在Vim中可以直接查看文件编码
:set fileencoding
查询location_city
表中name
与position
字段的所有数据:
SELECT * FROM location_city;
使用UPDATE … SET …
命令来更新location_city
表的数据:
UPDATE location_city SET location = '(52,53)' WHERE name = 'Fort Worth';
DELETE FROM location_city WHERE name = 'San Francisco';
DELETE FROM location_city;
# 或者
TRUNCATE location_city;
PostgreSQL数据库安装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
命令查看已安装的扩展。
CREATE TABLE cities(id smallint,name varchar(50));
批量插入三条数据:
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');
标准的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;
执行效果如下图所示:
以米为单位并假设地球是完美椭球,上面三个城市相互的距离是多少?
执行以下代码计算距离:
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的一些官方学习资料如下,请参考:
关于PostGIS的官方学习资料如下,请参考: