【问题标题】:PostGIS finding all circles containing a specific point - how to define an indexPostGIS查找包含特定点的所有圆圈 - 如何定义索引
【发布时间】:2026-01-04 05:10:01
【问题描述】:

我想找到距离给定点不超过特定点距离的所有点。与普通的半径搜索一样,只有半径随每个点而变化(每个条目都使用点 + 半径围绕自身定义一个圆)。

我的问题是如何为这个问题定义一个索引(我现在使用的查询如下),以及是否可以使用非 GIS 和 GIS 字段创建索引(如下面的启用字段) .

我目前有这个工作查询

SELECT "Locations"."Name",
FROM public."Locations"
WHERE
    "Locations"."Enabled" = TRUE
    AND ST_DWithin(
        "Locations"."MyCoord"::geography,
        ST_SetSRID(ST_MakePoint(<Given Long>, <Given Lat>),4326)::geography,
        "Locations"."Radius");

如下表

Id: uuid
Name: text
Enabled: boolean
MyCoord: GEOGRAPHY(Point)
Radius: double precision

【问题讨论】:

    标签: postgresql gis postgis


    【解决方案1】:
    Create index some_name_idx on public."Locations" using gist("MyCoord")
    

    但是你有一个错误 - 没有这样的函数 ST_DWithin(geometry,geography,numeric) - 如果你的半径以米为单位,在这两种情况下都使用地理,所以你不需要转换(也在索引中)


    编辑:

    别担心 - 它会起作用的,我检查过了...作为证明,我有一个由 osm2pgsql 创建的带有索引的表 planet_osm_point:

    CREATE INDEX planet_osm_point_index
      ON planet_osm_point
      USING gist
      (way);
    

    我正在运行一个像你这样的查询:

    explain select * 
    from planet_osm_point 
    where st_dwithin(way,ST_geomfromtext('POINT(2219360.7 6457010.96)'),300)
    

    输出为here。 如您所见,正在使用空间索引...

    【讨论】:

    • 这是一个复制和粘贴错误,都是地理问题。但是,如果索引中根本没有使用半径,那么仅 MyCoord(即围绕它的圆的中心)上的索引如何加快搜索速度(AFAIK 至少需要一个边界框来加快搜索速度)。
    • 我在您的查询中看到的细微差别是您有一个静态距离要检查,但在我的查询中,距离和一个坐标都在查询表中。所以你的查询只有一个变量元素,而我的有两个。
    • 你检查了吗?这个元素也是我在做索引后想出来的一个变量……没有区别。如您所见,索引定义中没有 300...