我正在本地计算机上创建一个测试数据库,以便我可以在进行更大的运行以针对实际的 postgres 数据库保存之前测试一些计算。但我无法让
sqlite3
创建数据并将其保存到我的 geom
列(这是由 python 正确创建的)。似乎 geom
列也没有被创建。任何帮助将不胜感激。
conn = lite.connect('geom_test.db')
c = conn.cursor()
c.execute("""CREATE TABLE test
(
lat double precision,
long double precision,
speed double precision)"""))
c.execute("""
SELECT AddGeometryColumn('test', 'geom',
4326, 'POINT', 'XY');""")
line = ogr.Geometry(ogr.wkbLineString)
line.AddPoint_2D(lon,lat)
line = line.ExportToWkt()
qry ="INSERT INTO sequence VALUES (?,?,?,?);"
conn = lite.connect('geom_test.db')
c = conn.cursor()
c.executemany(qry, data) #data is 4 columns dict
c.close()
conn.commit()
conn.close()
看起来您正在使用 SpatiaLite,它为 SQLite 添加了功能。请参阅秘诀#6:创建新的几何列。下一张幻灯片展示了如何将一些简单的几何图形加载到表格中。
请参阅 SpatiaLite 的主要网络资源,其中包含食谱、参考资料等。如果您需要查看几何图形,请尝试 QGIS。
您需要导入spatialite共享库:
import sqlite3 as lite
from os.path import realpath
conn = lite.connect('geom_test.db')
library_path = "/usr/local/lib/mod_spatialite.so" # on my ubuntu linux
conn.enable_load_extension(True)
conn.load_extension(realpath(library_path))
或另一种加载扩展程序的方法:
conn.execute("SELECT load_extension(?, 'sqlite3_modspatialite_init');",
(realpath(library_path),))
在 Windows 上,名称将为“mod_spatialite.dll”(还要注意提供给 load_extension() 的路径,即在调用之前正确转义有问题的字符并解析符号链接)。
无论如何SpatiaLite 网站上的此页面显示了有关共享库加载的一些详细信息。
编辑: 如果加载失败,则会出现
OperationalError
。如果成功,您可以检查它是否使用您期望的版本(当然,并执行您尝试执行的操作):
vs = str([i for i in c.execute("""SELECT spatialite_version()""")])
vgeos = str([i for i in c.execute("""SELECT geos_version()""")]
print('Spatialite {} (GEOS {})'.format(
vs.strip("()[]',"), vgeos.strip("()',[]")))
看起来您正在使用 PostGIS,它为 PostgreSQL 添加了功能。其中包括
AddGeometryColumn
函数。这对 SQLite 不可用,因为它不是标准函数。
您似乎正在尝试在 SQLite 中创建带有几何列的表,但不直接支持该表。与具有 PostGIS 扩展的 PostgreSQL 不同,SQLite 没有对几何类型的本机支持。
但是,如果您使用 Python 并且需要空间功能,您可以考虑使用 GeoAlchemy 或 GeoPandas 等库以及 SQLAlchemy。这些库允许您在 Python 中处理空间数据,并且可以使用空间列处理数据库操作。
以下是如何修改代码以使用 GeoAlchemy:
python_代码:
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, Float
from sqlalchemy.ext.declarative import declarative_base
from geoalchemy2 import Geometry
Base = declarative_base()
class Test(Base):
__tablename__ = 'test'
id = Column(Integer, primary_key=True)
lat = Column(Float)
long = Column(Float)
speed = Column(Float)
geom = Column(Geometry('POINT'))
engine = create_engine('sqlite:///geom_test.db')
Base.metadata.create_all(engine)