Python与开源GIS:SpatiaLite 中的基本SQL数据库查询用法

Python与开源GIS:SpatiaLite 中的基本SQL数据库查询用法


发布日期: 2017-04-03 更新日期: 2019-10-28 编辑:xuzhiping 浏览次数: 9054

标签:

摘要: Python与开源GIS教程的内容,开发了单独的内容,请打开 https://www.osgeo.cn/pygis/ 查看。 本页面的内容不再更新。 这一节我们来看一下基本的SQL语句用法。使用最通用的 Shape 文件作为源数据,来生成进...

Python与开源GIS教程的内容,开发了单独的内容,请打开 https://www.osgeo.cn/pygis/ 查看。
本页面的内容不再更新。



这一节我们来看一下基本的SQL语句用法。使用最通用的 Shape 文件作为源数据,来生成进行实验使用的 SpatiaLite 数据库文件。转换的时候,使用的是前面介 绍过的GDAL/OGR 的工具 ogr2ogr。

ogr2ogr  -f SQLite -dsco SPATIALITE=YES x_china.db stats_county.shp -nlt multipolygon

% /test-2.3.sqlite数据库,在 \href{https://www.gaia-gis.it/spatialite-2.3.1/resources.html} 下载。

开始使用 SQL

现在开始学习SQLite,我们可以在 x_china.db 数据库上执行 第一条SQL查询。

$ spatialite x_china.db
spatialite> .headers on
spatialite> select * from STATS_COUNTY limit 5;
OGC_FID|GEOMETRY|province|name|ename|popu
1||23.0|南充市|mohexian|66.0
2||23.0|塔河县|tahexian|10.0
3||15.0|额尔古纳右旗|geergunyouqi|17.0
4||23.0|呼玛县|humaxian|5.0
5||15.0|额尔古纳左旗|geergunzuoqi|8.0
5|Magliano Alfieri|1674|1|0|0|

SELECT 是SQL中最常用的查询语句,上面的命令,从数据表中,获取了最开始的5条记录的所有字段的信息。

现在开始第二条SQL查询:

spatialite> SELECT name AS County, popu as Population FROM stats_county ORDER BY name LIMIT 5;
County|Population
丁青县|6.0
七台河市|49.0
万全县|21.0
万县市|0.0
万宁县|62.0

复杂一点的SQL查询

spatialite> select name, popu from stats_county WHERE popu > 500 order by popu DESC;
name|popu
上海市|1137.0
北京市|974.0
涪陵市|896.0
重庆市|896.0
武汉市|749.0
天津市|682.0
广州市|567.0

SQL的高级用法

现在,我们看到SQL查询的另一种模式:

spatialite> select COUNT(*) as '# 城镇',
   ...> MIN(popu) as '最少',
   ...> MAX(popu) as '最多',
   ...> SUM(popu) as '人口总数',
   ...> SUM(popu) / COUNT(*) as '城镇平均人口'
   ...> from stats_county;
# 城镇|最少|最多|人口总数|城镇平均人口
2390|0.0|1137.0|125322.0|52.4359832635983
  • SQL语句可以写到多行中。SQLite会把分号前面的语句当成一条指令来执行;
  • 可以在SQL查询中使用函数,如 COUNT()、 SUM()、 MIN()、 MAX(),这些意义都是显而易见的,不再赘述。

有效的SQL查询由简单的表达式和函数组成。请看下面的例子:

spatialite> select (10 - 11) * 2 as number, abs((10 - 11) * 2) as absolutevalue;
number|absolutevalue
-2|2

在这个例子中,并没有使用数据库字段或数据表。

现在,我们稍做变动重复上述查询

spatialite> select name, popu, HEX(GEOMETRY) from stats_county WHERE popu > 500 order by popu DESC;
name|popu|HEX(GEOMETRY)
上海市|1137.0|0001CAF80400DA2CBC76210B37419E72327E805B4E4112912 ... ...
北京市|974.0|0001CAF8040089536BC915292A418505E287E150524119F204 ... ...
涪陵市|896.0|0001CAF80400BC9DD1586C080741D466174E90C04B41AB76BF ... ...
重庆市|896.0|0001CAF8040088D147F6BF47FF4032E5513FA3BE4B4192D70E ... ...
武汉市|749.0|0001CAF804002ACF64BED4322941789BF197B9AF4C41E2C05E ... ...
天津市|682.0|0001CAF80400B27E94A949552E4172BCB19009025241C45EF6 ... ...
广州市|567.0|0001CAF804003ABD370486232A41566628A0539D4641A1DACA ... ...

上面的 HEX(GEOMETRY)的结果并没有完全打印出来。

HEX()| 函数返回 GEOMETRY 字段的二进制大对象的十六进制表达;在前面执行的时候 GEOMETRY 字段看起来像是空的,现在通过使用 HEX() 函数,我们知道里面包含有二进制数据。

返回目录:Python与开源GIS

关注公众号
获取免费资源

随机推荐


Copyright © Since 2014. 开源地理空间基金会中文分会 吉ICP备05002032号

Powered by TorCMS

OSGeo 中国中心 邮件列表

问题讨论 : 要订阅或者退订列表,请点击 订阅

发言 : 请写信给: osgeo-china@lists.osgeo.org