>>> from env_helper import info; info()
页面更新时间: 2024-07-23 22:05:01
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-23-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

8.3. 在Python中使用SpatiaLite

这一部分说明了如何在Python使用和操作SpatiaLite。

我们用SpatiaLite来重写一下这个程序。 我们先创建一个数据库文件,然后 将spatialite-2.3.sql 初始化文件的内容导入这个数据库文件中。 这样就能够创建和初始化空间数据库, 并利用大量普遍应用的空间参数来进行普及 spatial_ref_sys

8.3.1. 使用SpatiaLite

在许多方面,SpatiaLite都效仿PostGIS。 在旧版本中,在用SpatiaLite之前,需要在数据库里加载“初始化文件”,并利用 AddGeometryColumn() 功能定义空间列。

在最新版本中,这个“初始化文件”不需要单独来做, 只需加载扩展模块,则会自动完成初始化任务。

下面来创建SpatiaLite数据库和数据库表格。 第一步 连接数据库,并加载SpatiaLite扩展,如下:

>>> import sqlite3 as sqlite
>>> db = sqlite.connect(':memory:')
>>> db.enable_load_extension(True)
>>> # db.execute('SELECT load_extension("libspatialite.so.5")')  # In Debian 8
>>> db.execute('SELECT load_extension("mod_spatialite.so.7")')  # In Debian 9
<sqlite3.Cursor at 0x7f9ceb45ebc0>

注意,上面执行 SQL 语句时,返回了一些信息,但这些信息对于学习是没有用的。 在下面的章节中,对于此类信息,不在文中出现,使用的时候要注意。

注,因为SQLite是无服务器数据库, myDatabase.db 数据库就像硬盘上的文件。 如果在Mac操作系统上运行,可以略过 enable_load_extensionload_extension

这个需要进行初始化。否则,会出现下面的错误。

AddGeometryColumn() error: unexpected metadata layout

另外, Python 2中有 pyspatialite 模块, 可以简化一些操作。但是,这个模块最后一次更新时间是 2013 年,并且不支持 Python 3, 所以在本书中就不做介绍了。使用 Python 2 的话可以了解一下。

>>> cursor = db.cursor()
>>> cursor.execute('SELECT InitSpatialMetaData();')
<sqlite3.Cursor at 0x7f9ceb620dc0>

Mac用户可以跳过db.enable_load_extension(...)db.execute('SELECT load_extension(...)')函数。

运行初始化脚本将生成SpatiaLite需要的内部数据库表格,也会载入一系列空间参照,所以可以用 SRID值来定义空间参照。 运行初始化脚本后,可以创建一个新的数据库表格来保存空间数据。就像PostGIS需要二步,一是利用标准的SQL语句来创建表格中的非空间数据。

8.3.2. 创建数据表及数据

在数据库初始化之后,已经包含有一系列的表。 现在我们来创建一个新的数据表,并看一下如何向表中插入几何数据。

>>> cursor.execute("DROP TABLE IF EXISTS cities")
<sqlite3.Cursor at 0x7f9ceb620dc0>
>>> cursor.execute("CREATE TABLE cities (" +
>>>     "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
>>>     "name CHAR(255))")
<sqlite3.Cursor at 0x7f9ceb620dc0>

然后,用SpatiaLite的AddGeometryColumn()函数来定义表格中的空间列。

>>> cursor.execute("SELECT AddGeometryColumn('cities', 'geom', 4326, 'POLYGON', 2)")
<sqlite3.Cursor at 0x7f9ceb620dc0>

4326是用来识别列属性的空间参照ID(SRID),是用经纬度和WGS84来定义的空间参照。

可以用 CreateSpatialIndex() 函数来创建几何对象中的空间索引。如下:

>>> cursor.execute("SELECT CreateSpatialIndex('cities', 'geom')")
<sqlite3.Cursor at 0x7f9ceb620dc0>

已经创建了数据库表格,用 GeomFromText() 功能插入几何对象的属性。

>>> cursor.execute("INSERT INTO cities (name, geom)" + \
>>>        " VALUES ({0}, GeomFromText({1}, 4326))".format('"city"', '"wkt"'))
<sqlite3.Cursor at 0x7f9ceb620dc0>

8.3.3. 读取数据

读取数据相对就简单一些,可以使用 SQL 的 SELECT 语句。 需要注意几何要素的读取。 这里有一个AsText() 函数可以将BLOB对象转换成可以理解的文本对象。

>>> for name,wkt in cursor:
>>>     print(name,wkt)