2015-05-07 2 views
0

Какой тип данных должен быть переменной, содержащей ST_SRID? У меня есть функция следующим образом и нужно использовать выражение типа srid: = ST_SetSRID (ST_MakePoint (start_long, start_lat), 4326) ;. Каким должен быть тип данных 'srid'? Я проверил с целыми, точки и т.д.ST_SRID тип данных в Postgres

create function ATest3(start_lat double precision, start_long double precision) returns setof int as $$ 
declare 
    r record; 
    srid ????????????????????????????? 
begin 
    srid := ST_SetSRID(ST_MakePoint(start_long, start_lat), 4326); 

    for r in select DISTINCT journey_id, ST_DWithin(srid, geom, 2/111.325), break_id from journey_break_points loop 
    return next r.break_id; 
    end loop; 
    return; 
end; 
$$ language plpgsql; 

ответ

0

Из documentation, st_setsrid возвращает тип geometry.

Сводка

геометрия ST_SetSRID (геометрия геая, целое число SRID);

Описание

Устанавливает SRID по геометрии к определенному целому значению. Полезно в построении ограничивающих прямоугольников для запросов.

Итак, ваша линия:

srid := ST_SetSRID(ST_MakePoint(start_long, start_lat),4326); 

является присвоение geometry переменной SRID в пространственной системе отсчета 4326.

Существует функция st_srid, но что делает что-то другое:

Сводка по оцифровке

целое число ST_SRID (геометрия g1);

Описание

Возвращает идентификатор пространственной ссылки для ST_Geometry как , определенный в таблице spatial_ref_sys. Раздел 4.3.1, «О SPATIAL_REF_SYS Таблицы и пространственные системы отсчета»

Если вы используете только переменный в этом одном заявлении я был бы соблазн не возиться с переменным и просто положить заявление в выбранном запросе. Если вы хотите придерживаться переменной, я бы предложил использовать другое имя (например, «startpoint_geometry»), потому что «srid» означает что-то конкретное в PostGIS, и позже вы рискуете путаницей ...

1

Когда вы делаете point в PostGIS - или любую другую геометрию в этом отношении - он возвращает geometry. Таким образом, это тип переменной.

create function ATest3(start_lat double precision, start_long double precision) returns setof int as $$ 
declare 
    r record; 
    pnt geometry; 
begin 
    pnt := ST_SetSRID(ST_MakePoint(start_long, start_lat), 4326); 

    for r in select distinct journey_id, ST_DWithin(pnt, geom, 2/111.325), break_id 
      from journey_break_points 
    loop 
     return next r.break_id; 
    end loop; 
    return; 
end; 
$$ language plpgsql; 

Но вы можете значительно упростить и ускорить весь этот процесс с помощью простой хранимой функции SQL:

create function ATest4(start_lat double precision, start_long double precision) returns setof int as $$ 
    select break_id 
    from journey_break_points 
    where ST_DWithin(ST_SetSRID(ST_MakePoint($2, $1), 4326), geom, 2/111.325); 
$$ language sql; 

В выше, оба ST_SetSRID() и ST_MakePoint() определяются как IMMUTABLE, поэтому данный постоянный входной они всегда дают одинаковый результат. Оптимизатор запросов оценивает функции на ($ 2, $ 1) только один раз и использует это для всех строк таблицы в расчете ST_DWithin() со столбцом geom.

+0

Как это ускорится, как во втором выражении? ST_SetSRID (ST_MakePoint ($ 2, $ 1), 4326) должен быть рассчитан для каждой записи в таблице «travel_break_points». Я думал, что инициализация переменной уменьшает нагрузку на ST_DWithin. –

+0

ST_SetSRID (ST_MakePoint ($ 2, $ 1), 4326) фактически выполняется только один раз. PostgreSQL достаточно умен, чтобы оптимизировать это в один вызов. См. Обновленный ответ. – Patrick

+0

Спасибо за детали! –