GeoSQL4种数据库比较1.docx
《GeoSQL4种数据库比较1.docx》由会员分享,可在线阅读,更多相关《GeoSQL4种数据库比较1.docx(48页珍藏版)》请在冰豆网上搜索。
GeoSQL4种数据库比较1
GeoSQL4种数据库比较
组员:
黄梅、姚红、王涛、陈铁桥
组长:
黄梅
指导老师:
张山山、王盼成
引言:
gis专业进行二次开发需要空间数据库,现在市面上主要有四大数据库能支持空间数据,他们分别为:
OracleSpatial、SqlSever2008、Postgis、DB2。
我们主要进行的就是这四种数据库在空间数据上的支持、类型和操作比较等。
话不多说,我们进入具体的实践环节吧。
1、引言
因为有着对数据库知识的探索精神,所以我们小组在这次期末实习的选题中选择了四大空间数据库的分析比较,通过这次学习我们了解了很多课本上没有的知识,我们知道了更多,我们了解了更多,是的,不论是MSSql的庞大还是oracle、postgis的快捷都让我们感到深深的满足,这些知识正是我们所需要的,所追求的!
!
因为笔者文笔有限,所以如果我们有哪些地方做的不好,请多多原谅。
好的,下面请进入我们的空间数据库德天堂吧!
!
2、数据导入
2.1MicrosoftSQLServer2008加载数据详解
sql2008自带空间数据库,但是其不支持直接从shp文件导入,所以可以使用google公司提供的开源软件shp2sqlserver来进行导入,不过此软件不能导入太大的数据,我曾经对老师给的allriver这个拥有一百多万条数据的shp文件进行导入,进行了一个多小时,因为超时,所以被停止了导入,一共才导入了40万条数据,效率较低,其代码行格式为:
Shp2sqlserver–s21416“DataSource=…..;Initialcatalog=china;UserId=sa;Password=*********"F:
\data\DATA\net.shp”
其中-s为投影编号,21416为srid的value值,datasource是电脑名,initialcatalog是要导入的数据库,userid是登陆用户名,password是密码,F:
\data\DATA\net.shp是要导入的shp文件路径。
注意:
这种方法导入shp数据,如果数据量较大,所花费时间较多,以allriver表为例,作者导入allrivershp文件,一百多万条数据,花了一个小时二十六分钟,因为超时而意外停止,此时作者只导入了一百三十余万条数据。
这个工具软件效率不行,可待提高的地方还有很多。
2.2OracleSpatial加载数据详解
OracleSpatial空间数据加载的方法有多种,包括用SQL*Loader从文本文件中加载、在不同数据库之间交换空间数据(如Import/Export实用工具,可传输的表空间机制,从OracleSpatial先前版本移植)、从外部格式导入等。
下面将详细介绍使用Oracle实用工具SHP2SDO导入ESRIShapefiler的方法。
首先,要把shp文件转换分割成oracle可以导入的数据库文件,这个转换可以使用oracle提供的一个提供的工具shp2sdo,下载后把此工具复制到PATH变量包含的目录下,如oracle客户端安装后自动注册的环境变量是path:
C:
\Oracle\product\10.1.0\Client_1\bin。
把此文件拷贝到该目录下,然后在dos下运行该工具,定位到我们的shp文件的位置。
例如,现在要导入的shp文件名称是state.shp(shapefile包括至少三个文件state.shpstate.dbfstate.shx),在D:
\data\目录下,我们在dos命令窗口下就应该这样操作:
shp2sdostatestates-igid-s8307-ggeom-d-x(-180,180)-y(-90,90)-t0.5–v–d
其中,state即为本地的shp文件名(不加shp后缀);
statearea为生成的文件名(同时也是将来导进数据库的表名);
-i指定id序列,默认是id,即作为生成数据的唯一性标志,此列是不可能重复的,一般作为索引列;-s这是空间参考系统ID(spatialreferencesystemID)的缩写。
默认是null,目前一般是8307(WGS84坐标系);
-ggeometrycolumn指定sdo_geometry,默认是GEOM,此选项一般使用默认即可;
-d代表含义是将分解后的ctl文件(控制文件)和data文件(数据存储文件)分别生成,如果没有该选项,则不会有单独的data文件生成,数据存储和控制都在ctl一个文件中;
-x表示x坐标的聚值范围,在GCS中表示经度的取值范围为-180~180。
同理,-y表示y坐标的取值范围。
-t代表容差大小;
命令执行后,会生成三个文件,statearea.sql、statearea.ctl、stateare.data。
分解完成后就是导入,这里仍然使用命令行的方式
执行shp2sdo的输出文件,向Oracle中加载数据:
D:
\data\>sqlplusscott/tiger@orcl--登录
SQL>@statearea.sql
SQL>quit
导入ctl文件
D:
\data\>sqlldrpgg/pgg@
Control=statearea
建立空间索引
D:
\data\>sqlplusscott/tiger@orcl
SQL>CREATEIndexSTATEAREA_idx
ONSTATEAREA(GEOM)
INDEXTYPEisMDSYS.SPATIAL_INDEX;
至此空间数据导入完毕。
2.3Postgis加载数据详解
这里以shp文件的转换为例:
首先用shp2pgsql工具把shp文件转换为一个sql的文件,然后将这个sql导入到数据库中,分为这两个步骤就可以完成shp文件导入到postgis数据库中。
具体说明:
我的c盘有一个data的文件夹里面有中国1:
25万的数据,具体路径如下C:
\data\allriver。
然后还有一个psql的文件夹里面存放(.sql)的文件,具体路径如下C:
\ptsql\allriver.sql。
我的postgis是安装在如下目录的:
D:
\ProgramFiles\PostgreSQL。
下面我们具体完成下面的转换:
(1)将shp转换为sql语句文件,命令行程序如下:
D:
\ProgramFiles\PostgreSQL\8.3\bin>shp2pgsql-s-4326-WgbkC:
\data\allriver.shp
allriver>C:
\ptsql\allriver.sql
-s是指定坐标系统我用的是4326(具体坐标系统的解释可以参见postgis中的spatial_ref_sys表)。
-W是编码问题,我给的是gbk的编码(支持中文字符)。
C:
\data\allriver.shp是shp文件的路径。
allriver是转换到数据库中的表名。
C:
\ptsql\allriver.sql是转换后sql文件的名称和存放的路径。
通过这条语句就可以完成shp到sql。
(2)将allriver.sql导入到数据库中(我建立的是一个mydb的数据库)
这个模板一定要选择postgis,只有这样建立的才是一个空间数据库。
这个数据库是postgres所有,postgres的登陆密码是123456(在安装数据库时设置的)
导入过程如下:
D:
\ProgramFiles\PostgreSQL\8.3\bin>psql-dmydb-fC:
\ptsql\allriver.sqlpostgrespassword=123456
psql-d这个是指定数据库
mydb-fC:
\ptsql\allriver.sql就是数据库mydb导入allriver.sql的文件。
postgrespassword=123456数据库的所有者和其密码。
这样就可以完成数据的导入,还有其他类型的数据导入在这里不多做介绍。
2.4DB2加载数据详解
DB2UDBforLinux®、UNIX®和Windows®从7.1版开始就提供了DB2SpatialExtender,用于支持空间数据的存储、管理和修改,可以用专用于空间信息及其属性的结构来扩展已有的数据类型。
由于有这样的空间扩展器中各种函数的支持,DB2可以对空间数据进行直接处理。
对于空间数据shp文件,可直接导入,不用做数据类型的转换。
以下即为使用SpatialExtender命令行工具db2se将文件allriver.shp导入数据库SAMPLE的具体实现语句:
ConnecttoSAMPLE//在对数据库进行操作之前,必须连入数据库
db2seimport_shapeSAMPLE//指定导入的数据库
-fileNameE:
/DB2/data/allriver.shp//指定将要导入的shp文件
-tableNameallriver-createTableFlag1//创建导入后形成的数据表格
-spatialColumnshape//命名导入后的空间属性列
-typeNameST_MultiLineString//说明数据类型
-idColumnMYDC//指定ID属性列
-commitScope1500//规定范围
-messagesFileallriver.msg//命名消息文件
注意:
上面整个属于同一条语句,并且要注意的是,在DB2的命令行处理器中,认为回车键是语句结束符。
3、空间数据类型的比较
3.1MicrosoftSQLServer2008支持的空间数据类型
(类型《postgis2种》、输入输出(2种)、)
sql2008的输入方式有两种方式,分别为text和wkb格式,两种方法范例分别为:
1.geometry:
:
STGeomFromText('point(22)',srid(没有投影则为0))/geometry:
:
STGeometry('linestring(22,43)',srid)、geometry:
:
STGeometry('polygon((00,34,21,00))',srid);
x010*********00008066400000000000806640,srid);
其输出方式也有三种方式分别为STAstext和STAsbinary以及其原本的输出方式。
测试linstring(22,43);这个数据,三种方式输出分别为:
其原本的输出结果是:
0x0000000001140000000000000040000000000000004000000000000010400000000000000840
语法为:
select@a;
转换为text(STAsText)输出结果是
LINESTRING(22,43)
语法为:
select@a.STAsText();
转换为binary(STAsText)输出结果是:
x010*********
语法为:
select@a.STAsBinary();
3.2OracleSpatial支持的空间数据类型
在Oracle中SDO_GEOMETRY数据类型是一个很有威力的结构。
你可以用这个类型存储点、线串、多边形、面和立方体等几何体,同样还可以存储这些几何体的同构或异构集合。
SDO_GEOMETRY中的SDO_GTYPE属性指定几何体类型(形状),SDO_ELEM_INFO属性和SDO_ORDINATES属性一起指定了几何体的坐标信息和连通性。
SDO_POINT属性存储二维或三维的点的位置。
简而言之,你可以将OGC简单特性规范12中提到的任何二维类型以及OGCGML2.0和3.0规范中提到的大多数三维类型(不包括参数曲线和参数面)存储为一个SDO_GEOMETRY。
除了几何结构外,你可以用合适的坐标系将空间参照和SDO_GEOMETRY对象相关联。
如果坐标系是基于EPSG模型的,还可以在不同坐标系之间定义自己的转换路径。
在应用程序中,你可以使用SDO_GEOMETRY数据类型将客户的位置、交货地点和竞争对手建模为一个二维空间的点。
你可以将街道和高速路的位置和形状建模为线串、将城市边界建模为多边形。
对于城市建模和资产管理应用,使用SDO_GEOMETRY类型列,你不仅可以存储位置,还可以将建筑物的精确结构存储为三维的立方体或者集合。
SDO_GEOMETRY类型能够存储许多不同类型的空间数据,其中包括:
点,可用来存储实体的位置坐标,例如,客户场所、店面位置、交货地点等。
线串(linestring),可用来存储某一路段的位置及形状。
多边形和面,可用来存储城市的边界、商业区等。
复杂的几何体,如多重多边形,可用来存储德克萨斯州、夏威夷和加州等地的边界。
SDO_GEOMETRY的属性有:
SDO_GTYPE NUMBER
SDO_SRID NUMBER
SDO_POINT MDSYS.SDO_POINT_TYPE
SDO_ELEM_INFO MDSYS.SDO_ELEM_INFO_ARRAY
SDO_ORDINATES MDSYS.SDO_ORDINATE_ARRAY
下面是SDO_GEOMETRY每个属性的用处:
SDO_GTYPE属性,表示几何体实际形状的类型(点、线串、多边形、集合、多重点、多重线串或者多重多边形)。
如,SDO_GTYPE为2001时,表示二维的点;若为3001时,表示三维的点。
SDO_SRID属性,指定空间参考系(坐标系)的ID。
几何体的位置和形状都在该参考系中确定。
如果几何体是一个点(如客户的位置),你可以把它的坐标存储到SDO_GEOMETRY的SDO_POINT属性中。
如果几何体是一个任意形状(如街区网络或城市边界),则可以把它的坐标存储到SDO_ORDINATES和SDO_ELEM_INFO数组属性:
SDO_ORDINATES属性存储所有几何体元素的坐标。
SDO_ELEM_INFO规定在SDO_ORDINATES数组中,一个新的元素从什么地方开始,怎么连接(通过直线还是弧),是点、线串还是多边形。
3.3Postgis支持的空间数据类型
3.4DB2支持的空间数据类型
当我们启用一个数据库来执行各种空间操作时,DB2®SpatialExtender为数据库提供了一个结构化空间数据类型的等级表,如表1,在这个表中,白色框中的数据类型是实例化的数据类型(instantiabletypes),而阴影框中的是非实例化的数据类型(uninstantiabletypes)。
Instantiabledatatypes包括ST_Point,ST_LineString,ST_Polygon,ST_GeomCollection,ST_MultiPoint,ST_MultiPolygon,andST_MultiLineString.
uninstantiabletypes包括ST_Geometry,ST_Curve,ST_Surface,ST_MultiSurface,andST_MultiCurve.
数据类型的等级包括以下几种:
∙Datatypesforsingle-unitfeatures
运用ST_Point,ST_LineString,andST_Polygon等数据类型来存储坐标;
表示可自觉形成一个独立单位的地理特征的数据类型,例如:
个人住宅和孤立的湖泊。
∙Datatypesformulti-unitfeatures
运用ST_MultiPoint,ST_MultiLineString,andST_MultiPolygon等数据类型来存储坐标;
表示由多个单位或部分组成的地理特征的数据类型,例如:
运河系统和岛群的胡。
∙Adatatypeforallfeatures
表示各种地理特征的数据类型;对于不能确定属于那种数据类型的数据,就可以用ST_Geometry。
3.5综合比较
4、空间索引的比较
4.1MicrosoftSQLServer2008支持的空间索引
在sql2008中,空间索引使用B树构建,也就是说这些索引必须按照b树的线性顺序表示二维空间数据,在导入空间索引之前,sql先实现对空间的分层均匀分解。
索引创建过程会将空间分解成一个四级“网络层次结构”。
这些级别指的是:
“第一级”、“第二级”、“第三级”、和“第四级”。
每个后续级别都会进一步分解其上一级,因此上一级别的每个单元都包含下一级别的整个网格。
在给定级别上,所有网格沿两个轴都有相同数目的单元(例如4x4或8x8),并且单元的大小都相同。
一般语法为:
CREATESPATIALINDEXindex_the_geomON[dbo].[jumingdi]
(
the_geom
)USINGGEOMETRY_GRID
WITH(
BOUNDING_BOX=(0,0,60,60),GRIDS=(LEVEL_1=MEDIUM,LEVEL_2=MEDIUM,LEVEL_3=MEDIUM,LEVEL_4=MEDIUM),
CELLS_PER_OBJECT=16,PAD_INDEX=OFF,SORT_IN_TEMPDB=OFF,DROP_EXISTING=OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
其中:
using为指定分割方案:
有两种分割方案:
geometry_grid和geography_gird两种;
with(空间索引参数)
bounding_box为指定定义边界框四个坐标的一个数值四元组:
左下角的最小x坐标和最小y坐标,以及右上角的最大x坐标和最大y坐标。
grids为定义分割方案中每一级别的网格密度,参数如下:
LEVEL_1
指定第一级(顶级)网格。
LEVEL_2
指定第二级网格。
LEVEL_3
指定第三级网格。
LEVEL_4
指定第四级网格。
LOW
为给定级别的网格指定可能的最低网格密度。
LOW等于16个单元(4x4网格)。
MEDIUM
为给定级别的网格指定中等网格密度。
MEDIUM等于64个单元(8x8网格)。
HIGH
为给定级别的网格指定可能的最高网格密度。
HIGH等于256个单元(16x16网格)。
cells_per-object=n为指定分割过程可以为索引中的单个空间对象使用的每个对象的分割单元格数:
n可以是介于1到8192(包括1和8192)之间的任何整数。
每个对象的默认单元格数为16。
如果传递的数字无效或者该数字大于指定分割的最大单元格数,则会引发错误。
PAD_INDEX={ON|OFF}
指定索引填充。
默认值为OFF。
ON
fillfactor指定的可用空间百分比应用于索引的中间级页。
OFF或不指定fillfactor
考虑到中间级页上的键集,将中间级页填充到接近其容量的程度,以留出足够的空间,使之至少能够容纳索引的最大的一行。
PAD_INDEX选项只有在指定了FILLFACTOR时才有用,因为PAD_INDEX使用由FILLFACTOR指定的百分比。
如果为FILLFACTOR指定的百分比不够大,无法容纳一行,数据库引擎将在内部覆盖该百分比以允许最小值。
中间级索引页上的行数永远都不会小于两行,无论fillfactor的值有多小。
FILLFACTOR=fillfactor
指定一个百分比,表示在索引创建或重新生成过程中数据库引擎应使每个索引页的叶级别达到的填充程度。
fillfactor必须为介于1至100之间的整数值。
默认值为0。
如果fillfactor为100或0,数据库引擎将创建叶级页达到其填充容量的索引。
SORT_IN_TEMPDB={ON|OFF}
指定是否在tempdb中存储临时排序结果。
默认值为OFF。
DROP_EXISTING={ON|OFF}
指定应删除并重新生成已命名的先前存在的空间索引。
默认值为OFF。
ON
删除并重新生成现有索引。
指定的索引名称必须与当前的现有索引相同;但可以修改索引定义。
例如,可以指定不同的列、排序顺序、分区方案或索引选项。
OFF
如果指定的索引名称已存在,则会显示一条错误。
使用DROP_EXISTING不能更改索引类型。
ALLOW_ROW_LOCKS={ON|OFF}
指定是否允许使用行锁。
默认值为ON。
ON
在访问索引时允许使用行锁。
数据库引擎确定何时使用行锁。
OFF
不使用行锁。
ALLOW_PAGE_LOCKS={ON|OFF}
指定是否允许使用页锁。
默认值为ON。
ON
在访问索引时允许使用页锁。
数据库引擎确定何时使用页锁。
OFF
不使用页锁。
4.2OracleSpatial支持的空间索引
OracleSpatial:
快速R-树索引和四叉树索引
SQL:
Createindex<索引名>on<表名>(<列名>)
Indextypeismdsys.spatial_index
Parameters(‘空间索引参数设定’);
其中,空间索引参数包括:
tablespace(存储空间索引的表空间)、work_tablespace(工作表空间)、layer_gtype(几何类型)、sdo_indx_dims(维数)、sdo_dml_batch_size(批量大小)、sdo_level()
空间索引定义
每一个空间索引的信息取决于该索引是一个R-树索引或一个四叉树索引。
对于一个R-树索引,空间索引中包含下表显示的列。
列名
数据类型
用途
NODE_ID
NUMERIC
树节点唯一的ID号码
NODE_LEVEL
NUMERIC
定义在树节点。
叶节点为第1级,而他们的父节点是2级,依此类推
INFO
BLOB
其他节点的信息。
包括对对(数组最大扇出值,或每个R-树节点的子节点数目)
对于一个四叉树索引,空间索引中