7.1 KiB
7.1 KiB
Spatialite快速入门
1.开始
1.1 开始准备
本教程的目标是让你快速熟悉Spatialite和Spatialite的空间函数。
这里我们默认您已经熟悉最基本的Sql增删改查操作,如果您不是一名程序员,也无需担心,基础的sql语句都十分简单,相信您在学习本教程时也能快速入门。
本教程使用test-2.3.sqlite作为测试用数据,您可以点击超链接下载该文件。这里我们使用官方提供的基于Windows环境的Spatialite-gui程序作为练习,您也可以在这里下载或编译其他系统的Spatialite程序。
万事具备,现在可以双击打开spatialite_gui.exe程序。
-
点击Menu
-
选择Connect an existing Sqlite DB,然后选择刚才下载的test-2.3.sqlite文件。
-
此后我们右侧上部的输入框内输入sql语句。
-
然后单击最右侧的按钮执行sql。
1.2 关于test-2.3.sqlite文件
这是一个简单的,小型的但是又极具现实意义的数据库文件,由这个网站提供。
这个文件主要包含下面几个表:
- regions表:包含109行数据,存在的geometry列,存储的是一个POLYGON面数据。
- towns表: 包含8101行数据,存在的geometry列,存储的是一个POINT点数据。
- highways表: 包含775行数据,存在的geometry列,存储的是一个LINESTRING线数据。
1.3 简单的sql查询
Spatialite支持所有的sqlite语句的执行,事实上,Spatialite是在sqlite数据库的基础上,增加了支持空间函数的扩展,例如,我们可以在Spatialite-gui.exe中执行以下sql语句:
1.3.1 简单查询
SELECT * FROM towns LIMIT 5;
1.3.2 条件查询
select name AS Town, peoples as Population from towns ORDER BY name LIMIT 5;
1.3.3 排序查询
select name, peoples from towns WHERE peoples > 350000 order by peoples DESC;
1.3.4 求和、最大、最小值查询
select COUNT(*) as '# Towns', MIN(peoples) as Smaller, MAX(peoples) as Bigger, SUM(peoples) as 'Total peoples', SUM(peoples) / COUNT(*) as 'mean peoples for town' from towns;
1.3.5 简单表达式
Spatialite也支持简单的表达式,请看这个例子
select (10 - 11) * 2 as Number, ABS((10 - 11) * 2) as AbsoluteValue;
1.3.6 使用HEX
HEX函数可以将指定列的数据转换为16进制的数据显示
select name, peoples, HEX(Geometry) from Towns where peoples > 350000 order by peoples DESC;
2. 开始使用空间函数
2.1 Geometry和WKT字符串的互转
2.1.1 查看Geometry的bolb对象,使用AsText
- AsText函数也许是Spatialite中使用最频繁的函数之一,多数情况下,我们会将数据的位置信息以Bolb格式(数据对象)保存,并且为了日后可以按照空间关系去查询数据,还会以该字段建立空间索引。而查询后的数据又该如何使用呢?就是通过AsText函数将Bolb对象转换为WKT文本,然后在应用层再将该WKT文本重新转换为空间对象(Java中使用jts.jar中提供的函数实现转换)。
Select Name, Peoples, AsText(Geometry) from Towns order by Peoples Desc
2.1.2 Wkt对象转换为数据库中的空间对象,使用GeomFromText
- GeomFromText可以将wkt格式的字符串,转换为Spatialite中的geometry对象
select GeomFromText('Point(5 10)')
2.2 获取Geometry的X和Y坐标
- 当Geometry的数据类型是Point点时,可以通过X、Y函数获取这个点的经纬度
SELECT name, X(Geometry), Y(Geometry) FROM Towns WHERE peoples > 350000 ORDER BY peoples DESC
2.3
- 该部分我们将带你认识OpenGIS规范中定义的SpatiaLite支持的各种GEOMETRY类,简单来讲,任何的Geometry类都是一种特定的几何类型(点/线/面)。在此前的章节中我们已经认识了点(Point)类型,下面我们再来了解下其他的几何类型。
2.3.1 查询线类型
SELECT PK_UID, AsText(Geometry) FROM HighWays WHERE PK_UID = 1
- LineString是另外一种Geometry对象,它由许多个(>=2)点组成,在几何中代表一根线
- 这里查询到的就是由若干个点组成的一根线数据,在LineString中,一组经纬度由空格分隔,而各组经纬度所组成的点则由逗号分隔
- 在实际使用中,成百上千个点组成一条线并不少见
2.3.2 NumPoints、GLength、Dimension、GeometryType
SELECT PK_UID, NumPoints(Geometry), GLength(Geometry),Dimension(Geometry), GeometryType(Geometry) FROM HighWays ORDER BY NumPoints(Geometry) DESC LIMIT 5;
- NumPoints函数返回LineString对象的点位个数
- GLength函数返回LineString的长度(单位以地图单位为准)
- Dimension函数返回Geometry的维度(点类型的维度就是0,线类型为1,面类型为2)
- GeometryType返回Geometry的类型(可能会返回POINT、LINESTRING、POLYGON以及多线MULTILINESTRING、多面MULTIPOLYGON)
2.3.3 StartPoint、EndPoint、PointN
SELECT PK_UID, NumPoints(Geometry), AsText(StartPoint(Geometry)), AsText(EndPoint(Geometry)), X(PointN(Geometry, 2)), Y(PointN(Geometry, 2)) FROM HighWays ORDER BY NumPoints(Geometry) DESC LIMIT 5;
- StartPoint函数返回LineString对象的起点
- EndPoint函数返回LineString对象的终点
- PointN返回LineString对象指定的第N个点
2.3.4 面对象Polygon
SELECT name, AsText(Geometry) FROM Regions WHERE PK_UID = 52
- Polygon是另外一种Geometry对象,一般由多个点(>=3)组成,代表一个面几何对象
- 这个例子中的Polygon是一个极为简单的类型,只包含一个外环。请注意,Polygon有时会包含若干个内环
- Polygon的数据与LineString类似,事实上,一个Polygon面可以认为是一条首尾相连的Line组成的
- 因此,Polygon的首点和尾点必须一致
2.3.5 Area、Centroid、Dimension、GeometryType
SELECT PK_UID, Area(Geometry), AsText(Centroid(Geometry)), Dimension(Geometry), GeometryType(Geometry) FROM Regions ORDER BY Area(Geometry) DESC LIMIT 5;
- Area函数返回Polygon的面积
- Centroid函数返回Polygon的质心,可以认为是polygon的中心点
- Dimension和GeometryType我们在上面的LineString中已经见识过了,这里不再赘述