圖書館提供基本的地理空間操作,例如距離計算,小數坐標為性範圍,反之亦然等。此庫當前是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 )