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

参数化 postgis 几何查询

汪皓
2023-03-14

我正在尝试查询一组多边形(在运行时传入)中的任何一个是否与存储在数据库中“enclosing_polygons”字段中的一组多边形相交,这是一个 MultiPolygonField。

下面是查询的示例:

select * from my_table where field1 = any (?) and field2 = any (?) and (
ST_Intersects(ST_GeometryFromText('POLYGON((? ?, ? ?, ? ?, ? ?, ? ?))'), enclosing_polygons) or
ST_Intersects(ST_GeometryFromText('POLYGON((? ?, ? ?, ? ?, ? ?, ? ?))'), enclosing_polygons)) 
and detection_type = 0 order by confidence desc limit 2000

这个查询可以很好地处理硬编码的值,但是当我试图参数化它时,Postgres似乎不能识别?当我试图填充多边形点时,将它们作为参数。

当我设置前两个参数(针对field1和field2)时,这些JDBC语句成功:

statement.setArray(1, array1)
statement.setArray(2, array2)

但是,如果我尝试设置前两个参数之外的任何参数,它们都会失败。此语句:

statement.set双(3, point 1x)

失败并出现以下错误:

The column index is out of range: 3, number of columns: 2.

为什么Postgres不能识别这些?POLYGON构造函数中的s作为查询参数?

我如何能使这工作?

共有1个答案

慕容兴贤
2023-03-14

实现< code >取决于您的驱动程序。占位符,PostgreSQL不会看到它们。在您的驱动程序中,像在几乎所有的驱动程序中一样,单引号中出现的问号只是字面上的问号,而不是占位符。

您可能需要自己构造POLYGON((…))字符串,然后将整个字符串作为单个占位符传递到查询中。因此查询的这一部分看起来像ST_Intersects(ST_GeometryFromText(?),enclosing_polygons)

有替代方案,但它们大多只是移动问题而不直接解决问题。如果你真的想只使用普通问号,每个问号绑定到一个数字,你可以用类似的东西替换ST_GeometryFromText函数:

st_makepolygon(st_makeline(array[st_makepoint(?,?),st_makepoint(?,?),st_makepoint(?,?),st_makepoint(?,?),st_makepoint(?,?)]))
 类似资料:
  • 生成由参数表示其表面的几何体。// iOS iframe auto-resize workaround if ( /(iPad|iPhone|iPod)/g.test( navigator.userAgent ) ) { const scene = document.getElementById( 'scene' ); scene.style.width = getComputedStyle( s

  • 我是PostgreSQL和PostGIS的新手,但这个问题并不简单。我使用PostgreSQL 9.5和PostGIS 2.2。 我需要运行一些需要大量时间的查询。 首先,让我用非GIS术语来解释这个问题: 基本上,我有一组数十万个点,分布在大约五十万平方公里的领土上(国家)。在这个领土上,我有大约十几组来自各种数据库的区域。在每组中,我都有几百到几千个区域。我想找出这些领域中的哪些点。 现在,我

  • POSTGIS=“2.5.4” [扩展] PGSQL=“120” GEOS=“3.8.1-CAPI-1.13.3” PROJ=“Rel. 6.3.2, May 1st, 2020” GDAL=“GDAL 3.0.4, 2020/01/28 发布” LIBXML=“2.9.7” LIBJSON=“0.13.1” LIBPROTOBUF=“1.3.0” RASTER Java Postgis Depe

  • 数据源是具有PostGIS几何类型的PostgreSQL数据库。我可以使用包直接从SQL查询我想要的数据到data.frame。 由于 R 抱怨原始几何类型,因此我在 SQL 查询中对几何使用 以便将它们作为类型存储在 中。我有三种类型:、和。请注意,我的数据是几何(例如,笛卡尔x,y,z坐标),而不是地图投影的地理。 制作MWE有点困难,因为我必须用换行符分隔每个LINESTRING和POLYG

  • 问题内容: 我很难使用MySQLdb模块将信息插入到我的数据库中。我需要在表中插入6个变量。 有人可以帮我这里的语法吗? 问题答案: 提防对SQL查询使用字符串插值,因为它不能正确地转义输入参数,并使您的应用程序容易受到SQL注入漏洞的影响。 这种差异看似微不足道,但实际上它是巨大的 。 不正确(存在安全问题) 正确(带有转义符) 这增加了混乱,即用于绑定SQL语句中的参数的修饰符在不同的DB A

  • 问题内容: 我有一个查询,我试图填充我要参数化的CFChart: 这是我尝试过的: 当我将查询更改为此时,它将以某种方式破坏CFChart。屏幕上没有出现任何CFError,但是我的CFChart为空白。 我在查询中将其范围缩小到与此相关: 当我删除查询的此参数化部分并放入 有用。 谁能对此有所启发? 问题答案: 屏幕上没有出现任何CFError,但是我的CFChart为空白。 暂时忽略正确的方法