图书馆提供基本的地理空间操作,例如距离计算,小数坐标为性范围,反之亦然等。此库当前是2D ,这意味着其任何功能尚未支持高度/高程!
可以在ChangElog.md中找到详细的更改程序
npm install geolibyarn add geolib有一个UMD构建和ES模块构建。您可以像其他任何库一样在节点中使用UMD构建:
const geolib = require ( 'geolib' ) ;或在浏览器中使用简单的脚本元素:
< script src =" lib/geolib.js " > </ script >如果将其加载到浏览器中,则可以通过window.geolib访问所有功能。
如果您正在使用Bundler(例如WebPack或包裹)或具有本地支持ES模块的环境,则可以直接从软件包导入某些功能:
import { getDistance } from 'geolib' ;或加载整个库:
import * as geolib from 'geolib' ;或者,您可以直接导入单个功能来潜在地利用心形(推荐):
import getDistance from 'geolib/es/getDistance' ; 该库是用打字稿编写的。您不必知道打字稿即可使用Geolib,但是类型定义为您提供有关一般用法,输入参数等的有价值信息。
与坐标一起工作的所有方法都接受具有lat / latitude和lon / lng / longitude属性或Geojson坐标数组的对象,例如: [lon, lat] 。所有值都可以以十进制( 53.471 )或sexageSimal( 53° 21' 16" )格式进行。
距离值始终是漂浮物,并表示米的距离。
getDistance(start, end, accuracy = 1)计算两个地理坐标之间的距离。
此功能最多需要3个参数。前2个参数必须是有效的GeolibInputCoordinates (例如{latitude: 52.518611, longitude: 13.408056} )。坐标可以采用性明显或十进制格式。第三个论点是准确性(以米为单位)。默认情况下,精度为1米。如果需要更准确的结果,则可以将其设置为较低的值,例如,精度为0.01 。您可以将结果设置为更高的结果,以使结果四舍五入为您所选精度可将其排除的下一个值(例如,精度为100的25428变为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.' ) ;
}
) ;将米以米为数值返回距离。
getPreciseDistance(start, end, accuracy = 1)计算两个地理坐标之间的距离。此方法比getDistance更准确,尤其是对于长距离,但也较慢。它正在使用椭圆形的Vincenty反向公式。
它具有与getDistance相同的(最多3)的论点。
geolib . getPreciseDistance (
{ latitude : 51.5103 , longitude : 7.49347 } ,
{ latitude : "51° 31' N" , longitude : "7° 28' E" }
) ;getCenter(coords)计算一系列地理坐标中所有点的地理中心。采用一系列坐标并计算其中心。
geolib . getCenter ( [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;返回对象:
{
"latitude" : centerLat ,
"longitude" : centerLon
}getCenterOfBounds(coords)计算地理坐标边界的中心。
采用一系列坐标,计算这些边界,并将该矩形的中心归还。
在政治边界(例如国家)等多边形上,这可能getCenter )更接近人类的期望,因为该功能可能会因不同方面的分数分布不均而受到干扰。
想象一下,美国俄克拉荷马州: getCenter )给出了南部点,因为南部边界包含的节点比其他节点多得多。
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 } ,
] ) ;返回对象:
{
"latitude" : centerLat ,
"longitude" : centerLng
}getBounds(points)计算地理坐标的边界。
geolib . getBounds ( [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;它返回最小和最大纬度,最小和最大经度作为对象:
{
"minLat" : minimumLatitude ,
"maxLat" : maximumLatitude ,
"minLng" : minimumLongitude ,
"maxLng" : maximumLongitude ,
}isPointInPolygon(point, polygon)检查一个点是否在多边形的内部。
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 } ,
] ) ;返回true还是false
isPointWithinRadius(point, centerPoint, radius)检查一个点是否在圆圈内。
// 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
) ;返回true还是false
getRhumbLineBearing(origin, destination)获得两个点的rhumb线轴承。了解Wikipedia上Rhumb线和大圆圈之间的区别。在大多数情况下,Rhumb线应该很好:
http://en.wikipedia.org/wiki/rhumb_line#general_and_and_mathematical_description
功能在很大程度上基于道格·范德威德(Doug Vanderweide)的出色PHP版本(根据GPL 3.0许可)
geolib . getRhumbLineBearing (
{ latitude : 52.518611 , longitude : 13.408056 } ,
{ latitude : 51.519475 , longitude : 7.46694444 }
) ;返回计算的轴承为数字。
getGreatCircleBearing(origin, destination)得到两个点的圆圈。这比RHUMB线轴承更准确,但也较慢。
geolib . getGreatCircleBearing (
{ latitude : 52.518611 , longitude : 13.408056 } ,
{ latitude : 51.519475 , longitude : 7.46694444 }
) ;返回计算的轴承为数字。
getCompassDirection(origin, destination, bearingFunction = getRhumbLineBearing)从原点坐标到目标坐标。可选地确定轴承的功能可以作为第三参数传递。默认值是getRhumbLineBearing 。
geolib . getCompassDirection (
{ latitude : 52.518611 , longitude : 13.408056 } ,
{ latitude : 51.519475 , longitude : 7.46694444 }
) ;将方向(例如NNE , SW , E ,…)作为字符串返回。
orderByDistance(point, arrayOfPoints)按距离与参考坐标的距离对坐标阵列进行分类。
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 } ,
] ) ;返回按距离到参考点的距离的积分数组。
findNearest(point, arrayOfPoints)找到一个与参考坐标最接近的点。实际上,这只是一种便利方法,它在引擎盖下使用orderByDistance并返回第一个结果。
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 } ,
] ) ;返回最接近参考点的点。
getPathLength(points, distanceFunction = getDistance)计算坐标集合的长度。期望积分数组是第一个参数,并且可以选择一个函数来确定距离为第二个参数。默认值是getDistance 。
geolib . getPathLength ( [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;返回以米为数的路径的长度。
getDistanceFromLine(point, lineStart, lineEnd, accuracy = 1)从一个点到两点的最小距离。
geolib . getDistanceFromLine (
{ latitude : 51.516 , longitude : 7.456 } ,
{ latitude : 51.512 , longitude : 7.456 } ,
{ latitude : 51.516 , longitude : 7.459 }
) ;返回到给定线路的最短距离。
注意:如果所有点都太近了,则功能可能会返回NAN。在这种情况下,通常有助于稍微提高准确性(例如0.01 )。
getBoundsOfDistance(point, distance)计算地球表面上所有点的边界坐标小于或等于指定的大圆距离。
geolib . getBoundsOfDistance (
{ latitude : 34.090166 , longitude : - 118.276736555556 } ,
1000
) ;返回西南和东北坐标的阵列。
isPointInLine(point, lineStart, lineEnd)计算如果给出的点位于由启动和结束形成的线中。
geolib . isPointInLine (
{ latitude : 0 , longitude : 10 } ,
{ latitude : 0 , longitude : 0 } ,
{ latitude : 0 , longitude : 15 }
) ;sexagesimalToDecimal(value)将sexageSimal坐标转换为十进制格式
geolib . sexagesimalToDecimal ( `51° 29' 46" N` ) ;返回新值作为小数号。
decimalToSexagesimal(value)将小数坐标转换为sexageagal格式
geolib . decimalToSexagesimal ( 51.49611111 ) ; // -> 51° 29' 46`将新值返回为性弦。
geolib.getLatitude(point, raw = false)geolib.getLongitude(point, raw = false)返回给定点的纬度/经度,并将其转换为十进制。如果将第二个参数设置为true,则不会将值转换为十进制。
geolib . getLatitude ( { lat : 51.49611 , lng : 7.38896 } ) ; // -> 51.49611
geolib . getLongitude ( { lat : 51.49611 , lng : 7.38896 } ) ; // -> 7.38896如果将第二个参数设置为true,则将值作为小数或原始格式返回。
toDecimal(point)检查坐标是否已经以十进制格式,如果没有,则将其转换为。使用单个值(例如51° 32' 17" )和完整的坐标(例如{lat: 1, lon: 1} ),只要以支持的格式)。
geolib . toDecimal ( `51° 29' 46" N` ) ; // -> 51.59611111
geolib . toDecimal ( 51.59611111 ) ; // -> 51.59611111返回给定输入值的小数值。
computeDestinationPoint(point, distance, bearing, radius = earthRadius)计算给定初始点,距离(以米为单位)和轴承(以度为单位)的目标点。如果没有半径,则默认为平均地球半径为6,371,000米。
注意:此公式不是100%准确的(但虽然非常接近)。
geolib . computeDestinationPoint (
{ latitude : 52.518611 , longitude : 13.408056 } ,
15000 ,
180
) ; geolib . computeDestinationPoint (
[ 13.408056 , 52.518611 ]
15000 ,
180
) ;以与输入坐标相同的格式返回目的地。因此,如果您通过Geojson点,您将获得一个Geojson点。
getAreaOfPolygon(points)计算多边形的表面积。
geolib . getAreaOfPolygon ( [
[ 7.453635617650258 , 51.49320556213869 ] ,
[ 7.454583481047989 , 51.49328893754685 ] ,
[ 7.454778172179346 , 51.49240881084831 ] ,
[ 7.453832678225655 , 51.49231619246726 ] ,
[ 7.453635617650258 , 51.49320556213869 ] ,
] ) ;将结果返回为平方米的数字。
getCoordinateKeys(point)获取以归一化形式以该点使用的属性名称:
geolib . getCoordinateKeys ( { lat : 1 , lon : 1 } ) ;
// -> { latitude: 'lat', longitude: 'lon' }返回具有latitude和longitude属性的对象。它们的值是传递点中使用的纬度和经度的属性名称。可能只能在内部使用。
getCoordinateKey(point, keysToLookup)被引擎盖下的getCoordinateKeys使用,并从可能的名称列表中返回属性名称。
geolib . getCoordinateKey ( { latitude : 1 , longitude : 2 } , [ 'lat' , 'latitude' ] ) ;
// -> latitude如果没有匹配,则将属性的名称返回字符串或undefined名称。
isValidCoordinate(point)检查给定点是否至少具有纬度和经度,并且具有支持的格式。
// true:
geolib . isValidCoordinate ( { latitude : 1 , longitude : 2 } ) ;
// false, longitude is missing:
geolib . isValidCoordinate ( { latitude : 1 } ) ;
// true, GeoJSON format:
geolib . isValidCoordinate ( [ 2 , 1 ] ) ;返回true还是false 。
getSpeed(startPointWithTime, endPointWithTime)在给定的时间跨度内计算两个点之间的速度。
geolib . getSpeed (
{ latitude : 51.567294 , longitude : 7.38896 , time : 1360231200880 } ,
{ latitude : 52.54944 , longitude : 13.468509 , time : 1360245600880 }
) ;返回每秒米的速度作为数字。
convertSpeed(value, unit)将getSpeed的结果转换为更具人为友好的格式。当前可用的单位是mph和kmh 。
unit可以是:
geolib . convertSpeed ( 29.8678 , 'kmh' ) ;返回转换值作为数字。
convertDistance(value, unit)将给定的距离(以米为单位)转换为另一个单元。
unit可以是:
geolib . convertDistance ( 14200 , 'km' ) ; // 14.2
geolib . convertDistance ( 500 , 'km' ) ; // 0.5返回转换后的距离为数字。
convertArea(value, unit)将getAreaForPolygon的结果转换为另一个单元。
unit可以是:
geolib . convertArea ( 298678 , 'km2' ) ) ;将转换的区域返回数字。
wktToPolygon(wkt)将众所周知的文本(又名WKT)转换为Geolib理解的多边形。 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 },}
// ]返回坐标数组。
在版本3.0.0中,我试图让一些根。 Geolib曾经开始,因为我需要一些方法来执行非常特定的GEO相关任务,例如获得距离或两个点之间的方向。由于它是当时NPM上第一个以非常简单的方式做这类事情的图书馆之一,因此它变得非常受欢迎(截至2019年4月,每月下载超过30万个下载!),因此多年来得到了很多贡献。只要它们随附的测试,我只是合并了其中的许多,而没有查看一致性,惯例,复杂性,编码样式甚至我有时都不完全理解的功能的整体质量。
现在,我已经完全清理了代码库,重建了整个库“从头开始”,统一了所有功能参数,删除了一些功能,我不确定它们是否应该在这里(随时可以添加它们使用它们!),或者是否使用了它们!
删除了高程支持,以及一些不必要地使库的尺寸非常大的功能(例如,仅isPointInsideRobust是700多个代码线,并且基本上是从其他库中获取的)。
我从构建过程中删除了咕unt声,添加了诸如Eslint和Prettier的“现代”工具。我从Travis CI切换到Circle CI,并且正在使用semantic-release和conventional-commits进一步自动化新版本的发行过程。我还从纯JavaScript转换为打字稿,因为我认为它确实有一些好处。
getDistance函数从慢速,准确的函数更改为快速,略有不正确的函数。现在,旧的getDistance函数被命名为getPreciseDistance ,而旧的getDistanceSimple函数现在是默认的getDistance函数。但是,您可以将getPreciseDistance作为参数传递给任何在内部使用距离计算的函数。getBoundsOfDistance()现在由于去除人工8小数点限制而返回确切的坐标getCompassDirection()不再以精确和粗糙的方向返回对象,而仅作为字符串的确切方向getCompassDirection()的第三个论点不再是字符串(“圆”,“线”),而是确定轴承的函数(您可以通过getRhumbLineBearing或getGreatCircleBearing )。该函数接收原点和目标作为第一个和第二个参数。如果没有给出第三参数,则默认情况下使用getRhumbLineBearing(origin, dest) 。roughCompassDirection(exact) 。最好不要使用它。orderByDistance()不再修改其输入,因此不会在返回的坐标中添加distance和key属性。getSpeed()的结果始终以每秒米为单位返回。它可以使用新的便利函数convertSpeed(mps, targetUnit)进行转换findNearest()不再offset并limit参数。从一组坐标中获得最接近的单个点只是一种便利方法。如果您需要多个,请查看实现并使用orderByDistance实施您自己的逻辑52° 46' 21.0004" ,但也比以前更准确。computeDestinationPointgetBoundsgetBoundsOfDistancegetCentergetCenterOfBoundsgetCompassDirectiongetDistanceFromLinegetPathLengthgetRhumbLineBearinggetSpeedisDecimalisPointInLineisPointNearLineisSexagesimalorderByDistancegetKeys重命名为getCoordinateKeysvalidate重命名为isValidCoordinategetLat重命名为getLatitudegetLon重命名为getLongitudelatitude - >重命名为getLatitudelongitude - >重命名为getLongitudeconvertUnit >将转换为convert不休,因为名称太模棱两可useDecimal命名为toDecimaldecimal2sexagesimal重命名为decimalToSexagesimalsexagesimal2decimal十分命名为sexagesimalToDecimalgetDistance重命名为getPreciseDistancegetDistanceSimple重命名为getDistanceisPointInside重命名为isPointInPolygonisPointInCircle重命名为isPointWithinRadiusgetBearing为getGreatCircleBearing ,以更明确getElev >删除elevation - >去除coords - >删除(可能被重新添加为GetSoorceartion或GetNormalizedCoorceardion)ll >删除(因为WTF?)preparePolygonForIsPointInsideOptimized >删除isPointInsideWithPreparedPolygon >由于缺少文档而被删除isInside别名 - >删除(太模棱两可) - 使用isPointInPolygon或isPointWithinRadiuswithinRadius >删除,使用isPointWithinRadiusgetDirection别名 - >删除(不必要的混乱) - 使用getCompassDirectiongetAreaOfPolygon计算多边形的面积getCoordinateKey获取属性名称(例如,基于可能名称数组的对象的lat或lng )