当前位置: 首页 > 知识库问答 >
问题:

地理方案2

邴景山
2023-03-14

我想运行一个查询,返回矩形内的每个点,其中点和矩形基于真实世界的经度和纬度。

这是失败的查询:

results = session.query(Store.id).filter(func.ST_Within(Store.location, func.ST_GeomFromEWKT('SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))')))

它毫无怨言地运行,但是当调用results.first()时,我看到以下错误和警告:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) 函数st_within(地理、几何)不存在 第 3 行:WHERE ST_Within(store.location, ST_GeomFromEWKT('SRID=4326;P... ^ 提示:没有函数与给定的名称和参数类型匹配。可能需要添加显式类型强制转换。[SQL: '选择 store.id 作为store_id\n从存储 \nWHERE ST_Within(store.location, ST_GeomFromEWKT(%(ST_GeomFromEWKT_1)s )) \n LIMIT %(param_1)s'][参数: {'ST_GeomFromEWKT_1': 'SRID=4326;多边形((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))', 'param_1': 1}]

但是,我可以通过在查询中创建一个虚拟点(这会使每个商店都匹配)来实现查询:

results = session.query(Store.id).filter(func.ST_Within(func.ST_GeomFromEWKT('SRID=4326;POINT(151 -32)'), func.ST_GeomFromEWKT('SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))')))

这表明问题出在我的Store.location字段上,但是我尝试过的所有方法都不起作用。

这是我对位置列的SQLAlchey定义:

location = Column(Geography(geometry_type='POINT', srid=4326))

这是我用来转经度的代码

stores = session.query(Store)
for store in stores:
    store.location = 'SRID=4326;POINT({} {})'.format(store.longitude, store.latitude)
session.commit()

Python告诉我Store.location的类型是“geoalchemy 2 . elements . WKB element”,这正是我从文档中所期望的。

请问有人对如何解决这个问题有什么建议吗?

仅供参考,我正在运行:

  • PostgreSQL 9.6.1
  • psycopg2 2.6.2
  • SQLAlchemy 1.1.4和
  • 地球化学2 0.4.0

共有2个答案

竺和洽
2023-03-14

如果你愿意的话

返回矩形内的每个点,其中点和矩形基于真实世界的经度和纬度

使用geography数据类型,可以使用ST_Interacts和ST_Covers,因为它们支持geography数据类型并提供更准确的结果。

PostGIS文档:“地理上的函数(面积、距离、长度、交叉点等)是使用球体上的弧来计算的。通过考虑世界的球体形状,这些函数提供了更精确的结果。”

另一方面,它们“需要更多的CPU时间来执行”[1]

有一个PostGIS地理支持函数的列表

冷英博
2023-03-14

感谢其他地方(迈克·拜耳和格雷格·贝克)的帮助,我可以发布答案。

问题是:

  1. 我的观点是地理类型,我的多边形是几何类型,
  2. 许多其他PostGIS功能,包括ST_Within,不支持地理(即它们只支持几何)。

答案是在查询中将“地理”转换为“几何”。以下查询有效:

results = session.query(Store.id).filter(func.ST_Within(cast(Store.location, Geometry), func.ST_GeomFromEWKT('SRID=4326;POLYGON((150 -33, 152 -33, 152 -31, 150 -31, 150 -33))')))
 类似资料:
  • 1. 区块链技术的痛点 以下以区块链应用的主要平台以太坊为例,表述现有区块链技术的缺陷和痛点。 1.1 处理能力很低,可扩展性比较差 以太坊目前能够支持的TPS非常有限,大概15-30 TPS。所有的节点都处理同样的智能合约,而且所有合约的状态都记录到公共的区块链账本中。这样的系统难以支持成千上万的DAPP的调用和状态存储,一两个受欢迎的应用就可以把以太坊堵死。 1.2 以太坊不是为DAPP所设计

  • 问题内容: 我正在寻找可以在不具有本机支持的浏览器上模拟的javascript库和代码。 基本上,我想对我的网站进行编码以用于存储数据,并且知道它仍然可以在本身不支持它的浏览器上运行。这意味着库将检测是否存在,并在存在时使用它。如果不存在,那么它将通过在名称空间中创建自己的实现来创建某种本地存储的后备方法。 到目前为止,我已经找到了以下解决方案: 简单的sessionStorage实现。 使用co

  • 之前提到的都是 Elasticsearch 的 sites 类型插件,其实质是实时从浏览器读取 cluster stats 接口数据并渲染页面。这种方式直观,但不适合生产环境的自动化监控和报警处理。要达到这个目标,还是需要使用诸如 nagios、zabbix、ganglia、collectd 这类监控系统。 本节以 zabbix 为例,介绍如何使用监控系统完成 Elasticsearch 的监控报

  • 如果有一种方法来创建未提交的事务,甚至有一种方法在之后执行这些事务,那么不同的组织可以将事务建议作为输入来执行验证。在足够多的组织验证后,他们可以执行交易以将其提交到区块链。

  • 嗯,在这个问题上我可能是错的,但是我需要你的宝贵意见/建议来站在正确的道路上。 我想知道在和中处理事务管理的好的、更好的、最好的方法,以及每种方法的优缺点。 我知道的一些方案/方法也是如此: 1) 使用AOP注释的Spring事务管理(,,带有诸如,,等建议)。 问题1:我之前用SpringAOP做了一个日志示例,但我不知道如何在事务管理中做同样的事情。事务是否会在该方面类中启动、回滚和提交,并提

  • 在维基百科中,背包的算法如下: 我在网上找到的所有例子的结构都是一样的<我无法理解的是,这段代码是如何考虑到最大值可能来自较小的背包这一事实的?E、 如果背包容量为8,那么最大值可能来自容量7(8-1)<我找不到任何逻辑来考虑最大值可能来自较小的背包。这是错误的想法吗?