172 lines
7.1 KiB
Markdown
172 lines
7.1 KiB
Markdown
# Spatialite快速入门
|
||
|
||
## 1.开始
|
||
|
||
### 1.1 开始准备
|
||
本教程的目标是让你快速熟悉Spatialite和Spatialite的空间函数。
|
||
|
||
这里我们默认您已经熟悉最基本的Sql增删改查操作,如果您不是一名程序员,也无需担心,基础的sql语句都十分简单,相信您在学习本教程时也能快速入门。
|
||
|
||
本教程使用[test-2.3.sqlite](../assets/test-2.3.sqlite)作为测试用数据,您可以点击超链接下载该文件。这里我们使用官方提供的基于Windows环境的[Spatialite-gui程序](../assets/spatialite_gui-NG-5.0.0-win-amd64.7z)作为练习,您也可以在[这里](http://www.gaia-gis.it/gaia-sins/index.html)下载或编译其他系统的Spatialite程序。
|
||
|
||
万事具备,现在可以双击打开spatialite_gui.exe程序。
|
||
1. 点击Menu
|
||
2. 选择Connect an existing Sqlite DB,然后选择刚才下载的test-2.3.sqlite文件。
|
||
3. 此后我们右侧上部的输入框内输入sql语句。
|
||
4. 然后单击最右侧的按钮执行sql。
|
||
|
||

|
||
|
||
### 1.2 关于test-2.3.sqlite文件
|
||
这是一个简单的,小型的但是又极具现实意义的数据库文件,由[这个网站](https://www.rigacci.org/wiki/doku.php/tecnica/gps_cartografia_gis/download)提供。
|
||
|
||
这个文件主要包含下面几个表:
|
||
1. regions表:包含109行数据,存在的geometry列,存储的是一个POLYGON面数据。
|
||
2. towns表: 包含8101行数据,存在的geometry列,存储的是一个POINT点数据。
|
||
3. highways表: 包含775行数据,存在的geometry列,存储的是一个LINESTRING线数据。
|
||
|
||
### 1.3 简单的sql查询
|
||
Spatialite支持所有的sqlite语句的执行,事实上,Spatialite是在sqlite数据库的基础上,增加了支持空间函数的扩展,例如,我们可以在Spatialite-gui.exe中执行以下sql语句:
|
||
#### 1.3.1 简单查询
|
||
> ```sql
|
||
> SELECT * FROM towns LIMIT 5;
|
||
> ```
|
||
>
|
||
> 
|
||
|
||
#### 1.3.2 条件查询
|
||
> ```sql
|
||
> 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 求和、最大、最小值查询
|
||
> ```sql
|
||
> 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也支持简单的表达式,请看这个例子**
|
||
|
||
> ```sql
|
||
> select (10 - 11) * 2 as Number, ABS((10 - 11) * 2) as AbsoluteValue;
|
||
> ```
|
||
>
|
||
> 
|
||
|
||
#### 1.3.6 使用HEX
|
||
|
||
**HEX函数可以将指定列的数据转换为16进制的数据显示**
|
||
> ```sql
|
||
> 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中提供的函数实现转换)。
|
||
|
||
> ```sql
|
||
> 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函数获取这个点的经纬度
|
||
> ```sql
|
||
> 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 查询线类型
|
||
> ```sql
|
||
> SELECT PK_UID, AsText(Geometry) FROM HighWays WHERE PK_UID = 1
|
||
> ```
|
||
> 
|
||
> 截图不完整,请自行在Spatialite中测试查看
|
||
|
||
* LineString是另外一种Geometry对象,它由许多个(>=2)点组成,在几何中代表一根线
|
||
* 这里查询到的就是由若干个点组成的一根线数据,在LineString中,一组经纬度由空格分隔,而各组经纬度所组成的点则由逗号分隔
|
||
* 在实际使用中,成百上千个点组成一条线并不少见
|
||
|
||
#### 2.3.2 NumPoints、GLength、Dimension、GeometryType
|
||
> ```sql
|
||
> 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
|
||
> ```sql
|
||
> 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
|
||
> ```sql
|
||
> 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
|
||
> ```sql
|
||
> 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中已经见识过了,这里不再赘述
|
||
|