>>> 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_extension
,load_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)