Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql ST_Covers:地理实现不起作用,几何体实现耗时太长_Postgresql_Postgis - Fatal编程技术网

Postgresql ST_Covers:地理实现不起作用,几何体实现耗时太长

Postgresql ST_Covers:地理实现不起作用,几何体实现耗时太长,postgresql,postgis,Postgresql,Postgis,我有一个查询:(此查询使用ST_Covers函数的地理实现) 运行此查询时,应返回true,但返回false。我不知道PostGIS(或此查询)有什么问题 当我将地理实现更改为几何实现时,将查询重新安排为如下所示: SELECT ST_Covers(ST_ASTEXT(ST_GeoGraphyFromText('MULTIPOLYGON(((179 -89,179 89,-179 89,-179 -89,179 -89)))')),text('POINT(20 30)')); 它正常工作,返回

我有一个查询:(此查询使用ST_Covers函数的地理实现)

运行此查询时,应返回true,但返回false。我不知道PostGIS(或此查询)有什么问题

当我将地理实现更改为几何实现时,将查询重新安排为如下所示:

SELECT ST_Covers(ST_ASTEXT(ST_GeoGraphyFromText('MULTIPOLYGON(((179 -89,179 89,-179 89,-179 -89,179 -89)))')),text('POINT(20 30)'));
它正常工作,返回true:

SELECT ST_Covers(ST_ASTEXT(ST_GeoGraphyFromText('MULTIPOLYGON(((179 -89,179 89,-179 89,-179 -89,179 -89)))')),text('POINT(20 30)'));
我可以使用下面的查询作为内容,但问题是当数据库太大时,需要花费太多时间

有人能告诉我吗

如何使查询1正常工作(如预期,返回true),或

如何使查询2快速处理大型表

(请不要建议我删除*ST_GeoGraphyFromText(((179-8917989,-17989,-179-89179-89)*,因为它只表示将由表列中的数据替换的地理数据)


查询1不起作用的其他值有(5 5)(10 10 10)(-10-10)和更多值

第一个查询失败,因为您使用的是宽度大于180°的
地理类型。如果是更实际的值,例如
“多多边形((100 0100 50,0 50,0 0100))”
,则返回TRUE

没有直接的方法可以找到多边形地理类型的外环的最大直径,但您可以尝试使用以下方法查找这些特定情况:

SELECT ST_XMax(geog::geometry) - ST_XMin(geog::geometry) AS width,
       ST_YMax(geog::geometry) - ST_YMin(geog::geometry) AS height
FROM polygons
检查>180的部分,查看每个部分是否也>180。如果是,则应视为无效地理位置


第二个查询返回TRUE的唯一原因是ST_AsText转换为WKT,然后将WKT重新解释回WKB作为
几何体
类型(并隐式调用
ST_覆盖(几何体,几何体)
,而不是
ST_覆盖(地理,地理)
)。此查询速度较慢,因为它从WKB转换为WKT再转换为WKB,在转换之间可能会丢失精度。此查询的更快版本是使用
::geometry
,将地理列强制转换为几何体,例如:

SELECT ST_Covers(geog::geometry, ST_SetSRID(ST_MakePoint(20, 30), 4326))
FROM polygons

几何类型对ST_封面使用简单的“平地”笛卡尔逻辑,这就是为什么您看到了预期的结果。地理类型使用不同的“圆形地球”logic,它使用更复杂的球形逻辑,但很容易看到您是否有一个球形逻辑。

在数据库中运行查询时效果很好,谢谢。但是当我将其保存在.sql文件中以从代码基提供点访问它作为参数时,它会出现错误,说明“未设置所有命名参数:[:几何体]”。我如何解决这个问题?不确定我是否理解您的意思,也许可以编辑上面的问题。也许可以使用
::geometry
显式转换所有参数?我的查询是:从geotager.geo_fenced_事件中选择*,其中ST_ASTEXT(area)&&text(:point)和ST_覆盖(area::geometry,ST_setrid(:point,4326))按创建日期排序,并已将其保存在sql文件中。我使用以下代码访问此查询:sessionFactory.getCurrentSession().createSQLQuery(“sql文件的位置”).addEntity(Entity.class)。执行查询时的setString(string,string)错误是:未设置所有命名参数:[:几何体]希望你现在理解了这个问题。这是一个简单的铸造问题,由铸造(面积为几何体)解决。谢谢