CREATE FUNCTION GET_DISTANCE
(alat FLOAT, alon FLOAT, lat FLOAT, lon FLOAT)
RETURNS FLOAT AS
$$
DECLARE
radius_earth FLOAT;
radian_lat FLOAT;
radian_lon FLOAT;
distance_v FLOAT;
distance_h FLOAT;
distance FLOAT;
BEGIN
-- Insert earth radius
SELECT INTO radius_earth 6378.137;
-- Calculate difference between lat and alat
SELECT INTO radian_lat radians(lat - alat);
-- Calculate difference between lon and alon
SELECT INTO radian_lon radians(lon - alon);
-- Calculate vertical distance
SELECT INTO distance_v (radius_earth * radian_lat);
-- Calculate horizontal distance
SELECT INTO distance_h (cos(radians(alat)) * radius_earth * radian_lon);
-- Calculate distance(km) and convert it to distance(meter)
SELECT INTO distance sqrt(pow(distance_h,2) + pow(distance_v,2)) * 1000;
-- Returns distance
RETURN DISTANCE;
END;
$$ language plpgsql;
> createlang plpgsql mytestdb
> psql -d mytestdb
mytestdb=# CREATE FUNCTION GET_DISTANCE
mytestdb-# (alat FLOAT, alon FLOAT, lat FLOAT, lon FLOAT)
mytestdb-# RETURNS FLOAT AS
mytestdb-# $$
mytestdb$# DECLARE
mytestdb$# radius_earth FLOAT;
mytestdb$# radian_lat FLOAT;
mytestdb$# radian_lon FLOAT;
mytestdb$# distance_v FLOAT;
mytestdb$# distance_h FLOAT;
mytestdb$# distance FLOAT;
mytestdb$# BEGIN
mytestdb$# -- Insert earth radius
mytestdb$# SELECT INTO radius_earth 6378.137;
mytestdb$#
mytestdb$# -- Calculate difference between lat and alat
mytestdb$# SELECT INTO radian_lat radians(lat - alat);
mytestdb$#
mytestdb$# -- Calculate difference between lon and alon
mytestdb$# SELECT INTO radian_lon radians(lon - alon);
mytestdb$#
mytestdb$# -- Calculate vertical distance
mytestdb$# SELECT INTO distance_v (radius_earth * radian_lat);
mytestdb$#
mytestdb$# -- Calculate horizontal distance
mytestdb$# SELECT INTO distance_h (cos(radians(alat)) * radius_earth * radian_lon);
mytestdb$#
mytestdb$# -- Calculate distance(km) and convert it to distance(meter)
mytestdb$# SELECT INTO distance sqrt(pow(distance_h,2) + pow(distance_v,2)) * 1000;
mytestdb$#
mytestdb$# -- Returns distance
mytestdb$# RETURN DISTANCE;
mytestdb$# END;
mytestdb$# $$ language plpgsql;
CREATE FUNCTION
mytestdb=# select GET_DISTANCE(34.701909, 135.4949770, 35.681382, 139.766084);
get_distance
------------------
405807.810663345
(1 行)
No comments:
Post a Comment