mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-30 15:57:19 +02:00
Affected test queries have been testing the wrong thing since their
introduction in commit 4c1383efd1
.
Back-patch to 9.3 (all supported versions).
1099 lines
27 KiB
Plaintext
1099 lines
27 KiB
Plaintext
--
|
|
-- Test earthdistance extension
|
|
--
|
|
-- In this file we also do some testing of extension create/drop scenarios.
|
|
-- That's really exercising the core database's dependency logic, so ideally
|
|
-- we'd do it in the core regression tests, but we can't for lack of suitable
|
|
-- guaranteed-available extensions. earthdistance is a good test case because
|
|
-- it has a dependency on the cube extension.
|
|
--
|
|
CREATE EXTENSION earthdistance; -- fail, must install cube first
|
|
ERROR: required extension "cube" is not installed
|
|
HINT: Use CREATE EXTENSION ... CASCADE to install required extensions too.
|
|
CREATE EXTENSION cube;
|
|
CREATE EXTENSION earthdistance;
|
|
--
|
|
-- The radius of the Earth we are using.
|
|
--
|
|
SELECT earth()::numeric(20,5);
|
|
earth
|
|
---------------
|
|
6378168.00000
|
|
(1 row)
|
|
|
|
--
|
|
-- Convert straight line distances to great circle distances.
|
|
--
|
|
SELECT (pi()*earth())::numeric(20,5);
|
|
numeric
|
|
----------------
|
|
20037605.73216
|
|
(1 row)
|
|
|
|
SELECT sec_to_gc(0)::numeric(20,5);
|
|
sec_to_gc
|
|
-----------
|
|
0.00000
|
|
(1 row)
|
|
|
|
SELECT sec_to_gc(2*earth())::numeric(20,5);
|
|
sec_to_gc
|
|
----------------
|
|
20037605.73216
|
|
(1 row)
|
|
|
|
SELECT sec_to_gc(10*earth())::numeric(20,5);
|
|
sec_to_gc
|
|
----------------
|
|
20037605.73216
|
|
(1 row)
|
|
|
|
SELECT sec_to_gc(-earth())::numeric(20,5);
|
|
sec_to_gc
|
|
-----------
|
|
0.00000
|
|
(1 row)
|
|
|
|
SELECT sec_to_gc(1000)::numeric(20,5);
|
|
sec_to_gc
|
|
------------
|
|
1000.00000
|
|
(1 row)
|
|
|
|
SELECT sec_to_gc(10000)::numeric(20,5);
|
|
sec_to_gc
|
|
-------------
|
|
10000.00102
|
|
(1 row)
|
|
|
|
SELECT sec_to_gc(100000)::numeric(20,5);
|
|
sec_to_gc
|
|
--------------
|
|
100001.02426
|
|
(1 row)
|
|
|
|
SELECT sec_to_gc(1000000)::numeric(20,5);
|
|
sec_to_gc
|
|
---------------
|
|
1001027.07131
|
|
(1 row)
|
|
|
|
--
|
|
-- Convert great circle distances to straight line distances.
|
|
--
|
|
SELECT gc_to_sec(0)::numeric(20,5);
|
|
gc_to_sec
|
|
-----------
|
|
0.00000
|
|
(1 row)
|
|
|
|
SELECT gc_to_sec(sec_to_gc(2*earth()))::numeric(20,5);
|
|
gc_to_sec
|
|
----------------
|
|
12756336.00000
|
|
(1 row)
|
|
|
|
SELECT gc_to_sec(10*earth())::numeric(20,5);
|
|
gc_to_sec
|
|
----------------
|
|
12756336.00000
|
|
(1 row)
|
|
|
|
SELECT gc_to_sec(pi()*earth())::numeric(20,5);
|
|
gc_to_sec
|
|
----------------
|
|
12756336.00000
|
|
(1 row)
|
|
|
|
SELECT gc_to_sec(-1000)::numeric(20,5);
|
|
gc_to_sec
|
|
-----------
|
|
0.00000
|
|
(1 row)
|
|
|
|
SELECT gc_to_sec(1000)::numeric(20,5);
|
|
gc_to_sec
|
|
------------
|
|
1000.00000
|
|
(1 row)
|
|
|
|
SELECT gc_to_sec(10000)::numeric(20,5);
|
|
gc_to_sec
|
|
------------
|
|
9999.99898
|
|
(1 row)
|
|
|
|
SELECT gc_to_sec(100000)::numeric(20,5);
|
|
gc_to_sec
|
|
-------------
|
|
99998.97577
|
|
(1 row)
|
|
|
|
SELECT gc_to_sec(1000000)::numeric(20,5);
|
|
gc_to_sec
|
|
--------------
|
|
998976.08618
|
|
(1 row)
|
|
|
|
--
|
|
-- Set coordinates using latitude and longitude.
|
|
-- Extract each coordinate separately so we can round them.
|
|
--
|
|
SELECT cube_ll_coord(ll_to_earth(0,0),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(0,0),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(0,0),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
---------------+---------------+---------------
|
|
6378168.00000 | 0.00000 | 0.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(360,360),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(360,360),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(360,360),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
---------------+---------------+---------------
|
|
6378168.00000 | 0.00000 | 0.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(180,180),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(180,180),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(180,180),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
---------------+---------------+---------------
|
|
6378168.00000 | 0.00000 | 0.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(180,360),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(180,360),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(180,360),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
----------------+---------------+---------------
|
|
-6378168.00000 | 0.00000 | 0.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(-180,-360),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(-180,-360),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(-180,-360),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
----------------+---------------+---------------
|
|
-6378168.00000 | 0.00000 | 0.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(0,180),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(0,180),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(0,180),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
----------------+---------------+---------------
|
|
-6378168.00000 | 0.00000 | 0.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(0,-180),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(0,-180),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(0,-180),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
----------------+---------------+---------------
|
|
-6378168.00000 | 0.00000 | 0.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(90,0),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(90,0),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(90,0),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
---------------+---------------+---------------
|
|
0.00000 | 0.00000 | 6378168.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(90,180),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(90,180),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(90,180),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
---------------+---------------+---------------
|
|
0.00000 | 0.00000 | 6378168.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(-90,0),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(-90,0),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(-90,0),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
---------------+---------------+----------------
|
|
0.00000 | 0.00000 | -6378168.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(ll_to_earth(-90,180),1)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(-90,180),2)::numeric(20,5),
|
|
cube_ll_coord(ll_to_earth(-90,180),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord
|
|
---------------+---------------+----------------
|
|
0.00000 | 0.00000 | -6378168.00000
|
|
(1 row)
|
|
|
|
--
|
|
-- Test getting the latitude of a location.
|
|
--
|
|
SELECT latitude(ll_to_earth(0,0))::numeric(20,10);
|
|
latitude
|
|
--------------
|
|
0.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(45,0))::numeric(20,10);
|
|
latitude
|
|
---------------
|
|
45.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(90,0))::numeric(20,10);
|
|
latitude
|
|
---------------
|
|
90.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(-45,0))::numeric(20,10);
|
|
latitude
|
|
----------------
|
|
-45.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(-90,0))::numeric(20,10);
|
|
latitude
|
|
----------------
|
|
-90.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(0,90))::numeric(20,10);
|
|
latitude
|
|
--------------
|
|
0.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(45,90))::numeric(20,10);
|
|
latitude
|
|
---------------
|
|
45.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(90,90))::numeric(20,10);
|
|
latitude
|
|
---------------
|
|
90.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(-45,90))::numeric(20,10);
|
|
latitude
|
|
----------------
|
|
-45.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(-90,90))::numeric(20,10);
|
|
latitude
|
|
----------------
|
|
-90.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(0,180))::numeric(20,10);
|
|
latitude
|
|
--------------
|
|
0.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(45,180))::numeric(20,10);
|
|
latitude
|
|
---------------
|
|
45.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(90,180))::numeric(20,10);
|
|
latitude
|
|
---------------
|
|
90.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(-45,180))::numeric(20,10);
|
|
latitude
|
|
----------------
|
|
-45.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(-90,180))::numeric(20,10);
|
|
latitude
|
|
----------------
|
|
-90.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(0,-90))::numeric(20,10);
|
|
latitude
|
|
--------------
|
|
0.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(45,-90))::numeric(20,10);
|
|
latitude
|
|
---------------
|
|
45.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(90,-90))::numeric(20,10);
|
|
latitude
|
|
---------------
|
|
90.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(-45,-90))::numeric(20,10);
|
|
latitude
|
|
----------------
|
|
-45.0000000000
|
|
(1 row)
|
|
|
|
SELECT latitude(ll_to_earth(-90,-90))::numeric(20,10);
|
|
latitude
|
|
----------------
|
|
-90.0000000000
|
|
(1 row)
|
|
|
|
--
|
|
-- Test getting the longitude of a location.
|
|
--
|
|
SELECT longitude(ll_to_earth(0,0))::numeric(20,10);
|
|
longitude
|
|
--------------
|
|
0.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(45,0))::numeric(20,10);
|
|
longitude
|
|
--------------
|
|
0.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(90,0))::numeric(20,10);
|
|
longitude
|
|
--------------
|
|
0.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(-45,0))::numeric(20,10);
|
|
longitude
|
|
--------------
|
|
0.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(-90,0))::numeric(20,10);
|
|
longitude
|
|
--------------
|
|
0.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(0,90))::numeric(20,10);
|
|
longitude
|
|
---------------
|
|
90.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(45,90))::numeric(20,10);
|
|
longitude
|
|
---------------
|
|
90.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(90,90))::numeric(20,10);
|
|
longitude
|
|
---------------
|
|
90.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(-45,90))::numeric(20,10);
|
|
longitude
|
|
---------------
|
|
90.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(-90,90))::numeric(20,10);
|
|
longitude
|
|
---------------
|
|
90.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(0,180))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
180.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(45,180))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
180.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(90,180))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
180.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(-45,180))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
180.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(-90,180))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
180.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(0,-90))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
-90.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(45,-90))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
-90.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(90,-90))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
-90.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(-45,-90))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
-90.0000000000
|
|
(1 row)
|
|
|
|
SELECT longitude(ll_to_earth(-90,-90))::numeric(20,10);
|
|
longitude
|
|
----------------
|
|
-90.0000000000
|
|
(1 row)
|
|
|
|
--
|
|
-- For the distance tests the following is some real life data.
|
|
--
|
|
-- Chicago has a latitude of 41.8 and a longitude of 87.6.
|
|
-- Albuquerque has a latitude of 35.1 and a longitude of 106.7.
|
|
-- (Note that latitude and longitude are specified differently
|
|
-- in the cube based functions than for the point based functions.)
|
|
--
|
|
--
|
|
-- Test getting the distance between two points using earth_distance.
|
|
--
|
|
SELECT earth_distance(ll_to_earth(0,0),ll_to_earth(0,0))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
0.00000
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(0,0),ll_to_earth(0,180))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
20037605.73216
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(0,0),ll_to_earth(90,0))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
10018802.86608
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(0,0),ll_to_earth(0,90))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
10018802.86608
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(0,0),ll_to_earth(0,1))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
111320.03185
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(0,0),ll_to_earth(1,0))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
111320.03185
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(30,0),ll_to_earth(30,1))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
96405.66962
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(30,0),ll_to_earth(31,0))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
111320.03185
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(60,0),ll_to_earth(60,1))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
55659.48608
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(60,0),ll_to_earth(61,0))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
111320.03185
|
|
(1 row)
|
|
|
|
SELECT earth_distance(ll_to_earth(41.8,87.6),ll_to_earth(35.1,106.7))::numeric(20,5);
|
|
earth_distance
|
|
----------------
|
|
1819303.21265
|
|
(1 row)
|
|
|
|
SELECT (earth_distance(ll_to_earth(41.8,87.6),ll_to_earth(35.1,106.7))*
|
|
100./2.54/12./5280.)::numeric(20,5);
|
|
numeric
|
|
------------
|
|
1130.46261
|
|
(1 row)
|
|
|
|
--
|
|
-- Test getting the distance between two points using geo_distance.
|
|
--
|
|
SELECT geo_distance('(0,0)'::point,'(0,0)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
0.00000
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(0,0)'::point,'(180,0)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
12436.77274
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(0,0)'::point,'(0,90)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
6218.38637
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(0,0)'::point,'(90,0)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
6218.38637
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(0,0)'::point,'(1,0)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
69.09318
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(0,0)'::point,'(0,1)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
69.09318
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(0,30)'::point,'(1,30)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
59.83626
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(0,30)'::point,'(0,31)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
69.09318
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(0,60)'::point,'(1,60)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
34.54626
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(0,60)'::point,'(0,61)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
69.09318
|
|
(1 row)
|
|
|
|
SELECT geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)::numeric(20,5);
|
|
geo_distance
|
|
--------------
|
|
1129.18983
|
|
(1 row)
|
|
|
|
SELECT (geo_distance('(87.6,41.8)'::point,'(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);
|
|
numeric
|
|
---------------
|
|
1817254.87730
|
|
(1 row)
|
|
|
|
--
|
|
-- Test getting the distance between two points using the <@> operator.
|
|
--
|
|
SELECT ('(0,0)'::point <@> '(0,0)'::point)::numeric(20,5);
|
|
numeric
|
|
---------
|
|
0.00000
|
|
(1 row)
|
|
|
|
SELECT ('(0,0)'::point <@> '(180,0)'::point)::numeric(20,5);
|
|
numeric
|
|
-------------
|
|
12436.77274
|
|
(1 row)
|
|
|
|
SELECT ('(0,0)'::point <@> '(0,90)'::point)::numeric(20,5);
|
|
numeric
|
|
------------
|
|
6218.38637
|
|
(1 row)
|
|
|
|
SELECT ('(0,0)'::point <@> '(90,0)'::point)::numeric(20,5);
|
|
numeric
|
|
------------
|
|
6218.38637
|
|
(1 row)
|
|
|
|
SELECT ('(0,0)'::point <@> '(1,0)'::point)::numeric(20,5);
|
|
numeric
|
|
----------
|
|
69.09318
|
|
(1 row)
|
|
|
|
SELECT ('(0,0)'::point <@> '(0,1)'::point)::numeric(20,5);
|
|
numeric
|
|
----------
|
|
69.09318
|
|
(1 row)
|
|
|
|
SELECT ('(0,30)'::point <@> '(1,30)'::point)::numeric(20,5);
|
|
numeric
|
|
----------
|
|
59.83626
|
|
(1 row)
|
|
|
|
SELECT ('(0,30)'::point <@> '(0,31)'::point)::numeric(20,5);
|
|
numeric
|
|
----------
|
|
69.09318
|
|
(1 row)
|
|
|
|
SELECT ('(0,60)'::point <@> '(1,60)'::point)::numeric(20,5);
|
|
numeric
|
|
----------
|
|
34.54626
|
|
(1 row)
|
|
|
|
SELECT ('(0,60)'::point <@> '(0,61)'::point)::numeric(20,5);
|
|
numeric
|
|
----------
|
|
69.09318
|
|
(1 row)
|
|
|
|
SELECT ('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)::numeric(20,5);
|
|
numeric
|
|
------------
|
|
1129.18983
|
|
(1 row)
|
|
|
|
SELECT (('(87.6,41.8)'::point <@> '(106.7,35.1)'::point)*5280.*12.*2.54/100.)::numeric(20,5);
|
|
numeric
|
|
---------------
|
|
1817254.87730
|
|
(1 row)
|
|
|
|
--
|
|
-- Test getting a bounding box around points.
|
|
--
|
|
SELECT cube_ll_coord(earth_box(ll_to_earth(0,0),112000),1)::numeric(20,5),
|
|
cube_ll_coord(earth_box(ll_to_earth(0,0),112000),2)::numeric(20,5),
|
|
cube_ll_coord(earth_box(ll_to_earth(0,0),112000),3)::numeric(20,5),
|
|
cube_ur_coord(earth_box(ll_to_earth(0,0),112000),1)::numeric(20,5),
|
|
cube_ur_coord(earth_box(ll_to_earth(0,0),112000),2)::numeric(20,5),
|
|
cube_ur_coord(earth_box(ll_to_earth(0,0),112000),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord | cube_ur_coord | cube_ur_coord | cube_ur_coord
|
|
---------------+---------------+---------------+---------------+---------------+---------------
|
|
6266169.43896 | -111998.56104 | -111998.56104 | 6490166.56104 | 111998.56104 | 111998.56104
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(earth_box(ll_to_earth(0,0),pi()*earth()),1)::numeric(20,5),
|
|
cube_ll_coord(earth_box(ll_to_earth(0,0),pi()*earth()),2)::numeric(20,5),
|
|
cube_ll_coord(earth_box(ll_to_earth(0,0),pi()*earth()),3)::numeric(20,5),
|
|
cube_ur_coord(earth_box(ll_to_earth(0,0),pi()*earth()),1)::numeric(20,5),
|
|
cube_ur_coord(earth_box(ll_to_earth(0,0),pi()*earth()),2)::numeric(20,5),
|
|
cube_ur_coord(earth_box(ll_to_earth(0,0),pi()*earth()),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord | cube_ur_coord | cube_ur_coord | cube_ur_coord
|
|
----------------+-----------------+-----------------+----------------+----------------+----------------
|
|
-6378168.00000 | -12756336.00000 | -12756336.00000 | 19134504.00000 | 12756336.00000 | 12756336.00000
|
|
(1 row)
|
|
|
|
SELECT cube_ll_coord(earth_box(ll_to_earth(0,0),10*earth()),1)::numeric(20,5),
|
|
cube_ll_coord(earth_box(ll_to_earth(0,0),10*earth()),2)::numeric(20,5),
|
|
cube_ll_coord(earth_box(ll_to_earth(0,0),10*earth()),3)::numeric(20,5),
|
|
cube_ur_coord(earth_box(ll_to_earth(0,0),10*earth()),1)::numeric(20,5),
|
|
cube_ur_coord(earth_box(ll_to_earth(0,0),10*earth()),2)::numeric(20,5),
|
|
cube_ur_coord(earth_box(ll_to_earth(0,0),10*earth()),3)::numeric(20,5);
|
|
cube_ll_coord | cube_ll_coord | cube_ll_coord | cube_ur_coord | cube_ur_coord | cube_ur_coord
|
|
----------------+-----------------+-----------------+----------------+----------------+----------------
|
|
-6378168.00000 | -12756336.00000 | -12756336.00000 | 19134504.00000 | 12756336.00000 | 12756336.00000
|
|
(1 row)
|
|
|
|
--
|
|
-- Test for points that should be in bounding boxes.
|
|
--
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,1))*1.00001) @>
|
|
ll_to_earth(0,1);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,0.1))*1.00001) @>
|
|
ll_to_earth(0,0.1);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,0.01))*1.00001) @>
|
|
ll_to_earth(0,0.01);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,0.001))*1.00001) @>
|
|
ll_to_earth(0,0.001);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,0.0001))*1.00001) @>
|
|
ll_to_earth(0,0.0001);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0.0001,0.0001))*1.00001) @>
|
|
ll_to_earth(0.0001,0.0001);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(45,45),
|
|
earth_distance(ll_to_earth(45,45),ll_to_earth(45.0001,45.0001))*1.00001) @>
|
|
ll_to_earth(45.0001,45.0001);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(90,180),
|
|
earth_distance(ll_to_earth(90,180),ll_to_earth(90.0001,180.0001))*1.00001) @>
|
|
ll_to_earth(90.0001,180.0001);
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
--
|
|
-- Test for points that shouldn't be in bounding boxes. Note that we need
|
|
-- to make points way outside, since some points close may be in the box
|
|
-- but further away than the distance we are testing.
|
|
--
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,1))*.57735) @>
|
|
ll_to_earth(0,1);
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,0.1))*.57735) @>
|
|
ll_to_earth(0,0.1);
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,0.01))*.57735) @>
|
|
ll_to_earth(0,0.01);
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,0.001))*.57735) @>
|
|
ll_to_earth(0,0.001);
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0,0.0001))*.57735) @>
|
|
ll_to_earth(0,0.0001);
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(0,0),
|
|
earth_distance(ll_to_earth(0,0),ll_to_earth(0.0001,0.0001))*.57735) @>
|
|
ll_to_earth(0.0001,0.0001);
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(45,45),
|
|
earth_distance(ll_to_earth(45,45),ll_to_earth(45.0001,45.0001))*.57735) @>
|
|
ll_to_earth(45.0001,45.0001);
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
SELECT earth_box(ll_to_earth(90,180),
|
|
earth_distance(ll_to_earth(90,180),ll_to_earth(90.0001,180.0001))*.57735) @>
|
|
ll_to_earth(90.0001,180.0001);
|
|
?column?
|
|
----------
|
|
f
|
|
(1 row)
|
|
|
|
--
|
|
-- Test the recommended constraints.
|
|
--
|
|
SELECT cube_is_point(ll_to_earth(0,0));
|
|
cube_is_point
|
|
---------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT cube_dim(ll_to_earth(0,0)) <= 3;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT abs(cube_distance(ll_to_earth(0,0), '(0)'::cube) / earth() - 1) <
|
|
'10e-12'::float8;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT cube_is_point(ll_to_earth(30,60));
|
|
cube_is_point
|
|
---------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT cube_dim(ll_to_earth(30,60)) <= 3;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT abs(cube_distance(ll_to_earth(30,60), '(0)'::cube) / earth() - 1) <
|
|
'10e-12'::float8;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT cube_is_point(ll_to_earth(60,90));
|
|
cube_is_point
|
|
---------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT cube_dim(ll_to_earth(60,90)) <= 3;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT abs(cube_distance(ll_to_earth(60,90), '(0)'::cube) / earth() - 1) <
|
|
'10e-12'::float8;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT cube_is_point(ll_to_earth(-30,-90));
|
|
cube_is_point
|
|
---------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT cube_dim(ll_to_earth(-30,-90)) <= 3;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT abs(cube_distance(ll_to_earth(-30,-90), '(0)'::cube) / earth() - 1) <
|
|
'10e-12'::float8;
|
|
?column?
|
|
----------
|
|
t
|
|
(1 row)
|
|
|
|
--
|
|
-- Now we are going to test extension create/drop scenarios.
|
|
--
|
|
-- list what's installed
|
|
\dT
|
|
List of data types
|
|
Schema | Name | Description
|
|
--------+-------+---------------------------------------------------------------------------------------------
|
|
public | cube | multi-dimensional cube '(FLOAT-1, FLOAT-2, ..., FLOAT-N), (FLOAT-1, FLOAT-2, ..., FLOAT-N)'
|
|
public | earth |
|
|
(2 rows)
|
|
|
|
drop extension cube; -- fail, earthdistance requires it
|
|
ERROR: cannot drop extension cube because other objects depend on it
|
|
DETAIL: extension earthdistance depends on extension cube
|
|
HINT: Use DROP ... CASCADE to drop the dependent objects too.
|
|
drop extension earthdistance;
|
|
drop type cube; -- fail, extension cube requires it
|
|
ERROR: cannot drop type cube because extension cube requires it
|
|
HINT: You can drop extension cube instead.
|
|
-- list what's installed
|
|
\dT
|
|
List of data types
|
|
Schema | Name | Description
|
|
--------+------+---------------------------------------------------------------------------------------------
|
|
public | cube | multi-dimensional cube '(FLOAT-1, FLOAT-2, ..., FLOAT-N), (FLOAT-1, FLOAT-2, ..., FLOAT-N)'
|
|
(1 row)
|
|
|
|
create table foo (f1 cube, f2 int);
|
|
drop extension cube; -- fail, foo.f1 requires it
|
|
ERROR: cannot drop extension cube because other objects depend on it
|
|
DETAIL: column f1 of table foo depends on type cube
|
|
HINT: Use DROP ... CASCADE to drop the dependent objects too.
|
|
drop table foo;
|
|
drop extension cube;
|
|
-- list what's installed
|
|
\dT
|
|
List of data types
|
|
Schema | Name | Description
|
|
--------+------+-------------
|
|
(0 rows)
|
|
|
|
\df
|
|
List of functions
|
|
Schema | Name | Result data type | Argument data types | Type
|
|
--------+------+------------------+---------------------+------
|
|
(0 rows)
|
|
|
|
\do
|
|
List of operators
|
|
Schema | Name | Left arg type | Right arg type | Result type | Description
|
|
--------+------+---------------+----------------+-------------+-------------
|
|
(0 rows)
|
|
|
|
create schema c;
|
|
create extension cube with schema c;
|
|
-- list what's installed
|
|
\dT public.*
|
|
List of data types
|
|
Schema | Name | Description
|
|
--------+------+-------------
|
|
(0 rows)
|
|
|
|
\df public.*
|
|
List of functions
|
|
Schema | Name | Result data type | Argument data types | Type
|
|
--------+------+------------------+---------------------+------
|
|
(0 rows)
|
|
|
|
\do public.*
|
|
List of operators
|
|
Schema | Name | Left arg type | Right arg type | Result type | Description
|
|
--------+------+---------------+----------------+-------------+-------------
|
|
(0 rows)
|
|
|
|
\dT c.*
|
|
List of data types
|
|
Schema | Name | Description
|
|
--------+--------+---------------------------------------------------------------------------------------------
|
|
c | c.cube | multi-dimensional cube '(FLOAT-1, FLOAT-2, ..., FLOAT-N), (FLOAT-1, FLOAT-2, ..., FLOAT-N)'
|
|
(1 row)
|
|
|
|
create table foo (f1 c.cube, f2 int);
|
|
drop extension cube; -- fail, foo.f1 requires it
|
|
ERROR: cannot drop extension cube because other objects depend on it
|
|
DETAIL: column f1 of table foo depends on type c.cube
|
|
HINT: Use DROP ... CASCADE to drop the dependent objects too.
|
|
drop schema c; -- fail, cube requires it
|
|
ERROR: cannot drop schema c because other objects depend on it
|
|
DETAIL: extension cube depends on schema c
|
|
column f1 of table foo depends on type c.cube
|
|
HINT: Use DROP ... CASCADE to drop the dependent objects too.
|
|
drop extension cube cascade;
|
|
NOTICE: drop cascades to column f1 of table foo
|
|
\d foo
|
|
Table "public.foo"
|
|
Column | Type | Collation | Nullable | Default
|
|
--------+---------+-----------+----------+---------
|
|
f2 | integer | | |
|
|
|
|
-- list what's installed
|
|
\dT public.*
|
|
List of data types
|
|
Schema | Name | Description
|
|
--------+------+-------------
|
|
(0 rows)
|
|
|
|
\df public.*
|
|
List of functions
|
|
Schema | Name | Result data type | Argument data types | Type
|
|
--------+------+------------------+---------------------+------
|
|
(0 rows)
|
|
|
|
\do public.*
|
|
List of operators
|
|
Schema | Name | Left arg type | Right arg type | Result type | Description
|
|
--------+------+---------------+----------------+-------------+-------------
|
|
(0 rows)
|
|
|
|
\dT c.*
|
|
List of data types
|
|
Schema | Name | Description
|
|
--------+------+-------------
|
|
(0 rows)
|
|
|
|
\df c.*
|
|
List of functions
|
|
Schema | Name | Result data type | Argument data types | Type
|
|
--------+------+------------------+---------------------+------
|
|
(0 rows)
|
|
|
|
\do c.*
|
|
List of operators
|
|
Schema | Name | Left arg type | Right arg type | Result type | Description
|
|
--------+------+---------------+----------------+-------------+-------------
|
|
(0 rows)
|
|
|
|
drop schema c;
|