<sect1 id="earthdistance">
 <title>earthdistance</title>
 
 <indexterm zone="earthdistance">
  <primary>earthdistance</primary>
 </indexterm>

 <para>
  This module contains two different approaches to calculating
  great circle distances on the surface of the Earth. The one described
  first depends on the contrib/cube package (which MUST be installed before
  earthdistance is installed). The second one is based on the point
  datatype using latitude and longitude for the coordinates. The install
  script makes the defined functions executable by anyone.
 </para>
 <para>
  A spherical model of the Earth is used.
 </para>
 <para>
  Data is stored in cubes that are points (both corners are the same) using 3
  coordinates representing the distance from the center of the Earth.
 </para>
 <para>
  The radius of the Earth is obtained from the earth() function. It is
  given in meters. But by changing this one function you can change it
  to use some other units or to use a different value of the radius
  that you feel is more appropiate.
 </para>
 <para>
  This package also has applications to astronomical databases as well.
  Astronomers will probably want to change earth() to return a radius of
  180/pi() so that distances are in degrees.
 </para>
 <para>
  Functions are provided to allow for input in latitude and longitude (in
  degrees), to allow for output of latitude and longitude, to calculate
  the great circle distance between two points and to easily specify a
  bounding box usable for index searches.
 </para>
 <para>
  The functions are all 'sql' functions. If you want to make these functions
  executable by other people you will also have to make the referenced
  cube functions executable. cube(text), cube(float8), cube(cube,float8),
  cube_distance(cube,cube), cube_ll_coord(cube,int) and
  cube_enlarge(cube,float8,int) are used indirectly by the earth distance
  functions. is_point(cube) and cube_dim(cube) are used in constraints for data
  in domain earth. cube_ur_coord(cube,int) is used in the regression tests and
  might be useful for looking at bounding box coordinates in user applications.
 </para>
 <para>
  A domain of type cube named earth is defined.
  There are constraints on it defined to make sure the cube is a point,
  that it does not have more than 3 dimensions and that it is very near
  the surface of a sphere centered about the origin with the radius of
  the Earth.
 </para>
 <para> 
  The following functions are provided:
 </para>

 <table id="earthdistance-functions">
  <title>EarthDistance functions</title>
  <tgroup cols="2">
   <tbody>
    <row>
     <entry><literal>earth()</literal></entry>
     <entry>returns the radius of the Earth in meters.</entry>
    </row>
    <row>
     <entry><literal>sec_to_gc(float8)</literal></entry>
     <entry>converts the normal straight line 
   (secant) distance between between two points on the surface of the Earth 
   to the great circle distance between them.
     </entry>
    </row>
    <row>
     <entry><literal>gc_to_sec(float8)</literal></entry>
     <entry>Converts the great circle distance 
   between two points on the surface of the Earth to the normal straight line 
   (secant) distance between them.
     </entry>
    </row>
    <row>
     <entry><literal>ll_to_earth(float8, float8)</literal></entry>
     <entry>Returns the location of a point on the surface of the Earth given 
      its latitude (argument 1) and longitude (argument 2) in degrees.
     </entry>
    </row>
    <row>
     <entry><literal>latitude(earth)</literal></entry>
     <entry>Returns the latitude in degrees of a point on the surface of the 
      Earth.
     </entry>
    </row>
    <row>
     <entry><literal>longitude(earth)</literal></entry>
     <entry>Returns the longitude in degrees of a point on the surface of the 
      Earth.
     </entry>
    </row>
    <row>
     <entry><literal>earth_distance(earth, earth)</literal></entry>
     <entry>Returns the great circle distance between two points on the 
      surface of the Earth.
     </entry>
    </row>
    <row>
     <entry><literal>earth_box(earth, float8)</literal></entry>
     <entry>Returns a box suitable for an indexed search using the cube @> 
      operator for points within a given great circle distance of a location.
      Some points in this box are further than the specified great circle 
      distance from the location so a second check using earth_distance 
      should be made at the same time.
     </entry>
    </row>
    <row>
     <entry><literal><@></literal> operator</entry>
     <entry>gives the distance in statute miles between
      two points on the Earth's surface. Coordinates are in degrees. Points are
      taken as (longitude, latitude) and not vice versa as longitude is closer 
      to the intuitive idea of x-axis and latitude to y-axis.
     </entry>
    </row>
   </tbody>
  </tgroup>
 </table>
 <para>
  One advantage of using cube representation over a point using latitude and
  longitude for coordinates, is that you don't have to worry about special
  conditions at +/- 180 degrees of longitude or near the poles.
 </para>
</sect1>

