gpt4 book ai didi

syntax - Postgis 中的 ST_Distance 和 'as'

转载 作者:行者123 更新时间:2023-12-01 04:13:23 25 4
gpt4 key购买 nike

我写了这个查询并且它有效,虽然它有点慢:

SELECT name,
(ST_Distance( ST_Transform( way,900913 ),ST_Transform( ST_GeomFromText('POINT (-6.2222 53.307)',4326),900913 )))
FROM ga_osm_latlong_polygon
WHERE
( (ST_Distance( ST_Transform( way,900913 ),ST_Transform( ST_GeomFromText('POINT (-6.2222 53.307)',4326),900913 )))
<= 1000 )
ORDER BY
(ST_Distance( ST_Transform( way,900913 ),ST_Transform( ST_GeomFromText('POINT (-6.2222 53.307)',4326),900913 ))),
name

我正在尝试以更优雅的方式重写它,使用“as”:
SELECT name,
(ST_Distance( ST_Transform( way,900913 ),ST_Transform( ST_GeomFromText('POINT (-6.2222 53.307)',4326),900913 ))) AS d
FROM ga_osm_latlong_polygon
WHERE ( d <= 1000 )
ORDER BY d, name

不幸的是,我得到:
错误:列“d”不存在

知道我在这里出了什么问题吗?

谢谢!

最佳答案

你好穆隆

关于你的别名问题,Luther 是对的。

关于查询缓慢有两个原因。

首先,你正在改变每一点,这需要时间

其次,可能更重要的是,您应该将 ST_Dwithin 与空间索引一起使用,而不是在 where 子句中使用距离。

ST_Dwithin 使用空间索引对大量计算进行分类。

但是,将您的数据投影到这些计算中会给您提供非常不准确的答案。为什么不改用 geography 函数。

尝试:

SELECT d, name
(
SELECT ST_Distance(a.way,b.geom) as d, a.name from
(SELECT way::geography, name from ga_osm_latlong_polygon) a,
(SELECT 'POINT(-6.2222 53.307)'::geography as geom) b
where ST_DWithin(a.way, b.geom, 1000)
) c
order by d, name;

但我想我会写得更简单:
  SELECT ST_Distance(a.way,b.geom) as d, a.name from 
(SELECT way::geography, name from ga_osm_latlong_polygon) a,
(SELECT 'POINT(-6.2222 53.307)'::geography as geom) b
where ST_DWithin(a.way, b.geom, 1000)
order by ST_Distance(a.way,b.geom), name;

但是第一个版本可能更快,因为避免 ST_Distance 运行两次。

但是为了让这个工作正常,你当然需要空间索引
现在,当我写它时,我意识到对地理的转换可能是索引的一个亮点。如果是这样,我建议您改为创建地理列并在其上建立适当的索引。工作索引在这里就像白天和黑夜一样不同。

更新:
或者,您可以直接使用地理类型创建索引。我没有尝试过,但可能值得尝试:像这样:
Create index idx_polygon_geog
on ga_osm_latlong_polygon
using gist(way::geography);

HTH

尼克拉斯

关于syntax - Postgis 中的 ST_Distance 和 'as',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4878139/

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