加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostGis入门知识

发布时间:2020-12-13 17:44:03 所属栏目:百科 来源:网络整理
导读:要使用PostGIS,需要两方面的预备知识,一是要熟悉基本的SQL语法;二是熟悉 PostgreSQL数据库的基本使用。 (一) 快速入门 我们使用前面创建的数据库wen2,用户为wen1,现在创建一个包含三个点的数据库 test1: 首先在Etch下以wen1登陆,然后打开wen2数据库:
要使用PostGIS,需要两方面的预备知识,一是要熟悉基本的SQL语法;二是熟悉
PostgreSQL数据库的基本使用。
(一) 快速入门
我们使用前面创建的数据库wen2,用户为wen1,现在创建一个包含三个点的数据库
test1:
首先在Etch下以wen1登陆,然后打开wen2数据库:
$ psql -d wen2 ;
再在PostgreSQL的控制台下输入以下命令:
wen2=> create table test1 (myID int4,pt geometry,myName varchar );
wen2=> insert into test1 values (1,'POINT(0 0)','beijing' );
wen2=> insert into test1 values (2,'POINT(31.5 60.87)','shanghai' );
wen2=> insert into test1 values (3,'POINT(10.77 85.902)','tianjin' );
这样我们利用PostGIS创建了一个包含三个点的GIS数据表。
为了能在QGIS中打开这一图层,我们还需要为数据表创建一个主键:
wen2=>alter table test1 add primary key (myID);
可以看到PostGIS的使用其实就相当于使用一个经过扩展的SQL语法,上述语句熟悉
SQL语法的人一看都很熟悉,都是普通的SQL语句,不同的只不过是增加了PostGIS特殊的
geometry数据类型。
你可以再试试这些SQL语句:
select * from test1;
select myID,AsText(pt) from test1;
select Distance(pt,'POINT(0 0)') from test1;
(二) PostGIS的Geometry数据类型
Geometry可以说是PostGIS最重要的一个概念,是“几何体”的意思,由于PostGIS很
好地遵守OGC的”Simple Feature for Specification for SQL”规范,目前支持的几何体类型包
含其实例有:
POINT(1 1)
MULTIPOINT(1 1,3 4,-1 3)
LINESTRING(1 1,2 2,3 4)
POLYGON((0 0,0 1,1 1,1 0,0 0))
MULTIPOLYGON((0 0,0 0),(5 5,5 6,6 6,6 5,5 5))
MULTILINESTRING((1 1,3 4),(2 2,3 3,4 5))
而geometry具体表现又有两种形式,一种叫做WKT(Well Known Text)形式,如上面的
例子。或者使用如下SQL语句浏览:
select AsText(pt) from test1;
另一种叫做“Canonical Form”形式,看上去是一串古怪的数字,其实是一种增强的十六
进制编码,使用如下SQL语句就可以浏览了:
select pt from test1;
(三) 读写PostGIS数据
建设好PostGIS数据库之后,我们现在需要进行读写GIS数据了,包括把GIS写入到
PostGIS数据库中以及在应用程序中使用PostGIS数据库的数据。读写PostGIS目前主要有以
下四种方式:
3.1 使用psql语言
Psql语言是PostgreSQL内嵌的一个命令行工具,其语法基本上和标准的SQL语法是一
致的,可以使用Psql工具,结合标准SQL语法和一些PostGIS的扩展对PostGIS数据库进行
读写操作。
具体例子如上面“快速入门”中的例子。
这种方式功能强大,但全部需要手工操作,烦琐且繁重。
3.2 使用一些小工具
有两个很有用的小的转换工具,一是shp2pg;一是ogr2ogr
3.2.1 shp2pgsql和pgsql2shp
shp2pgsql和pgsql2shp是PostGIS自身携带的一对在Shape文件和PostGIS数据库之间进
行转换的工具,在Debian中安装好PostGIS之后,这两个程序已经位于可执行文件的搜索路
径上,因此可以在系统中任何位置使用。
假如当前目录下有完整的china.shp文件(应该有三个同名不同扩展名的文件),需要把其
中数据输入到上述的wen2数据库中的数据表china_postgis中,具体操作为(操作用户为
wen1):
$ shp2pgsql china china_postgis > tmp.sql
$ psql -d wen2 -f roads.sql
这个工具很好用,缺点在于使用范围有限,只针对Shape文件格式。
3.2.2 ogr2ogr
PostGIS本身的shp2pg工具只把shape文件转换到PostGIS 数据库中,那如何把其他的
GIS数据加入呢?比如说MapInfo的mid格式,ESRI的e00格式呢?这就要使用ogr这个工
具了。
Ogr目前是gdal的一个组成部分,那什么是gdal呢?其官方主页(http://www.gdal.org)上 如此介绍: GDAL is a translator library for raster geospatial data formats that is released under an X/MIT style Open Source license by the Open Source Geospatial Foundation. As a library,it presents a single abstract data model to the calling application for all supported formats. It also comes with a variety of useful commandline utilties for data translation and processing. 简单地说,Gdal是一个各种Gis数据格式的转换软件库,ogr则是转换矢量GIS数据的 软件库。 目前ogr能够支持的数据格式包括: Arc/Info Binary Coverage、DWG、ESRI Personal GeoDatabase、ArcSDE、ESRI Shapefile、GML、GRASS、Mapinfo File、Microstation DGN、ODBC、Oracle Spatial和 PostgreSQL等。应该说,这就基本包括了我们平常用到的所有矢量型GIS文件格式了。 Gdal支持的栅格数据格式参阅http: //www.gdal.org/formats_list.html 下面我们从源码编译安装gdal---因为我在Debian下使用apt方式安装的gdal并不支持 postgresql数据库,其实更为简便的方法也许是去gdal.org下载一个Fwtools的工具包,可以 直接运行不用繁琐的编译,既有Windows的,也有Linux下用的,只不过这个包有些大。 1) 下载最新的gdal-1.3.2 2) 解压 3) ./configure --prefix=/opt/gdal --with-pg=/opt/pg/bin/pg_config --without-ogdi 这里我习惯把软件安装在/opt目录下。 --with-pg参数很重要,使ogr可以支持PostGIS,后面的参数是我的PostGIS安装的地方。 我在这里编译很多次失败,经过仔细查找,发现问题出在ogdi上,所以暂时我只好使 它不支持ogdi。 4) make 5) make install 下面是使用过程,假设现在我要把一个rai.mid文件导入到数据库data1中: $ ogr2ogr –f Postgresql PG:dbname=data1 rai.mid 注意,f参数后面跟的是导入的数据类型,最后那个文件才是要导出的文件。PG后面说 明的是数据库的名字,需要是已经创建好的数据库,而数据表则由程序自动创建。还要特别 注意权限问题,以上命令我是由postgres用户执行的。 还有一个要注意的是主键问题。一般情况下,你使用shp2pg或者 ogr2ogr向postgis中 增加了Gis数据后,在GIS客户端添加postgis图层的时候,常常会因为数据表没有定义主键 而出错,解决的办法是,在服务器上使用psql或者其他sql工具,使用命令: alter table table_name add primary key (column_name); 另外我们发现ogr竟然是不支持最常见的GIS格式e00格式,好象是因为版权方面的原 因吧。解决的方法就是去sf.net查找相关工具。我在上面就找到一个e002pg工具,支持将 e00文件导入到postGIS数据库中。 3.3 在其他GIS软件中读写PostGIS数据 比如在QGIS中,能够打开PostGIS图层,还有SPIT插件可以把Shape文件输入到 PostGIS数据库中。 其他GIS软件如uDig,Grass等,甚至连ArcInfo都支持或部分支持读写PostGIS数据。 3.4 利用接口在应用程序中读写PostGIS数据 广大的开源GIS程序员几乎为每一种程序设计语言设计好了读写PostGIS的接口,如利 用PostgreSQL的JDBC库,可以使用Java语言在程序中读写PostGIS数据;利用libpq库, 可以使用C语言读写PostGIS数据。 (四) 使用PostGIS函数 4.1 PostGIS函数 要能熟练使用PostGIS,掌握PostGIS的所有函数是关键。通过掌握这些PostGIS函数, 我们能够高效、稳定地处理各种地理数据。由于PostGIS的函数设计时都遵守OpenGIS规范, 我们也可以把这些PostGIS叫做OpenGIS函数。 4.2 PostGIS函数的分类 PostGIS函数大致可以分为以下四类 1) 字段处理函数 这类函数当前一共有3个,分别是: AddGeometryColumn(var1,var2,var3,var4,var5,var6):为已有的数据表增加一个地理几何 数据字段。Var1代表数据表的模式(schema)的名字,一般是public,也可以省略,则使用当 前的缺省模式;var2是已有的数据表的名字;var3是新的地理数据字段的名字;var4是 SRID值,不确定的话就取-1吧;var5是地理数据的类型,可以是POINT等;var6是指该几 何数据是二维还是三维数据。 前面的SQL语句 create table test1 (myID int4,myName varchar )更规范的写 法为: create table test1 (myID int4,myName varchar ); select AddGeometryColumn('test1','pt',-1,'GEOMETRY',2); DropGeometryColumn函数显然是删除一个地理数据字段的; SetSRID函数显然是设置SRID值的。 2) 几何关系函数 这类函数目前共有10个,分别是: Distance Equals Disjoint Intersects Touches Crosses Within Overlaps Contains Relate 3) 几何分析函数 这类函数目前共有12个,分别是:Centroid Area Lenth PointOnSurface Boundary Buffer ConvexHull Intersection SymDifference Difference GeomUnion MemGeomUnion 4) 读写函数 这类函数很多,主要是用于在各种数据类型之间的转换,尤其是在于Geometry数据类 型与其他如字符型等数据类型之间的转换,函数名如AsText、GeomFromText等,其作用是 显然的。 4.3 PostGIS函数使用示例。 假设在我们的wen2数据库中,有两张表,一张为guojia,是从“国家基础地理数据” 网站下载的国界数据表,数据类型为LINE;二为shengqu_polygon,也从同一个网站下载, 地理数据类型为多边形。 1) 查询我国边境线的长度: wen1=> select sum(length(the_geom)) as lenth from guojie; 2) 查询我国面积最大的省区名字: wen1=> select name area(the_geom) as myarea from shengqu_polygon order by myarea DESC LIMIT 1; (五) 使用PostGIS扩展函数 除了上述遵循OpenGIS的函数之外,PostGIS还自行扩展了一些当前OpenGIS规范之外 的函数,主要包括以下几类: 5.1 管理类函数 扩展的管理类函数主要包括一些软件版本查询函数,如 postgis_version()、postgis_geos_version()、postgis_proj_version()函数等,分别查询当前的 PostGIS的版本及其使用的Geos和Proj库的版本。 5.2 数据类型的输入输出函数 除了OpenGIS定义的地理数据类型之外,PostGIS还对数据类型进行了扩展,这种扩展 主要是两方面的扩展,一是把二维的数据向三维和四维扩展;二就是在WKT和WKB数据 类型基础上扩展出EWKT和EWKB数据类型。 PostGIS提供了在这些地理数据类型和常用数据类型如字符型、浮点型数据之间进行转 换的函数。 5.3 量算函数 如length3d函数是对length2d函数的扩展。 5.4 几何操作函数 如addBBox(geometry)函数给所给的几何体加上一个边框。 如simplify(geometry,tolerance)函数可以对折线和多边形利用Douglas-Peuker算法进行一 些节点进行删除,从而使表现的图形更简单而清晰,在网络传输数据时具有更高的效率。 5.5 操作符号 5.6 其他扩展函数 (六) 建立PostGIS索引 当数据库的记录增大的时候,如果没有建立索引的话,操作的效率就显著下降。 POstGIS建议当记录数超过几千的时候就应该建立索引,而GIS数据库一般都是海量数据, 所以对PostGIS而言,索引就非常重要。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读