我正在寻找一种将空间数据映射到sqlalchemy对象的方法。有人可以告诉我是否有这样的方式?谢谢!
答案 0 :(得分:3)
是的,您需要查看GeoAlchemy包。
将列类型添加到名为GeometryColumn的表中。
过滤也是非常流行的。来自文档:
s = session.query(Spot).filter(Spot.geom.kml == '<Point><coordinates>-81.4,38.08</coordinates></Point>').first()
这不过是简单的pip install GeoAlchemy
。
答案 1 :(得分:1)
我尝试使用GeoAlchemy
,但是它不支持MySql
。
根据{{3}}:
GeoAlchemy 2当前不支持PostgreSQL / PostGIS之外的其他方言。
我所做的是创建自定义空间类型:
from sqlalchemy import func
from sqlalchemy.types import UserDefinedType
class Geometry(UserDefinedType):
def get_col_spec(self):
return "GEOMETRY"
def bind_expression(self, bindvalue):
return func.ST_GeomFromText(bindvalue, type_=self)
def column_expression(self, col):
return func.ST_AsText(col, type_=self)
假设您的数据库中有address
个表,
其中包含带有坐标的空间列。
现在,您可以在模型中使用此自定义类型:
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
coordinates = Column(Geometry, nullable=False)
然后您可以像这样使用模型:
address = Address()
address.coordinates = 'POINT(0 0)'
如果您希望SQLAlchemy
为此列添加空间索引,则可以使用事件侦听器:
from sqlalchemy import event, DDL
event.listen( Address.__table__ , 'after_create', DDL("ALTER TABLE `address` ADD SPATIAL(`coordinates`)"))