27 lines
682 B
PL/PgSQL
27 lines
682 B
PL/PgSQL
-- Great circle point-to-point routes, based on:
|
|
-- http://blog.cartodb.com/jets-and-datelines/
|
|
--
|
|
CREATE OR REPLACE FUNCTION CDB_GreatCircle(start_point geometry, end_point geometry, max_segment_length NUMERIC DEFAULT 100000)
|
|
RETURNS geometry AS $$
|
|
DECLARE
|
|
line geometry;
|
|
BEGIN
|
|
line = ST_Segmentize(
|
|
ST_Makeline(
|
|
start_point,
|
|
end_point
|
|
)::geography,
|
|
max_segment_length
|
|
)::geometry;
|
|
|
|
IF ST_XMax(line) - ST_XMin(line) > 180 THEN
|
|
line = ST_Difference(
|
|
ST_ShiftLongitude(line),
|
|
ST_Buffer(ST_GeomFromText('LINESTRING(180 90, 180 -90)', 4326), 0.00001)
|
|
);
|
|
END IF;
|
|
RETURN line;
|
|
END;
|
|
$$
|
|
LANGUAGE 'plpgsql' IMMUTABLE STRICT PARALLEL SAFE;
|