作者:empty 出版社:empty |
POSTGIS使用命令
1.1初识POSTGIS
1.创建空间数据库
CREATE DATABASE my_spatial_db TEMPLATE=template_postgis;
2.创建表
CREATE TABLE gtest ( ID int4, NAME varchar(20) );
3.创建几何体
SELECT AddGeometryColumn(’’, ’gtest’,’geom’,-1,’LINESTRING’,2);
4.插入数据
INSERT INTO gtest (ID, NAME, GEOM) VALUES (1,'First Geometry',ST
_GeomFromText('LINESTRING(2 3,4 5,6 5,7 8)', -1));
5.查看表――类似show talbes(MY SQL)
6.导入数据
Once you have created a spatial table, you are ready to upload GIS data to the database. Currently, there are two ways to get data into a PostGIS/PostgreSQL database: using formatted SQL statements or using the Shape file loader/dumper。
首先是创建表极其几何关系:
CREATE TABLE roads (road_id int4, road_name varchar(20) );
SELECT AddGeometryColumn(’’, ’ roads’,’ roads_geom’,-1,’LINESTRING’,2);
然后用导入脚本文件:
psql -U postgres -W -f E: road.sql my_spatial_db
7.检验函数
SELECT
st_isvalid('LINESTRING(0 0, 1 1)'),
st_isvalid('LINESTRING(0 0, 0 0)');
By default, PostGIS does not apply this validity check on geometry input, because testing for validity needs lots of CPU time for complex geometries, especially polygons. If you do not trust your data sources, you can manually enforce such a check to your tables by adding a check constraint:
ALTER TABLE mytable
ADD CONSTRAINT geometry_valid_check
CHECK (isvalid(the_geom));
8.查询
SELECT road_id, ST_AsText(roads_geom) AS geom, road_name FROM roads;
SELECT road_id, road_name FROM roads WHERE roads_geom ~= ST_GeomFromText('LINESTRING(191232 243118,191108 243242)',-1);
SELECT ST_AsText(roads_geom) AS geom FROM roads WHERE roads_geom && SetSRID('BOX3D(191232 243117,191232 243119)'::box3d,-1);
补充:
&& This operator tells whether the bounding box of one geometry intersects the bounding box of another.
~= This operators tests whether two geometries are geometrically identical. For example, if ’POLYGON((0 0,1 1,1 0,0 0))’ is
the same as ’POLYGON((0 0,1 1,1 0,0 0))’ (it is).
= This operator is a little more naive, it only tests whether the bounding boxes of two geometries are the same
9.查看POSTGIS版本号
SELECT PostGIS_Full_Version();
1.2 数据库的一些操作
1.列出所有配置用户或是只列出那些匹配pattern的用户
du
2.查看编码方式
encoding
3.查看服务器上所有数据库(类似show databases之MYSQL)
l 或者是 list
4.查看当前数据库所有表(类似show tables之MYSQL)
5.查看表的结构
d roads 即 d 表名
6.创建索引
①创建一个表:
CREATE TABLE emp(id serial, empname varchar(50), sal numeric(9,2));
②添加新的字段
ALTER TABLE emp ADD COLUMN currency varchar(4);
③变更字段
ALTER TABLE emp ALTER COLUMN currency SET DEFAULT 'USD';
④创建索引
CREATE INDEX idx_oldemp_salcur ON emp (salary,currency);
PostgreSQL的配置文件及用户权限
PostgreSQL的配置文件及用户权限
作者:小P
来自:LinuxSir.Org
摘要:为了能够远程修改和维护PostgreSQL数据库,我们会涉及到配置文件和用户权限的问题,本文主要介绍了如何配置PostgreSQL的主要配置文件,修改用户权限,使我们能够远程打开数据库;
目录
1. 修改配置文件;
1.1 postgresql.conf;
1.2 pg_hba.conf;
1.3 重新启动postgresql服务器;
2. 配置用户权限;
2.1 创建一个用户;
2.2 创建一个数据库data1,属主为test1;
2.3 创建一个数据表;
2.4 修改数据表的属主;
3. 关于本文;
4. 更新日志;
5. 参考文档;
6. 相关文档;
+++++++++++++++++++++++++++++++++++++++++++
正文
+++++++++++++++++++++++++++++++++++++++++++
为了能远程使用postgresql数据库,比如说我要在网络上另外一台Windows电脑上使用pgAdmin3来管理使用该Postgresql服务器,您就需要进行一些修改,这些修改主要包括两方面的修改:
一是修改Postgresql的两个配置文件,二是修改数 据库的一些用户权限;
1. 修改配置文件;
注:记得修改任何东西之前都需要备份一下;
1.1 postgresql.conf;
首先我们需要修改Postgresql的配置文件postgresql.conf,该文件在数据目录/etc/postgresql/8.2/main/下,终端下执行:
root@xiaop-laptop:/home/xiaop# vim /etc/postgresql/8.2/main/postgresql.conf
将其中的一句:
listen_address=’localhost’
前面的注释#去掉,并把’localhost’该为’*’;
1.2 pg_hba.conf;
然后我们再来修改Postgresql的配置文件pg_hba.conf,该文件在数据目录/etc/postgresql/8.2/main/下,终端下执行
root@xiaop-laptop:/home/xiaop# vim /etc/postgresql/8.2/main/pg_hba.conf
在文件后面加一句:
host all all 192.168.1.0/24 password
这句的意思是:同网络中192.168.1.*的机器可以以密码的形式使用所有的数据库。更具体的参数意义直接看该配置文件中的注释就可以了;
这里一定要配置正确,否则无法在远程连接postgresql数据库。
1.3 重新启动postgresql服务器;
root@xiaop-laptop:/home/xiaop# /etc/init.d/postgresql-8.2 restart
2. 配置用户权限;
这里介绍一些数据库用户权限的简单配置,以下是在psql中使用:
2.1 创建一个用户;
xiaop=# CREATE USER test1 ;
CREATE ROLE
2.2 创建一个数据库data1,属主为test1;
xiaop=# CREATE DATABASE data1 owner test1;
CREATE DATABASE
2.3 创建一个数据表;
xiaop=# CREATE TABLE test11() ;
CREATE TABLE
2.4 修改数据表的属主;
xiaop=# ALTER TABLE test11 OWNER TO test1;
ALTER TABLE
现在您便可以在局域网内的其他电脑使用其他postgresql客户端工具,以用户名test1打开data1数据库了。
3. 关于本文;
本文大部分资料都是参照中文文档,目的是让兄弟们查找方便一些,详细的东西在中文文档都有,多谢各位弟兄们指点 :)
4. 更新日志;
5. 参考文档;
《PostgreSQL 8.1 中文文档》
6. 相关文档;
《PostgreSQL安装和简单使用》
《Postgresql备份和恢复------SQL转储篇》
《PostgreSQL数据库用户认证》
《PostgreSQL数据库的日常维护工作》
使用过的命令:
1.备份和还原数据表
copy test11 to 'c: data.csv' delimiter as ',' csv quote as ' '
可以将表中的数据输出到 文件或标准输出。
delimiter as ‘分隔符’ :说明输出设备的文本中表的每个字段用什么字符分割,默认是tab;
null as ‘null表示的字符串’:说明输出设备的文本中表的NULL值的表示方法,默认为“ N”;
csv quote as ‘引号类型’ :说明导出的csv文件中的引号类型是什么,
对于Postgres7.4以前的版本,不支持csv的导入与导出,这时不要使用这个可选项。
copy 表名 form 文件名|标准输入 [delimiter as '分隔符'] [null as 'null表示的字符串' ] [csv quote as '引号的类型']
2.导入和导出数据库
这里介绍的是数据库的导入与导出,
其实,单个数据表的导入与导出也是这些命令,
只是携带的”参数“不同而已。
具体的方法,可以在Shell中运行 “命令 –help” 来查看。
下面只是介绍常用的对数据库的导入与导出方法。
------------------------------
导出数据库。
命令:$pg_dump testdb > testdump.dmp
解释:将数据库testdb备份成文件testdump.dmp。包括表的建立与表中的数据。
------------------------------
导入数据库。
命令:
$create -E UTF8 testdb1
$psql testdb1 testdump.dmp
解释:
1、先创建一个数据库testdb1,为了将dump文件导入这个数据库,
-E选项是为了指定这个数据库的字符集。取决于导出数据库的字符集。
2、psql 命令使用重定向符” “将dump文件导入指定的数据库。
3、导入数据库以前除了要指定数据库端的字符集,又是还要设置客户端的字符集,
由于psql是在shell下执行的命令,不能使用 encoding指令,
所以要使用pgclientencoding环境变量,
所以要在导入数据库以前要执行命令:
export pgclientencoding=’UTF8′
设置客户端正确的字符集,这里设置的UTF8是一个例子而已。
对于windows用户,可能是需要执行:
SET pgclientencoding=’UTF8′
我也没有试过,应该是这句。
3.在环境变量下输入
Created –U postgres –W mydb
Pgsql –U postgres –W mydb
建立POSTGIS数据库
D: pg bin>createdb–U postgres –W –T template-postgis nyc
导入数据
D: pg bin>psql -U postgres -W -f C: Documents and Settings Administrator 桌面 p
g nyc_buildings.sql nyc
导入数据成功提示
4. shp文件
6.创建空间数据库
#CREATE DATABASE mydb TEMPLATE=template_postgis;
shp2pgsql nyc_roads.shp nycroad>nycroad.sql
导入数据库表
psql –U postgres –d mydb nycroad.sql
库PostgreSQL开发入门—C/C++
http://syue.com/Database/Postgre/73654_4.html
本文介绍使用 C/ 结合数据库自带的 libpq 和 libPq++ 库来开发 Linux 下有名的免费数据库 PostgreSQL,详细描述了怎样使用开发库来操作数据的步骤和流程。
PostgreSQL数据库介绍 WWW.SYUE.COM
PostgreSQL 是一种运行在Unix和Linux操作系统(在NT平台借助Cygnus也可以运行)平台上的免费的开放源码的关系数据库。最早是由美国加州大学伯克利分 校开发的,开始只是作为一个演示系统发表,但是随着时间的推移,逐步分发,得到很多实际的应用,才逐步流行起来。现在版本发展到了7.3.3。 信息来源 岁月联盟
荣誉:
来源 岁月联盟
•1999年获得Linux World杂志的该年度 最佳数据库产品 称号。
•2000年荣获Linux Journal杂志编辑选择的 最佳数据库 奖。
•2003年,也就是最近再一次荣获Linux Journal杂志编辑选择的 最佳数据库 奖。
2.主要功能和特性 [来源 岁月联盟 ]
本文来自 岁月联盟
•支持SQL。作为关系数据库,它支持SQL89标准也支持部分SQL92大部分功能。
•有丰富的数据类型。许多数据类型是一些商业数据库都没有提供的。
•面向对象。它包含了一些面向对象的技术,如继承和类。
•支持大数据库,它不同于一般的桌面数据库,能够支持几乎不受限制大小的数据库,而且性能稳定。
•方便集成web,提供一些接口方便 PHP,Perl等语言操作数据库。
•事务处理。相对一些其他免费数据库如MySQL,他提供了事务处理,可以满足一些商业领域的数据需要。
3.数据类型
岁月联盟 提供
PostgreSQL支持丰富的数据类型,许多数据类型在商业数据库中都无法提供。 来源 岁月联盟
[来源 岁月联盟 ]
•数值类型。包括整数、任意精度、浮点类型和序列类型数值。
•货币类型。范围-21474836.48 到 +21474836.47。
•字符类型。分为定长类型,不定长有限制类型和不定长不限制长度类型。
•二进制字符串。
•日期和时间类型
•布尔类型。
•几何类型。包括点、线、方形、路径、多边形和圆。
•网络地址类型。
•位串类型。就是包含1和0的串。
•对象标识符类型
•数组类型。
4.数据库极限
(www.Syue.com)
参数名称 最大范围
数据库大小 无限制
表大小 16TB(所有系统)
一条记录大小 1.6GB
字段大小 1GB
表记录条数 无限制
表字段数 250-1600(取决于字段的数据类型)
表索引 无限制
事实上不可能存在无限制的情况。支持16TB大小的表不是单一文件保存,而是分为多个文件的,所以不受限制于操作系统。
[ 岁月联盟 ]
4.安装
[内容来自 岁月联盟 ]
我们可以到 http://www.postgresql.org网站,具体怎么安装我就不赘述,大家可以看文档,也可以看 参考中的中文网站的文档。在这里我就说说安装中需要注意的几个问题。 [本文来自 岁月联盟 ]
注意
[信息来源 岁月联盟 ]
•不能以root登陆Linux来操作数据库(启动数据库服务除外),请以root身份建立postgres用户,设置密码后登录。
•安装完postgreSQL,可能需要初始化数据库,需要以postgres用户登录系统,运行
initdb -pqlib=/usr/lib/pqsql -pqdata=/var/lib/pqsal www.Syue.com
•
如果你的pqlib目录不同则需要按照你的实际路径修改,pqdata也是这样的。
•数据库用户与Linux用户是不同的概念,只有数据库用户才能操作数据库,以postgres登录Linux,然后是使用createuser来添加用户,dropuser来删除用户,也可以使用SQL命令CREATE USER来创建。
5.常用命令 [信息来源 岁月联盟 ]
PostgreSQL数据库常用操作命令: 信息来自 岁月联盟
Createdb 创建数据库
Createuser 创建数据库用户
Dropdb 删除数据库
Dropuser 删除数据库用户
Psql 交互式PostgreSQL前端工具,可以用它来操作数据库
Initdb 初始化postgreSQL数据库
这里不是介绍怎样使用PostgreSQL数据库,所以对这些命令也不详细解释,可以参见文档说明和帮助。我在这里是假设读者已经安装并初始化好了数据库,并且会使用psql和熟练SQL来交互操作数据。
信息来自 岁月联盟
PostgreSQL 的C/接口介绍
岁月联盟 提供
PostgreSQL提供很多不同语言的接口,有C、C++、Perl、Tcl等等,这里主要是介绍C/C++怎样连接到数据库,对数据进行添加,查询等操作。
1.C语言接口
•头文件libqp-fe.h 连接时需要添加连接参数-lpq也就是连接libpq库。
•建立数据库连接函数
PGconn *PQconnectdb( const char *conninfo)
PGconn *PQsetdbLogin(const char *pghost,
const char *pgport,
const char *pgoptions,
const char *pgtty,
const char *dbName,
const char *login,
const char *pwd)
岁月联盟 提供
•
•建立非阻塞连接函数
•[www.Syue.com]
PGconn *PQconnectStart(const char *conninfo)
PostgresPollingStatusType *PQconnectPoll(PQconn *conn)
[信息来源 岁月联盟 ]
•
•执行查询函数
PGresult *PQexec(PGconn *conn,const char *query) 返回查询的结构集。
int PQntuples(const Pgresult *res) 返回查询结果里的记录个数。
int PQnfields(const Pgresult *res) 返回记录中的字段的个数。
char *PQfname(const Pgresult *res,int field_index)返回结构集中某一字段的名称。
Oid PQftype(const Pgresult *res, int field_index) 返回结构集中某一字段的数据类型。
char *PQgetvalue(const Pgresult *res,int tup_num, int field_index)
返回结构集中某一条记录中某一个字段的值。
[Syue.com]
•
•这里只列举最常用的一些函数,具体说明可以参见文档。 内容来自 岁月联盟
•大对象数据操作,主要使用下列函数在SQL语句中操作大对象数据。
Oid lo_creat(PGconn *conn,
int mode) 岁月联盟 创建一个新的大对象.mode 是一个位掩码,描述新对象的不同属性
Oid lo_import(PGconn *conn,
const char *filename)
[Syue.com]把文件作为大对象导入数据库
int lo_export(PGconn *conn,
Oid lobjId, const char *filename) [来源 岁月联盟 ] 大对象导入出数据库,保存为文件
int lo_open(PGconn *conn,
Oid lobjId, int mode)
[来源 岁月联盟 ]打开一个现存的大对象
int lo_write(PGconn *conn, int fd,
const char *buf, size_t len)
[本文来自 岁月联盟 ]大对象写入数据
int lo_read(PGconn *conn, int fd,
char *buf, size_t len) 岁月联盟 从大对象读取数据
int lo_lseek(PGconn *conn, int fd,
int offset, int whence) [ 岁月联盟 提供] 对大对象数据进行查找
int lo_close(PGconn *conn, int fd) 关闭大对象描述符
•函数在fe-lobj.c文件中定义,具体使用参见 Accessing Large Objects from libpq
•WWW.SYUE.COM
•上面函数的具体介绍请参见 PostgreSQL v7.0文档 在这里就不详细介绍了。这里省略列举状态检查函数,参见参考文档。
•内容来自 岁月联盟
•使用C语言访问数据库的除了libpq库,还有其他如 libpqeasy,ecpg 等接口。 信息来自 岁月联盟
2.C++语言接口
本文来自 岁月联盟
[www.Syue.com]
•头文件 libpq++.h 连接需要的库位 pq++,连接参数是 -lpq++
•libpq++ 类继承关系图
[内容来自 岁月联盟 ]
图 1
• 类简介
PgConnection成员函数
PgConnection(const char* conninfo) 参数同下
Connect(const char* conninfo) 同 PQconnectdb
Exec(const char* query) 同 PQexec
ExecCommandOk(const char* query) 运行命令并检查状态是否PGRES_COMMAND_OK
ExecTuplesOk(const char* query) 运行查询并检查状态是否PGRES_TUPLES_OK
IntToString(int n) 数字转换为字符串
ConnectionBad() 连接是否失败
ErrorMessage() 返回错误信息
DBName() 同 PQdb
•详细说明参见文档 SYUE.COM
PgDatabase 的常用成员函数
PgDatabase(const char* conninfo) 构造函数连接到数据库,跟 Pqconnectdb参数相同
Tuples() 同 PQntuples();
CmdTuples() 同 PQcmdTuples
Fields() 同 PQnfields
FieldName(int field_num) 同 PQfname
FieldNum(const char* field_name) 同 PQfnumber
FieldType(int ield_num)
FieldType(const char* field_name) [信息来源 岁月联盟 ] 同 PQftype
FieldSize(int field_num)
FieldSize(const char* field_name)
信息来源 岁月联盟 同 PQfsize
GetValue(int tup_num, int field_num)
GetValue(int tup_num, const char* field_name) 岁月联盟 同 PQgetvalue
GetIsNull(int tup_num, int field_num)
GetIsNull(int tup_num, const char* field_name) 信息来自 岁月联盟 同 PQgetisnull
GetLength(int tup_num, int field_num)
GetLength(int tup_num, const char* field_name)
[来源 岁月联盟 ]同 PQgetlength
GetLine(char* string, int length) 同 PQgetline
PutLine(const char* string) 同 PQputline
EndCopy() 同 PQendcopy
•大对象操作使用 PgLargeObject 类来操作。
例子程序
[信息来自 岁月联盟 ]
以 postgres 用户或者具有建立数据库用户权限的用户登录 Linux,先建立数据库。 来源 岁月联盟
[zuojin@itpark85 zuojin]$createdb test_db
岁月联盟
来源 岁月联盟
然后使用 psql 连接到数据库
岁月联盟
[zuojin@itpark85 zuojin]$psql test_db
内容来自 岁月联盟
信息来源 岁月联盟
连接到数据库建立表,如下图所示 (Syue.com)
Syue.com
插入测试用数据,如图: [信息来源 岁月联盟 ]
[资源来自 岁月联盟 ]
(注意:psql中输入SQL语句要以 ; 结束才执行,帮助命令是 ? ,退出命令是 )。
图 2
1)C语言例子
#include stdio.h>
#include libpq-fe.h>
int main() {
PGconn *conn;
PGresult *res;
char *pghost = NULL;
char *pgport =NULL;
char *pgoptions =NULL;
char *pgtty = NULL;
char *dbname = test_db ;
/**数据库名*/
int i = 0,t = 0,s,k;
conn = PQsetdb(pghost,pgport,pgoptions,pgtty,dbname);
if (PQstatus(conn) == CONNECTION_BAD) {
fprintf(stderr, Connection to database '%s' failed! n ,dbname);
PQfinish(conn);
eturn 0;
}
res = PQexec(conn, SELECT * FROM test );
/**运行查询命令*/
if( PQresultStatus(res) != PGRES_TUPLES_OK) {
fprintf(stderr, Exec Query Fauled! n );
PQclear(res);
return 0;
}
i = PQntuples(res);
/**取得查询的结果的记录的数量*/
t = PQnfields(res);
/**取得字段数量*/
for(s=0; s i;s++) {
for (k = 0; k t; k++) {
printf( %s ,PQgetvalue(res,s,k));
printf( );
}
printf( n );
}
PQfinish(conn);
PQclear(res);
return 0;
}
[本文来自 岁月联盟 ]
SYUE.COM
[Syue.com]
运行结果如图所示
[来源 岁月联盟 ]
2)C++例子
#include iostream.h>
#include libpq++.h>
int main() {
char query_string[256]= SELECT * FROM test; ;
PgDatabase data( dbname = test_db );
if (data.ConnectionBad()) {
cout connected failed endl;
cout Error is data.ErrorMessage() endl;
exit(1);
}
if (! data.ExecTuplesOk(query_string)) {
cout Query Failed! endl;
exit(1);
}
for(int k=0; k data.Fields(); k++) /**显示字段名称*/ {
cout data.FieldName(k);
cout ;
}
cout endl;
for (int i = 0; i data.Tuples(); i++) /**取得查询结果的记录数量*/ {
for(int k=0; k data.Fields(); k++) {
cout data.GetValue(i,k);
cout | ;
}
cout endl;
}
return 0 ;
}
[www.Syue.com]
岁月联盟 提供
运行结果如图所示 信息来源 岁月联盟
图 3
栅格数据存入PostgreSQL数据库
在GIS应用中我需要用卫星遥感图象做底图,这里就有如何将图象以及相关包含坐标信息的文件存储到数据库里的问题了。网上看到国外有人做了一个还在测试尚未发行的 raster -> PostGIS 的工具,但是只能在Linux下用,无语……
存储栅格数据,想简单点,不就是把各种乱七八糟的二进制文件,包括这个坐标信息那个投影信息之类的文件,以二进制大对象的方式放入数据库么?至于各种文件怎么区别,建立不同的字段就好了。取出来以后建个目录直接存放文件好了。
比如我现在有配准好的一系列栅格图:thu.tif/.tfw/.aux/.rrd。数据组织上考虑存放到一个表raster_thu中,表中有四个字段“tif”“tfw”“aux”“rrd”,数据类型设置成oid(栏位形态?什么破名字,我理解和MS SQL的Binary字段差不多),用以存储这几种文件。
在服务器管理程序中执行如下sql语句:
insert into raster_thu (tif,tfw,aux,rrd)
values (
lo_import('d:/thu.tif')
,lo_import('d:/thu.tfw')
,lo_import('d:/thu.aux')
,lo_import('d:/thu.rrd')
);
这样,数据存储就完成了。
在应用上,首先需要通过sql语句调出数据并保存到本地磁盘:
select lo_export(raster_thu.tif,'e:/thu.tif') from raster_thu;
……其余类似,注意,需要用一个超级用户的连接来执行上述的select的操作,因为这个操作在服务器端执行了lo_export内建函数。
好了,接下来就可以开始使用这些数据了。
创建空间数据库
备份数据
pg_dump -f c: png.sql -U postgres png
empty
empty