如何在sqlite3中创建和填充几何列

问题描述 投票:0回答:4

我正在本地计算机上创建一个测试数据库,以便我可以在进行更大的运行以针对实际的 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()
python-2.7 sqlite gis
4个回答
1
投票

看起来您正在使用 SpatiaLite,它为 SQLite 添加了功能。请参阅秘诀#6:创建新的几何列。下一张幻灯片展示了如何将一些简单的几何图形加载到表格中。

请参阅 SpatiaLite 的主要网络资源,其中包含食谱、参考资料等。如果您需要查看几何图形,请尝试 QGIS。


1
投票

您需要导入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("()',[]")))

0
投票

看起来您正在使用 PostGIS,它为 PostgreSQL 添加了功能。其中包括

AddGeometryColumn
函数。这对 SQLite 不可用,因为它不是标准函数。


0
投票

您似乎正在尝试在 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)
© www.soinside.com 2019 - 2024. All rights reserved.