Wywoływanie ST_Transform w geometrii, która jest już w podsystemie docelowym?

11

Piszę funkcję, która ma geometrię jako parametr, który może być w różnych rzutach:

CREATE OR REPLACE FUNCTION foo(in geometry) RETURNS boolean AS $$
DECLARE
    transformed_geom geometry := in;
BEGIN
    IF ST_SRID(transformed_geom) != 32737 THEN
        transformed_geom := ST_Transform(transformed_geom, 32737);
    END IF;
    [ ... ]
END;
$$ language plpgsql;

Funkcja wymaga geometrii w konkretnym rzucie (32737), ale nie chcę zobowiązać osoby wywołującej do dokonania transformacji, wolę obsłużyć ją wewnątrz funkcji.

Pytanie polega na tym, że zamiast sprawdzania faktycznego srida, zawsze można bezpiecznie wywołać ST_Transform ? Czy zrobisz coś, jeśli geometria jest już w rzucie docelowym?

Sprawdzam za pomocą takiego zapytania, czy wydaje się bezpieczne, ale będzie niesamowite, jeśli ktoś może to potwierdzić, ponieważ nie widziałem tego w dokumentacji.

SELECT ST_AsEWKT(geom), ST_AsEWKT(ST_Transform(geom, 32737)) FROM table_in_32737;
Francisco Puga
źródło

Odpowiedzi:

12

Funkcja sprawdza, czy jest to samo wejście i wyjście, a jeśli tak, zwraca nietknięty, ponieważ kod źródłowy pokazuje :

/*
* If input SRID and output SRID are equal, return geometry
* without transform it
*/
if ( input_srid == output_srid )
    PG_RETURN_POINTER(PG_GETARG_DATUM(0));
Nicklas Avén
źródło
Dzięki za link do kodu źródłowego. To unikalne źródło prawdy.
Francisco Puga