目前,我有这个查询
SELECT "Id"
FROM "Point"
WHERE ST_Distance(ST_SetSRID(ST_Point("Longitude", "Latitude"), 4326)::geography,
ST_SetSRID(ST_Point(@longitudeOfA, @latitudeOfA), 4326)::geography) <= @MaxDistance
LIMIT 1
如您所见,我不会将空间数据保留在我的点表中,而是在具有纬度和经度列的查询选择语句 (ST_Point( 上创建空间数据。
此查询的目的是检查半径@MaxDistance是否至少有一个点。
恐怕在执行此选择查询时,我在每条记录上都创建了ST_Point。
至少知道记录不多,所以性能就足够了,但是由于每条记录上的ST_Pin创建,恐怕在点记录很多的时候会变得非常昂贵。
由于某些限制,我无法在点表上创建空间数据。
对于大量点,此查询无法有效。不是因为它必须创建地理,而是因为它不使用空间索引st_distance
。
我会亲自创建一个几何或地理,因为它可以很容易地使用它们(PostGIS 函数(。
重要的是空间索引。在本例中,如果没有几何/地理列,您将创建一个函数索引
create index spatialIDX on mytable using gist(ST_SetSRID(ST_Point("Longitude", "Latitude"), 4326)::geography);
然后将查询更改为使用ST_DWithin
,这会使用索引。
不要忘记按距离排序,否则您会在所需距离内获得一个随机点。(请注意,<>运算符使用索引,但它必须在几何字段而不是地理字段上创建。您不妨依赖排序子句中的st_distance。如果你有小点要订购,任何一个都可以。否则,在几何上创建一个索引(
SELECT "Id"
FROM "Point"
WHERE ST_DWithin(ST_SetSRID(ST_Point("Longitude", "Latitude"), 4326)::geography,
ST_SetSRID(ST_Point(@longitudeOfA, @latitudeOfA), 4326)::geography,
@MaxDistance)
ORDER BY ST_SetSRID(ST_Point("Longitude", "Latitude"), 4326) <-> ST_SetSRID(ST_Point(@longitudeOfA, @latitudeOfA), 4326)
LIMIT 1;