Biblioteca para proporcionar operaciones geoespaciales básicas como el cálculo de la distancia, la conversión de coordenadas decimales en sexagesimal y viceversa, etc. ¡Esta biblioteca es actualmente 2D , lo que significa que la altitud/elevación aún no está respaldada por ninguna de sus funciones!
Se puede encontrar un CangeLog detallado en ChangeLog.md
npm install geolibyarn add geolibHay una compilación UMD y una compilación del módulo ES . Puede usar la compilación UMD en el nodo como cualquier otra biblioteca:
const geolib = require ( 'geolib' ) ;o en el navegador usando un elemento de script simple:
< script src =" lib/geolib.js " > </ script > Si lo carga en el navegador, puede acceder a todas las funciones a través de window.geolib .
Si está trabajando con un Bundler (como Webpack o Parcel) o tiene un entorno que admite los módulos ES de forma nativa, puede importar ciertas funciones del paquete directamente:
import { getDistance } from 'geolib' ;o cargar toda la biblioteca:
import * as geolib from 'geolib' ;O puede importar funciones individuales directamente para utilizar potencialmente el tono (recomendado):
import getDistance from 'geolib/es/getDistance' ; Esta biblioteca está escrita en TypeScript. No tiene que saber TypeScript para usar Geolib, pero las definiciones de tipo le brindan información valiosa sobre el uso general, los parámetros de entrada, etc.
Todos los métodos que están trabajando con coordenadas aceptan un objeto con un lat / latitude y una propiedad lon / lng / longitude , o una matriz de coordenadas de Geojson, como: [lon, lat] . Todos los valores pueden estar en formato decimal ( 53.471 ) o sexagésimal ( 53° 21' 16" ).
Los valores de distancia siempre son flotadores y representan la distancia en metros .
getDistance(start, end, accuracy = 1)Calcula la distancia entre dos coordenadas GEO.
Esta función toma hasta 3 argumentos. Los primeros 2 argumentos deben ser válidos GeolibInputCoordinates (por ejemplo {latitude: 52.518611, longitude: 13.408056} ). Las coordenadas pueden estar en formato sexagésimal o decimal. El tercer argumento es la precisión (en metros). Por defecto, la precisión es de 1 metro. Si necesita un resultado más preciso, puede configurarlo en un valor más bajo, por ejemplo, por ejemplo, 0.01 para la precisión del centímetro. Puede establecerlo más alto para que el resultado reduzca al siguiente valor que es divisible por la precisión elegida (por ejemplo, 25428 con una precisión de 100 se convierte en 25400 ).
getDistance (
{ latitude : 51.5103 , longitude : 7.49347 } ,
{ latitude : "51° 31' N" , longitude : "7° 28' E" }
) ; // Working with W3C Geolocation API
navigator . geolocation . getCurrentPosition (
( position ) => {
console . log (
'You are ' ,
geolib . getDistance ( position . coords , {
latitude : 51.525 ,
longitude : 7.4575 ,
} ) ,
'meters away from 51.525, 7.4575'
) ;
} ,
( ) => {
alert ( 'Position could not be determined.' ) ;
}
) ;Devuelve la distancia en metros como valor numérico.
getPreciseDistance(start, end, accuracy = 1) Calcula la distancia entre dos coordenadas GEO. Este método es más preciso que getDistance , especialmente a largas distancias, pero también es más lento. Está utilizando la fórmula inversa de Vincenty para elipsoides.
Se necesitan los mismos (hasta 3) argumentos que getDistance .
geolib . getPreciseDistance (
{ latitude : 51.5103 , longitude : 7.49347 } ,
{ latitude : "51° 31' N" , longitude : "7° 28' E" }
) ;getCenter(coords)Calcula el centro geográfico de todos los puntos en una colección de coordenadas GEO. Toma una variedad de coordenadas y calcula el centro de ella.
geolib . getCenter ( [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;Devuelve un objeto:
{
"latitude" : centerLat ,
"longitude" : centerLon
}getCenterOfBounds(coords)Calcula el centro de los límites de las coordenadas geográficas.
Toma una variedad de coordenadas, calcula el borde de ellas y devuelve el centro de ese rectángulo.
En polígonos como las fronteras políticas (por ejemplo, los estados), esto puede dar un resultado más cercano a la expectativa humana, que getCenter , porque esa función puede verse perturbada por la distribución desigual del punto en diferentes lados.
Imagine el estado de EE. UU. Oklahoma: getCenter en eso da un punto sureño, porque la frontera sur contiene muchos más nodos que los demás.
geolib . getCenterOfBounds ( [
{ latitude : 51.513357512 , longitude : 7.45574331 } ,
{ latitude : 51.515400598 , longitude : 7.45518541 } ,
{ latitude : 51.516241842 , longitude : 7.456494328 } ,
{ latitude : 51.516722545 , longitude : 7.459863183 } ,
{ latitude : 51.517443592 , longitude : 7.463232037 } ,
] ) ;Devuelve un objeto:
{
"latitude" : centerLat ,
"longitude" : centerLng
}getBounds(points)Calcula los límites de las coordenadas GEO.
geolib . getBounds ( [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;Devuelve la latitud mínima y máxima y la longitud mínima y máxima como objeto:
{
"minLat" : minimumLatitude ,
"maxLat" : maximumLatitude ,
"minLng" : minimumLongitude ,
"maxLng" : maximumLongitude ,
}isPointInPolygon(point, polygon)Comprueba si un punto está dentro de un polígono o no.
geolib . isPointInPolygon ( { latitude : 51.5125 , longitude : 7.485 } , [
{ latitude : 51.5 , longitude : 7.4 } ,
{ latitude : 51.555 , longitude : 7.4 } ,
{ latitude : 51.555 , longitude : 7.625 } ,
{ latitude : 51.5125 , longitude : 7.625 } ,
] ) ; Devuelve true o false
isPointWithinRadius(point, centerPoint, radius)Comprueba si un punto está dentro de un círculo o no.
// checks if 51.525/7.4575 is within a radius of 5 km from 51.5175/7.4678
geolib . isPointWithinRadius (
{ latitude : 51.525 , longitude : 7.4575 } ,
{ latitude : 51.5175 , longitude : 7.4678 } ,
5000
) ; Devuelve true o false
getRhumbLineBearing(origin, destination)Obtiene la línea de rumbo de dos puntos. Descubra la diferencia entre la línea de rumb y el gran círculo en Wikipedia. La línea de rumb debe estar bien en la mayoría de los casos:
http://en.wikipedia.org/wiki/rhumb_line#general_and_mathematical_description
La función se basa en gran medida en la gran versión de PHP de Doug Vanderweide (con licencia bajo GPL 3.0) http://www.dougv.com/2009/07/13/calculating-the-bearing-and-compass-rose-direction-betwewo-latitude-longitude-coordinates-in-php/
geolib . getRhumbLineBearing (
{ latitude : 52.518611 , longitude : 13.408056 } ,
{ latitude : 51.519475 , longitude : 7.46694444 }
) ;Devuelve el rodamiento calculado como número.
getGreatCircleBearing(origin, destination)Obtiene un gran círculo de dos puntos. Esto es más preciso que el rodamiento de la línea de rumbo, pero también más lento.
geolib . getGreatCircleBearing (
{ latitude : 52.518611 , longitude : 13.408056 } ,
{ latitude : 51.519475 , longitude : 7.46694444 }
) ;Devuelve el rodamiento calculado como número.
getCompassDirection(origin, destination, bearingFunction = getRhumbLineBearing) Obtiene la dirección de la brújula de una coordenada de origen a una coordenada de destino. Opcionalmente, una función para determinar el rodamiento se puede pasar como tercer parámetro. El valor predeterminado es getRhumbLineBearing .
geolib . getCompassDirection (
{ latitude : 52.518611 , longitude : 13.408056 } ,
{ latitude : 51.519475 , longitude : 7.46694444 }
) ; Devuelve la dirección (por ejemplo, NNE , SW , E , ...) como cadena.
orderByDistance(point, arrayOfPoints)Clasifica una matriz de coordinas por distancia a una coordenada de referencia.
geolib . orderByDistance ( { latitude : 51.515 , longitude : 7.453619 } , [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.518 , longitude : 7.45425 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;Devuelve una matriz de puntos ordenados por su distancia al punto de referencia.
findNearest(point, arrayOfPoints) Encuentra el único punto más cercano a una coordenada de referencia. En realidad, es solo un método de conveniencia que usa orderByDistance debajo del capó y devuelve el primer resultado.
geolib . findNearest ( { latitude : 52.456221 , longitude : 12.63128 } , [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
{ latitude : 55.751667 , longitude : 37.617778 } ,
{ latitude : 48.8583 , longitude : 2.2945 } ,
{ latitude : 59.3275 , longitude : 18.0675 } ,
{ latitude : 59.916911 , longitude : 10.727567 } ,
] ) ;Devuelve el punto más cercano al punto de referencia.
getPathLength(points, distanceFunction = getDistance) Calcula la longitud de una colección de coordenadas. Espera una matriz de puntos como primer argumento y opcionalmente una función para determinar la distancia como segundo argumento. El valor predeterminado es getDistance .
geolib . getPathLength ( [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;Devuelve la longitud de la ruta en metros como número.
getDistanceFromLine(point, lineStart, lineEnd, accuracy = 1)Obtiene la distancia mínima de un punto a una línea de dos puntos.
geolib . getDistanceFromLine (
{ latitude : 51.516 , longitude : 7.456 } ,
{ latitude : 51.512 , longitude : 7.456 } ,
{ latitude : 51.516 , longitude : 7.459 }
) ;Devuelve la distancia más corta a la línea dada como número.
Nota: Si todos los puntos están demasiado juntos, la función podría devolver NAN. En este caso, generalmente ayuda a aumentar ligeramente la precisión (por ejemplo, 0.01 ).
getBoundsOfDistance(point, distance)Calcula las coordenadas delimitadoras de todos los puntos en la superficie de la tierra menos o igual a la distancia de gran círculo especificada.
geolib . getBoundsOfDistance (
{ latitude : 34.090166 , longitude : - 118.276736555556 } ,
1000
) ;Devuelve una matriz con las coordenadas suroeste y noreste.
isPointInLine(point, lineStart, lineEnd)Calcula si el punto dado se encuentra en una línea formada por Start and End.
geolib . isPointInLine (
{ latitude : 0 , longitude : 10 } ,
{ latitude : 0 , longitude : 0 } ,
{ latitude : 0 , longitude : 15 }
) ;sexagesimalToDecimal(value)Convierte una coordenada sexagésimal en formato decimal
geolib . sexagesimalToDecimal ( `51° 29' 46" N` ) ;Devuelve el nuevo valor como número decimal.
decimalToSexagesimal(value)Convierte una coordenada decimal en formato sexualsimal
geolib . decimalToSexagesimal ( 51.49611111 ) ; // -> 51° 29' 46`Devuelve el nuevo valor como cadena sexual.
geolib.getLatitude(point, raw = false)geolib.getLongitude(point, raw = false)Devuelve la latitud/longitud para un punto dado y la convierte en decimal. Si el segundo argumento se establece en True, no convierte el valor en decimal.
geolib . getLatitude ( { lat : 51.49611 , lng : 7.38896 } ) ; // -> 51.49611
geolib . getLongitude ( { lat : 51.49611 , lng : 7.38896 } ) ; // -> 7.38896Devuelve el valor como decimal o en su formato original si el segundo argumento se estableció en verdadero.
toDecimal(point) Comprueba si una coordenada ya está en formato decimal y, si no, se lo convierte. Funciona con valores únicos (por ejemplo 51° 32' 17" ) y coordenadas completas (por ejemplo {lat: 1, lon: 1} ) siempre que sea en un formato compatible.
geolib . toDecimal ( `51° 29' 46" N` ) ; // -> 51.59611111
geolib . toDecimal ( 51.59611111 ) ; // -> 51.59611111Devuelve un valor decimal para el valor de entrada dado.
computeDestinationPoint(point, distance, bearing, radius = earthRadius)Calcula el punto de destino dado un punto inicial, una distancia (en metros) y un rodamiento (en grados). Si no se da radio, por defecto, el radio de la Tierra medio de 6,371,000 metros.
Atención: esta fórmula no es 100% precisa (pero muy cerca).
geolib . computeDestinationPoint (
{ latitude : 52.518611 , longitude : 13.408056 } ,
15000 ,
180
) ; geolib . computeDestinationPoint (
[ 13.408056 , 52.518611 ]
15000 ,
180
) ;Devuelve el destino en el mismo formato que la entrada coordina. Entonces, si pasa un punto de Geojson, obtendrá un punto de Geojson.
getAreaOfPolygon(points)Calcula el área de superficie de un polígono.
geolib . getAreaOfPolygon ( [
[ 7.453635617650258 , 51.49320556213869 ] ,
[ 7.454583481047989 , 51.49328893754685 ] ,
[ 7.454778172179346 , 51.49240881084831 ] ,
[ 7.453832678225655 , 51.49231619246726 ] ,
[ 7.453635617650258 , 51.49320556213869 ] ,
] ) ;Devuelve el resultado como número en medidores cuadrados.
getCoordinateKeys(point)Obtiene los nombres de propiedad de los que se usan en el punto en forma normalizada:
geolib . getCoordinateKeys ( { lat : 1 , lon : 1 } ) ;
// -> { latitude: 'lat', longitude: 'lon' } Devuelve un objeto con una propiedad latitude y longitude . Sus valores son los nombres de propiedad para la latitud y la longitud que se usan en el punto aprobado. Probablemente solo debería usarse internamente.
getCoordinateKey(point, keysToLookup) Es utilizado por getCoordinateKeys debajo del capó y devuelve el nombre de la propiedad de una lista de nombres posibles.
geolib . getCoordinateKey ( { latitude : 1 , longitude : 2 } , [ 'lat' , 'latitude' ] ) ;
// -> latitude Devuelve el nombre de la propiedad como cadena o undefined si no, no había coincidencia.
isValidCoordinate(point)Comprueba si un punto dado tiene al menos una latitud y una longitud y está en un formato compatible.
// true:
geolib . isValidCoordinate ( { latitude : 1 , longitude : 2 } ) ;
// false, longitude is missing:
geolib . isValidCoordinate ( { latitude : 1 } ) ;
// true, GeoJSON format:
geolib . isValidCoordinate ( [ 2 , 1 ] ) ; Devuelve true o false .
getSpeed(startPointWithTime, endPointWithTime)Calcula la velocidad entre dos puntos dentro de un lapso de tiempo dado.
geolib . getSpeed (
{ latitude : 51.567294 , longitude : 7.38896 , time : 1360231200880 } ,
{ latitude : 52.54944 , longitude : 13.468509 , time : 1360245600880 }
) ;Devuelva la velocidad en metros por segundo como número.
convertSpeed(value, unit) Convierte el resultado de getSpeed en un formato más amigable para los humanos. Las unidades disponibles actualmente son mph y kmh .
unit puede ser una de:
geolib . convertSpeed ( 29.8678 , 'kmh' ) ;Devuelve el valor convertido como número.
convertDistance(value, unit)Convierte una distancia dada (en metros) en otra unidad.
unit puede ser una de:
geolib . convertDistance ( 14200 , 'km' ) ; // 14.2
geolib . convertDistance ( 500 , 'km' ) ; // 0.5Devuelve la distancia convertida como número.
convertArea(value, unit) Convierte el resultado de getAreaForPolygon en una unidad diferente.
unit puede ser una de:
geolib . convertArea ( 298678 , 'km2' ) ) ;Devuelve el área convertida como número.
wktToPolygon(wkt)Convierte el conocido texto (también conocido como WKT) en polígono que Geolib entiende. https://en.wikipedia.org/wiki/well-nown_text_representation_of_geometry#geometric_objects
geolib . wktToPolygon ( 'POLYGON ((30 10.54321, 40 40, 20 40, 10 20, 30 10))' ) ;
// [
// { latitude: 10.54321, longitude: 30 },
// { latitude: 40, longitude: 40 },
// { latitude: 40, longitude: 20 },
// { latitude: 20, longitude: 10 },
// { latitude: 10, longitude: 30 },}
// ]Devuelve la matriz de coordenadas.
En la versión 3.0.0 estoy tratando de volver a las raíces . Geolib se inició una vez porque necesitaba un puñado de métodos para realizar tareas geográficas muy específicas como obtener la distancia o la dirección entre dos puntos. Dado que fue una de las primeras bibliotecas en NPM en ese entonces hacer este tipo de cosas de una manera muy simple, se hizo muy popular (¡con más de 300k descargas por mes a partir de abril de 2019!) Y, como consecuencia, recibió muchas contribuciones a lo largo de los años. Muchos de los cuales me fusionaron siempre que tuvieran pruebas acompañantes, sin mirar la consistencia, las convenciones, la complejidad, el estilo de codificación o incluso la calidad general de las funciones que a veces ni siquiera entendía completamente.
Ahora he limpiado la base de código por completo, reconstruí toda la biblioteca "desde cero", unificé todos los argumentos de la función, eliminé algunas funciones en las que no estaba seguro de si deberían estar aquí (siéntase libre de agregarlos de vuelta!) O si incluso se usaron (hicieron algunas búsquedas en Github para los nombres de funciones, resultó cero resultados).
Se eliminó el soporte de elevación, así como algunas funciones que hicieron innecesariamente la biblioteca realmente grande (por ejemplo, isPointInsideRobust solo era más de 700 líneas de código y básicamente se tomaban de una biblioteca diferente).
Eliminé el gruñido del proceso de compilación, agregué herramientas "modernas" como Eslint y Prettier. Cambié de Travis CI a Circle CI y estoy en el proceso de automatizar aún más el proceso de lanzamiento de nuevas versiones utilizando semantic-release y conventional-commits . También cambié de JavaScript puro a TypeScript porque creo que tiene algunos beneficios.
getDistance predeterminada de ser la lenta y precisa a ser la rápida y ligeramente inexacta. La antigua función getDistance ahora se llama getPreciseDistance , mientras que la antigua función getDistanceSimple es ahora la función getDistance predeterminada. Sin embargo, puede aprobar getPreciseDistance como argumento para cualquier función que use el cálculo de la distancia internamente.getBoundsOfDistance() ahora devuelve las coordenadas exactas debido a la eliminación de la limitación artificial de 8 decimalesgetCompassDirection() ya no devuelve un objeto con una dirección exacta y aproximada, sino solo la dirección exacta como cadenagetCompassDirection() ya no es una cadena ("círculo", "línea") sino una función para determinar el rodamiento (puede pasar getRhumbLineBearing o getGreatCircleBearing ). La función recibe el origen y el destino como primer y segundo argumento. Si no se dio el tercer argumento, getRhumbLineBearing(origin, dest) se usa de forma predeterminada.roughCompassDirection(exact) si realmente solo necesita una dirección muy áspera (y potencialmente inexacta o inapropiada). Mejor no lo uses.orderByDistance() ya no modifica su entrada, por lo que no agrega una propiedad distance y key a las coordenadas devueltas.getSpeed() ahora siempre se devuelve como metros por segundo . Se puede convertir utilizando la nueva función de conveniencia convertSpeed(mps, targetUnit)findNearest() ya no toma offset y limit los argumentos. Es solo un método de conveniencia para obtener el único punto más cercano de un conjunto de coordenadas. Si necesita más de uno, eche un vistazo a la implementación e implemente su propia lógica utilizando orderByDistance52° 46' 21.0004" en casos raros, pero también es más preciso de lo que era antes.computeDestinationPointgetBoundsgetBoundsOfDistancegetCentergetCenterOfBoundsgetCompassDirectiongetDistanceFromLinegetPathLengthgetRhumbLineBearinggetSpeedisDecimalisPointInLineisPointNearLineisSexagesimalorderByDistancegetKeys renombrados para getCoordinateKeysvalidate renombrado a isValidCoordinategetLat renombrado para getLatitudegetLon renombrado a getLongitudelatitude -> renombrado a getLatitudelongitude -> renombrado a getLongitudeconvertUnit -> Remistado a ConvertDistance, porque el nombre era demasiado ambiguouseDecimal renombrado a toDecimaldecimal2sexagesimal renombrado a decimalToSexagesimalsexagesimal2decimal renombrado a sexagesimalToDecimalgetDistance renombrado para getPreciseDistancegetDistanceSimple renombrado a getDistanceisPointInside renombrado a isPointInPolygonisPointInCircle renombrado a isPointWithinRadiusgetBearing renombrado para getGreatCircleBearing para ser más explícitogetElev -> eliminadoelevation -> eliminadacoords -> eliminado (podría reaccionar como getcoordinate o getNormalizedCoordinate)ll -> eliminado (¿porque WTF?)preparePolygonForIsPointInsideOptimized -> eliminado debido a la documentación faltante y las pruebas faltantesisPointInsideWithPreparedPolygon -> eliminado debido a la documentación faltanteisInside alias -> eliminado (demasiado ambiguo) - Use isPointInPolygon o isPointWithinRadiuswithinRadius -> eliminado, use isPointWithinRadiusgetDirection Alias -> eliminado (desorden innecesario) - use getCompassDirectiongetAreaOfPolygon para calcular el área de un polígonogetCoordinateKey para obtener un nombre de propiedad (por ejemplo, lat o lng de un objeto basado en una variedad de nombres posibles)