gpt4 book ai didi

python - 地理炼金术2 : find a set of Geometry items that doesn't intersect with a separate set

转载 作者:太空宇宙 更新时间:2023-11-03 18:31:49 25 4
gpt4 key购买 nike

我有一个名为 tasks 的 postgis 数据库表,使用 geoalchemy2/sqlalchemy 映射到 python 类 Task - 每个条目都有一个 MultiPolygon geometry和一个整数状态。总的来说,我的数据库中的条目涵盖了一个地理区域。我想选择一个 state=0 的随机条目,该条目在地理上不与 state=1 的任何条目相邻

这是选择 state=0 的随机条目的代码:

class Task(Base):
__tablename__ = "tasks"
id = Column(Integer, primary_key=True, index=True)
geometry = Column(Geometry('MultiPolygon', srid=4326))
state = Column(Integer, default=0)

session = DBSession()
taskgetter = session.query(Task).filter_by(state=0)
count = taskgetter.count()
if count != 0:
atask = taskgetter.offset(random.randint(0, count-1)).first()

到目前为止一切顺利。但现在,如何确保它们不与另一组条目相邻?

地炼有一个功能ST_Union它可以统一几何形状,并且 ST_Disjoint它检测它们是否相交。所以看来我应该能够选择 state=1 的项目,将它们合并成一个几何图形,然后过滤我的原始查询(上面)以仅保留与其不相交的项目。但我找不到用地质炼金术来表达这一点的方法。这是我尝试过的一种方法:

session = DBSession()
taskgetter = session.query(Task).filter_by(state=0) \
.filter(Task.geometry.ST_Disjoint(session.query( \
Task.geometry.ST_Union()).filter_by(state=1)))
count = taskgetter.count()
if count != 0:
atask = taskgetter.offset(random.randint(0, count-1)).first()

它会产生如下错误:

ProgrammingError: (ProgrammingError) subquery in FROM must have an alias
LINE 3: FROM tasks, (SELECT ST_Union(tasks.geometry) AS "ST_Union_1"...
^
HINT: For example, FROM (SELECT ...) [AS] foo.
'SELECT count(*) AS count_1
FROM (SELECT tasks.id AS tasks_id
FROM tasks, (SELECT ST_Union(tasks.geometry) AS "ST_Union_1"
FROM tasks
WHERE tasks.state = %(state_1)s)
WHERE tasks.state = %(state_2)s AND ST_Disjoint(tasks.geometry, (SELECT ST_Union(tasks.geometry) AS "ST_Union_1"
FROM tasks
WHERE tasks.state = %(state_1)s))) AS anon_1' {'state_1': 1, 'state_2': 0}

最佳答案

在黑暗中拍摄,因为我没有测试它的设置:

这似乎与 SQLAlchemy 的子查询相关性比 GeoAlchemy 更多,尝试在子查询末尾添加 .subquery() 以生成别名(参见: http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#using-subqueries )

编辑:仍在使用链接教程中的信息,我认为这可能有效:

state1 = session.query(
Task.geometry.ST_Union().label('taskunion')
).filter_by(state=1).subquery()

taskgetter = session.query(Task)\
.filter_by(state=0)
.filter(Task.geometry.ST_Disjoint(state1.c.taskunion))

向您在子查询中创建的列添加标签,以在 super 查询中引用它。

关于python - 地理炼金术2 : find a set of Geometry items that doesn't intersect with a separate set,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22287328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com