Docsify/gis/Spatialite教程.md
2023-06-13 16:37:18 +08:00

172 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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。
![Spatialite-gui使用](../assets/1.1-Spatialite-gui使用.png)
### 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.3-1.png](../assets/1.3.3-1.png)
#### 1.3.2 条件查询
> ```sql
> select name AS Town, peoples as Population from towns ORDER BY name LIMIT 5;
> ```
>
> ![1.3.3-2.png](../assets/1.3.3-2.png)
#### 1.3.3 排序查询
> select name, peoples from towns WHERE peoples > 350000 order by peoples DESC;
>
> ![1.3.3-3.png](../assets/1.3.3-3.png)
#### 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.3-4.png](../assets/1.3.3-4.png)
#### 1.3.5 简单表达式
**Spatialite也支持简单的表达式请看这个例子**
> ```sql
> select (10 - 11) * 2 as Number, ABS((10 - 11) * 2) as AbsoluteValue;
> ```
>
> ![1.3.3-5.png](../assets/1.3.3-5.png)
#### 1.3.6 使用HEX
**HEX函数可以将指定列的数据转换为16进制的数据显示**
> ```sql
> select name, peoples, HEX(Geometry) from Towns where peoples > 350000 order by peoples DESC;
> ```
>
> ![1.3.3-6.png](../assets/1.3.3-6.png)
## 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.png](../assets/2.1.png)
#### 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.png](../assets/2.3.png)
### 2.3
* 该部分我们将带你认识OpenGIS规范中定义的SpatiaLite支持的各种GEOMETRY类简单来讲任何的Geometry类都是一种特定的几何类型(点/线/面)。在此前的章节中我们已经认识了点(Point)类型,下面我们再来了解下其他的几何类型。
---
#### 2.3.1 查询线类型
> ```sql
> SELECT PK_UID, AsText(Geometry) FROM HighWays WHERE PK_UID = 1
> ```
> ![2.3.1.png](../assets/2.3.1.png)
> 截图不完整请自行在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;
> ```
> ![2.3.2.png](../assets/2.3.2.png)
* 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;
> ```
> ![2.3.3.png](../assets/2.3.3.png)
* StartPoint函数返回LineString对象的起点
* EndPoint函数返回LineString对象的终点
* PointN返回LineString对象指定的第N个点
#### 2.3.4 面对象Polygon
> ```sql
> SELECT name, AsText(Geometry) FROM Regions WHERE PK_UID = 52
> ```
> ![2.3.4.png](../assets/2.3.4.png)
* 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;
> ```
> ![2.3.5.png](../assets/2.3.5.png)
* Area函数返回Polygon的面积
* Centroid函数返回Polygon的质心可以认为是polygon的中心点
* Dimension和GeometryType我们在上面的LineString中已经见识过了这里不再赘述