F.14. earthdistance — calcular distancias de círculo máximo #

F.14.1. Distancias terrestres basadas en Cube
F.14.2. Distancias terrestres basadas en puntos

El módulo earthdistance proporciona dos enfoques diferentes para calcular distancias de círculo máximo en la superficie de la Tierra. El que se describe primero depende del módulo cube. El segundo se basa en el tipo de datos incorporado point, utilizando la longitud y la latitud para las coordenadas.

En este módulo, se asume que la Tierra es perfectamente esférica. (Si eso es demasiado inexacto para ti, es posible que desees consultar el proyecto PostGIS).

El módulo cube debe estar instalado antes de que se pueda instalar earthdistance (aunque puedes usar la opción CASCADE de CREATE EXTENSION para instalar ambos en un solo comando).

Caution

Se recomienda encarecidamente que earthdistance y cube se instalen en el mismo esquema, y que ese esquema sea uno para el cual no se haya otorgado ni se otorgue el privilegio CREATE a ningún usuario no confiable. De lo contrario, existen riesgos de seguridad en el momento de la instalación si el esquema de earthdistance contiene objetos definidos por un usuario hostil. Además, al usar las funciones de earthdistance después de la instalación, la ruta de búsqueda (search path) completa debe contener únicamente esquemas confiables.

F.14.1. Distancias terrestres basadas en Cube #

Los datos se almacenan en cubos que son puntos (ambas esquinas son iguales) utilizando 3 coordenadas que representan la distancia x, y, y z desde el centro de la Tierra. Se proporciona un dominio earth sobre el tipo cube, el cual incluye comprobaciones de restricciones de que el valor cumple con estas restricciones y está razonablemente cerca de la superficie real de la Tierra.

El radio de la Tierra se obtiene de la función earth(). Se expresa en metros. Pero al cambiar esta única función, puedes modificar el módulo para usar otras unidades, o para usar un valor de radio diferente que consideres más apropiado.

Este paquete también tiene aplicaciones en bases de datos astronómicas. Los astrónomos probablemente querrán cambiar earth() para que devuelva un radio de 180/pi() para que las distancias estén en grados.

Se proporcionan funciones para admitir la entrada en latitud y longitud (en grados), para admitir la salida de latitud y longitud, para calcular la distancia de círculo máximo entre dos puntos y para especificar fácilmente una caja delimitadora (bounding box) utilizable para búsquedas de índices.

Las funciones proporcionadas se muestran en la Table F.4.

Table F.4. Funciones de earthdistance basadas en Cube

Función

Descripción

earth () → float8

Devuelve el radio asumido de la Tierra.

sec_to_gc ( float8 ) → float8

Convierte la distancia normal en línea recta (secante) entre dos puntos en la superficie de la Tierra a la distancia de círculo máximo entre ellos.

gc_to_sec ( float8 ) → float8

Convierte la distancia de círculo máximo entre dos puntos en la superficie de la Tierra a la distancia normal en línea recta (secante) entre ellos.

ll_to_earth ( float8, float8 ) → earth

Devuelve la ubicación de un punto en la superficie de la Tierra dada su latitud (argumento 1) y longitud (argumento 2) en grados.

latitude ( earth ) → float8

Devuelve la latitud en grados de un punto en la superficie de la Tierra.

longitude ( earth ) → float8

Devuelve la longitud en grados de un punto en la superficie de la Tierra.

earth_distance ( earth, earth ) → float8

Devuelve la distancia de círculo máximo entre dos puntos en la superficie de la Tierra.

earth_box ( earth, float8 ) → cube

Devuelve una caja adecuada para una búsqueda indexada utilizando el operador @> de cube para puntos dentro de una distancia de círculo máximo dada de una ubicación. Algunos puntos en esta caja están más lejos que la distancia de círculo máximo especificada desde la ubicación, por lo que se debe incluir en la consulta una segunda comprobación utilizando earth_distance.


F.14.2. Distancias terrestres basadas en puntos #

La segunda parte del módulo se basa en representar las ubicaciones de la Tierra como valores de tipo point, en los que se considera que la primera componente representa la longitud en grados y la segunda componente representa la latitud en grados. Los puntos se toman como (longitud, latitud) y no al revés porque la longitud está más cerca de la idea intuitiva del eje x y la latitud del eje y.

Se proporciona un único operador, mostrado en la Table F.5.

Table F.5. Operadores de earthdistance basados en puntos

Operador

Descripción

point <@> pointfloat8

Calcula la distancia en millas terrestres (statute miles) entre dos puntos en la superficie de la Tierra.


Ten en cuenta que, a diferencia de la parte basada en cube del módulo, las unidades están fijas (hardwired) aquí: cambiar la función earth() no afectará los resultados de este operador.

Una desventaja de la representación de longitud/latitud es que debes tener cuidado con las condiciones límite cerca de los polos y cerca de +/- 180 grados de longitud. La representación basada en cube evita estas discontinuidades.