Postgresql PostGIS查找包含特定点的所有圆-如何定义索引
我想找到所有距离给定点不超过点特定距离的点。与普通半径搜索一样,每个点的半径都是可变的(每个条目使用点+半径定义一个围绕自身的圆) 我的问题是如何为这个问题定义索引(我目前使用的查询如下),以及是否可以使用非GIS和GIS字段(如下面的启用字段)创建索引 我目前有这个工作查询Postgresql PostGIS查找包含特定点的所有圆-如何定义索引,postgresql,gis,postgis,Postgresql,Gis,Postgis,我想找到所有距离给定点不超过点特定距离的点。与普通半径搜索一样,每个点的半径都是可变的(每个条目使用点+半径定义一个围绕自身的圆) 我的问题是如何为这个问题定义索引(我目前使用的查询如下),以及是否可以使用非GIS和GIS字段(如下面的启用字段)创建索引 我目前有这个工作查询 SELECT "Locations"."Name", FROM public."Locations" WHERE "Locations"."Enabled" = TRUE AND ST_DWithin(
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");
但是您有一个BUG-没有这样的函数ST_DWithin(几何、地理、数字)-如果您有以米为单位的半径,则在这两种情况下都使用地理,因此不需要转换(也在索引中)
编辑: 别担心,会有用的,我检查过了。。。作为证明,我有一个由osm2pgsql创建的表planet_osm_点,索引为:
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)
输出为。
正如您看到的,正在使用空间索引…这是一个复制和粘贴错误,两者都是地理错误。但是,如果索引中根本没有使用半径(至少需要一个边界框来加快搜索速度),那么仅MyOrd上的索引(它是围绕它的圆的中心)如何加快搜索速度呢,但是在我的查询中,距离和一个坐标都在查询的表中。所以你的查询只有一个变量元素,而我的查询有两个。你检查过了吗?这个元素也是我在编制索引后想到的一个变量。。。没有区别。正如您看到的,索引定义中没有300。。。
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)