您好,欢迎访问三七文档
调研报告PostgreSQL和PostGIS概述PostGIS空间数据类型PostGIS读写数据方式PostGIS查询语言PostGIS函数PostGIS拓展功能PostgreSQL是一种对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大、特性最丰富和最复杂的自由软件数据库系统。它起源于伯克利(BSD)的数据库研究计划,目前是最重要的开源数据库产品开发项目之一,有着非常广泛的用户。PostgreSQL可以说是最富特色的自由数据库管理系统,也有人认为可以是最强大的自由软件数据库管理系统。PostgreSQL是唯一支持事务、子查询、多版本并行控制系统、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。能在多平台下---包括Linux、FreeBSD和Windows等---运行,并且支持多语言的开发。在两大开源数据库产品的对比中,一般认为MySQL速度更快,所以得到更为广泛的使用;而PostgreSQL性能更为先进,PostgreSQL提供很多MySQL目前所不支持的特性,比如触发器、视图、存储过程等等,在记录数超千万之后性能表现尤其出色。在PostgreSQL中已经定义了一些基本的集合实体类型,这些类型包括:点(POINT)、线(LINE)、线段(LSEG)、方形(BOX)、多边形(POLYGON)和圆(CIRCLE)等;另外,PostgreSQL定义了一系列的函数和操作符来实现几何类型的操作和运算;同时,PostgreSQL引入空间数据索引R-tree。尽管在PostgreSQL提供了上述几项支持空间数据的特性,但其提供的空间特性很难达到GIS的要求,主要表现在:缺乏复杂的空间类型;没有提供空间分析;没有提供投影变换功能。为了使得PostgreSQL更好的提供空间信息服务,PostGIS应运而生。PostGIS是对象关系型数据库系统PostgreSQL的一个扩展。PostGIS提供如下空间信息服务功能:空间对象、空间索引、空间操作函数和空间操作符。PostGIS遵循OpenGIS的规范。◦,最新版本1.4.0◦基于空间对象库GEOS和空间投影库PROJ.4开发◦支持桌面GIS软件:GRASS,QGIS,uDig,JUMP◦支持中间件服务器:MapServer,GeoServer等◦支持开发库:GeoTools,OGR◦ESRIArcGIS9.3支持PostGIS空间数据类型支持OpenGIS中所有空间数据类型◦POINT,LINESTRING,POLYGON,MULTI-POINT,◦MULTI-LINESTRING,MULTI-POLYGON,◦GEOMETRYCOLLECTIONExamplesofWKT:◦POINT(00)◦LINESTRING(00,11,12)◦POLYGON((00,40,44,04,00),(11,21,22,12,11))◦MULTIPOINT(00,12)◦MULTILINESTRING((00,11,12),(23,32,54))◦MULTIPOLYGON(((00,40,44,04,00),(11,21,22,12,11)),((-1-1,-1-2,-2-2,-2-1,-1-1)))◦GEOMETRYCOLLECTION(POINT(23),LINESTRING(23,34))除了OpenGIS定义的地理数据类型之外,PostGIS还对数据类型进行了扩展,这种扩展主要是两方面的扩展:一是把二维的数据向三维和四维扩展;二是在WKT和WKB数据类型基础上扩展出EWKT和EWKB数据类型。◦EWKT,EWKB(包含了SRID信息的WKT/WKB)◦SRID(SpatialReferencingSystemIdentifier):每个空间实例都有一个空间引用标识符(SRID)。SRID对应于基于特定椭圆体的空间引用系统,可用于平面球体映射或圆球映射。空间列可包含具有不同SRID的对象。读写PostGIS目前主要有以下四种方式:◦3.1使用psql语言Psql语言是PostgreSQL内嵌的一个命令行工具,其语法基本上和标准的SQL语法是一致的,可以使用Psql工具,结合标准SQL语法和一些PostGIS的扩展对PostGIS数据库进行读写操作。这种方式功能强大,但全部需要手工操作,烦琐且繁重。select*fromtest1;selectmyID,AsText(pt)fromtest1;selectDistance(pt,'POINT(00)')fromtest1;读写PostGIS目前主要有以下四种方式:◦3.2使用一些小工具有两个很有用的小的转换工具,一是shp2pg;一是ogr2ogr。3.2.1shp2pgsql和pgsql2shpshp2pgsql和pgsql2shp是PostGIS自身携带的一对在Shape文件和PostGIS数据库之间进行转换的工具。使用范围有限,只针对Shape文件格式3.2.2ogr2ogrogr是转换矢量GIS数据的软件库。目前ogr能够支持的数据格式包括:Arc/InfoBinaryCoverage、DWG、ESRIPersonalGeoDatabase、ArcSDE、ESRIShapefile、GML、GRASS、MapinfoFile、MicrostationDGN、ODBC、OracleSpatial和PostgreSQL等。应该说,这就基本包括了我们平常用到的所有矢量型GIS文件格式了。读写PostGIS目前主要有以下四种方式:◦3.3在其他GIS软件中读写PostGIS数据比如在QGIS中,能够打开PostGIS图层,还有SPIT插件可以把Shape文件输入到PostGIS数据库中。其他GIS软件如uDig,Grass等,甚至连ArcInfo都支持或部分支持读写PostGIS数据。读写PostGIS目前主要有以下四种方式:◦3.4利用接口在应用程序中读写PostGIS数据广大的开源GIS程序员几乎为每一种程序设计语言设计好了读写PostGIS的接口,如利用PostgreSQL的JDBC库,可以使用Java语言在程序中读写PostGIS数据;利用libpq库,可以使用C语言读写PostGIS数据。表的建立CreatingaSpatialTable◦Creatingatablewithspatialdataisdoneintwostages:Createanormalnon-spatialtable.Forexample:CREATETABLEROADS_GEOM(IDint4,NAMEvarchar(25))◦AddaspatialcolumntothetableusingtheOpenGISAddGeometryColumnfunction.Example1:SELECTAddGeometryColumn(’public’,’roads_geom’,’geom’,423,’LINESTRING’,2)Example2:SELECTAddGeometryColumn(’roads_geom’,’geom’,423,’LINESTRING’,2)CREATETABLEparks(park_idINTEGER,park_nameVARCHAR,park_dateDATE,park_typeVARCHAR);SELECTAddGeometryColumn(’parks’,’park_geom’,128,’MULTIPOLYGON’,2);AddGeometryColumn(schema_name,table_name,column_name,srid,type,dimension)AddGeometryColumn(table_name,column_name,srid,type,dimension)OrLoadingGISDataRetrievingGISDataBuildingIndexes◦R-Treesbreakupdataintorectangles,andsub-rectangles,andsub-subrectangles,etc.R-TreesareusedbysomespatialdatabasestoindexGISdata,butthePostgreSQLR-TreeimplementationisnotasrobustastheGiSTimplementation.◦GiST(GeneralizedSearchTrees)indexesbreakupdataintothingstooneside,thingswhichoverlap,thingswhichareinsideandcanbeusedonawiderangeofdata-types,includingGISdata.◦PostGISusesanR-TreeindeximplementedontopofGiSTtoindexGISdata.CREATEINDEX[indexname]ON[tablename]USINGGIST([geometryfield]);ExamplesofSpatialSQL:◦1.Whatisthetotallengthofallroads,expressedinkilometers?SELECTsum(ST_Length(the_geom))/1000ASkm_roadsFROMbc_roads;km_roads------------------70842.1243039643(1row)ExamplesofSpatialSQL:◦2.HowlargeisthecityofPrinceGeorge,inhectares?SELECTST_Area(the_geom)/10000AShectaresFROMbc_municipalityWHEREname=’PRINCEGEORGE’;hectares------------------32657.9103824927(1row)ExamplesofSpatialSQL:◦3.Whatisthelengthofroadsfullycontainedwithineachmunicipality?SELECTm.name,sum(ST_Length(r.the_geom))/1000asroads_kmFROMbc_roadsASr,bc_municipalityASmWHEREST_Contains(m.the_geom,r.the_geom)GROUPBYm.nameORDERBYroads_km;name|roads_km----------------------------+------------------SURREY|1539.47553551242VANCOUVER|1450.33093486576LANGLEYDISTRICT|833.793392535662BURNABY|773.769091404338PRINCEGEORGE|694.37554369147...PostGIS函数大致可以分为以下四类:◦字段处理函数AddGeometryColumn为已有的数据表增加一个地理几何数据字段;DropGeometryColumn删除一个地理数据字段的;SetSRID设置SRID值◦几何关系函数这类函数目前共有10个,分别是:Distance,Equals,Disjoint,Intersects,TouchesCrosses,Within,Overlaps,Contains,RelatePostGIS函数大致可以分为以下四类:◦几何分析函数这类函数目前共有12个,分别是:Centroid,Area,Lenth,PointOnSurface
本文标题:PostGIS
链接地址:https://www.777doc.com/doc-3132796 .html