2017-02-21 6 views
1

Я хочу найти все точки, которые находятся не дальше, чем расстояние, определенное точками от заданной точки. Как и для поиска по нормальному радиусу, только радиус является переменным с каждой точкой (каждая запись определяет круг вокруг себя, используя радиус точки +).PostGIS, находя все круги, содержащие определенную точку - как определить индекс

Вопрос, который у меня есть, заключается в том, как определить индекс для этой проблемы (запрос, который я использую в данный момент ниже), также, если можно создать индекс, используя поля не ГИС и ГИС (например, поле «Включить» ниже).

я в настоящее время этот рабочий запрос для него

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 

ответ

1
Create index some_name_idx on public."Locations" using gist("MyCoord") 

Но у вас есть ошибка - нет такой функции ST_DWithin (геометрия, география, число) - если у вас есть радиус в метрах, используйте географию в обоих случаях, поэтому вам не нужна конверсия (также в индексе)


EDIT:

Не волнуйтесь - он будет работать, я проверил это ... как доказательство, у меня есть таблица planet_osm_point, созданный osm2pgsql с индексом:

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 Выход. Как вы видите, используется пространственный индекс ...

+0

Это была ошибка копирования и вставки как в географии. Но как индекс только на MyCoord (который является центром круга вокруг него) ускоряет поиск, если радиус вообще не используется в индексе (для ускорения поиска необходим AFAIK, по крайней мере, ограничивающий прямоугольник). – Fionn

+0

Тонкая разница, которую я вижу в вашем запросе, состоит в том, что у вас есть статическое расстояние для проверки, но в моем запросе расстояние и одна координата находятся в запрошенной таблице. Таким образом, ваш запрос имеет только один элемент переменной, а у меня два. – Fionn

+0

Вы проверили его? Этот элемент также является переменной, которую я придумал после того, как был сделан указатель ... Нет никакой разницы. Как вы видите, в определении индекса нет 300 ... – Jendrusk

Смежные вопросы