Perpustakaan untuk menyediakan operasi geospasial dasar seperti perhitungan jarak, konversi koordinat desimal ke seksagesimal dan sebaliknya, dll. Perpustakaan ini saat ini 2D , yang berarti bahwa ketinggian/ketinggian belum didukung oleh fungsinya!
Changelog terperinci dapat ditemukan di changelog.md
npm install geolibyarn add geolibAda build UMD dan build modul ES . Anda dapat menggunakan Node Build UMD seperti perpustakaan lainnya:
const geolib = require ( 'geolib' ) ;atau di browser dengan menggunakan elemen skrip sederhana:
< script src =" lib/geolib.js " > </ script > Jika Anda memuatnya di browser, Anda dapat mengakses semua fungsi melalui window.geolib .
Jika Anda bekerja dengan bundler (seperti webpack atau parsel) atau memiliki lingkungan yang mendukung modul ES secara asli, Anda dapat mengimpor fungsi tertentu dari paket secara langsung:
import { getDistance } from 'geolib' ;Atau muat seluruh perpustakaan:
import * as geolib from 'geolib' ;Atau Anda dapat mengimpor fungsi tunggal secara langsung untuk berpotensi memanfaatkan treeshaking (disarankan):
import getDistance from 'geolib/es/getDistance' ; Perpustakaan ini ditulis dalam TypeScript. Anda tidak perlu tahu naskah untuk menggunakan geolib tetapi definisi jenis memberi Anda informasi berharga tentang penggunaan umum, parameter input dll.
Semua metode yang bekerja dengan koordinat menerima objek dengan lat / latitude dan properti lon / lng / longitude , atau geojson mengoordinasikan array, seperti: [lon, lat] . Semua nilai dapat berupa format desimal ( 53.471 ) atau sexagesimal ( 53° 21' 16" ).
Nilai jarak selalu mengapung dan mewakili jarak dalam meter .
getDistance(start, end, accuracy = 1)Menghitung jarak antara dua koordinat geo.
Fungsi ini membutuhkan hingga 3 argumen. 2 argumen pertama harus valid GeolibInputCoordinates (misalnya {latitude: 52.518611, longitude: 13.408056} ). Koordinat dapat dalam format seksagessimal atau desimal. Argumen ketiga adalah akurasi (dalam meter). Secara default akurasi adalah 1 meter. Jika Anda memerlukan hasil yang lebih akurat, Anda dapat mengaturnya ke nilai yang lebih rendah, misalnya ke 0.01 untuk akurasi sentimeter. Anda dapat mengaturnya lebih tinggi untuk mendapatkan hasil yang dibulatkan ke nilai berikutnya yang dapat dibagi dengan akurasi yang Anda pilih (misalnya 25428 dengan akurasi 100 menjadi 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.' ) ;
}
) ;Mengembalikan jarak dalam meter sebagai nilai numerik.
getPreciseDistance(start, end, accuracy = 1) Menghitung jarak antara dua koordinat geo. Metode ini lebih akurat daripada getDistance , terutama untuk jarak jauh tetapi juga lebih lambat. Ini menggunakan formula Vincenty Inverse untuk ellipsoids.
Dibutuhkan argumen yang sama (hingga 3) sebagai getDistance .
geolib . getPreciseDistance (
{ latitude : 51.5103 , longitude : 7.49347 } ,
{ latitude : "51° 31' N" , longitude : "7° 28' E" }
) ;getCenter(coords)Menghitung pusat geografis dari semua titik dalam kumpulan koordinat geo. Mengambil serangkaian koordinat dan menghitung pusatnya.
geolib . getCenter ( [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;Mengembalikan objek:
{
"latitude" : centerLat ,
"longitude" : centerLon
}getCenterOfBounds(coords)Menghitung pusat batas koordinat geo.
Mengambil serangkaian koordinat, menghitung perbatasan itu, dan mengembalikan pusat persegi panjang itu.
Pada poligon seperti perbatasan politik (mis. Negara -negara), ini mungkin memberikan hasil yang lebih dekat dengan harapan manusia, daripada getCenter , karena fungsi itu dapat terganggu dengan distribusi titik yang tidak merata di sisi yang berbeda.
Bayangkan Negara Bagian AS Oklahoma: getCenter yang memberikan titik selatan, karena perbatasan selatan berisi lebih banyak node, daripada yang lain.
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 } ,
] ) ;Mengembalikan objek:
{
"latitude" : centerLat ,
"longitude" : centerLng
}getBounds(points)Menghitung batas koordinat geo.
geolib . getBounds ( [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;Ini mengembalikan garis lintang minimum dan maksimum dan bujur minimum dan maksimum sebagai objek:
{
"minLat" : minimumLatitude ,
"maxLat" : maximumLatitude ,
"minLng" : minimumLongitude ,
"maxLng" : maximumLongitude ,
}isPointInPolygon(point, polygon)Memeriksa apakah suatu titik ada di dalam poligon atau tidak.
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 } ,
] ) ; Mengembalikan true atau false
isPointWithinRadius(point, centerPoint, radius)Memeriksa apakah suatu titik ada di dalam lingkaran atau tidak.
// 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
) ; Mengembalikan true atau false
getRhumbLineBearing(origin, destination)Mendapat Bantalan Garis Rhumb dari dua poin. Cari tahu tentang perbedaan antara garis rhumb dan bantalan lingkaran besar di Wikipedia. Garis rhumb harus baik -baik saja dalam banyak kasus:
http://en.wikipedia.org/wiki/rhumb_line#general_and_mathematical_description
Fungsi sangat didasarkan pada versi PHP hebat Doug Vanderweide (dilisensikan di bawah GPL 3.0) http://www.dougv.com/2009/07/13/calculating-the-bearing-and-compass-rose-direction-between-two-latitude-longitude-coordinates-in-php/
geolib . getRhumbLineBearing (
{ latitude : 52.518611 , longitude : 13.408056 } ,
{ latitude : 51.519475 , longitude : 7.46694444 }
) ;Pengembalian yang dihitung bantalan sebagai angka.
getGreatCircleBearing(origin, destination)Mendapat bantalan lingkaran yang bagus dari dua poin. Ini lebih akurat daripada bantalan garis rhumb tetapi juga lebih lambat.
geolib . getGreatCircleBearing (
{ latitude : 52.518611 , longitude : 13.408056 } ,
{ latitude : 51.519475 , longitude : 7.46694444 }
) ;Pengembalian yang dihitung bantalan sebagai angka.
getCompassDirection(origin, destination, bearingFunction = getRhumbLineBearing) Mendapatkan arah kompas dari koordinat asal ke koordinat tujuan. Secara opsional suatu fungsi untuk menentukan bantalan dapat dilewati sebagai parameter ketiga. Default adalah getRhumbLineBearing .
geolib . getCompassDirection (
{ latitude : 52.518611 , longitude : 13.408056 } ,
{ latitude : 51.519475 , longitude : 7.46694444 }
) ; Mengembalikan arah (misalnya NNE , SW , E , ...) sebagai string.
orderByDistance(point, arrayOfPoints)Mengurutkan serangkaian koorden berdasarkan jarak ke koordinat referensi.
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 } ,
] ) ;Mengembalikan serangkaian poin yang dipesan oleh jarak mereka ke titik referensi.
findNearest(point, arrayOfPoints) Menemukan satu titik terdekat ke koordinat referensi. Ini sebenarnya hanya metode kenyamanan yang menggunakan orderByDistance di bawah kap dan mengembalikan hasil pertama.
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 } ,
] ) ;Mengembalikan titik terdekat ke titik referensi.
getPathLength(points, distanceFunction = getDistance) Menghitung panjang kumpulan koordinat. Mengharapkan serangkaian poin sebagai argumen pertama dan secara opsional suatu fungsi untuk menentukan jarak sebagai argumen kedua. Default adalah getDistance .
geolib . getPathLength ( [
{ latitude : 52.516272 , longitude : 13.377722 } ,
{ latitude : 51.515 , longitude : 7.453619 } ,
{ latitude : 51.503333 , longitude : - 0.119722 } ,
] ) ;Mengembalikan panjang jalur dalam meter sebagai angka.
getDistanceFromLine(point, lineStart, lineEnd, accuracy = 1)Mendapat jarak minimum dari titik ke garis dua poin.
geolib . getDistanceFromLine (
{ latitude : 51.516 , longitude : 7.456 } ,
{ latitude : 51.512 , longitude : 7.456 } ,
{ latitude : 51.516 , longitude : 7.459 }
) ;Mengembalikan jarak terpendek ke garis yang diberikan sebagai angka.
Catatan: Jika semua poin terlalu dekat, fungsi mungkin mengembalikan NAN. Dalam hal ini biasanya membantu untuk sedikit meningkatkan akurasi (misalnya 0.01 ).
getBoundsOfDistance(point, distance)Menghitung koordinat pembatas semua titik pada permukaan bumi kurang dari atau sama dengan jarak lingkaran besar yang ditentukan.
geolib . getBoundsOfDistance (
{ latitude : 34.090166 , longitude : - 118.276736555556 } ,
1000
) ;Mengembalikan array dengan koordinat barat daya dan timur laut.
isPointInLine(point, lineStart, lineEnd)Menghitung jika titik yang diberikan terletak pada baris yang dibentuk oleh awal dan akhir.
geolib . isPointInLine (
{ latitude : 0 , longitude : 10 } ,
{ latitude : 0 , longitude : 0 } ,
{ latitude : 0 , longitude : 15 }
) ;sexagesimalToDecimal(value)Mengubah koordinat seksualmal menjadi format desimal
geolib . sexagesimalToDecimal ( `51° 29' 46" N` ) ;Mengembalikan nilai baru sebagai nomor desimal.
decimalToSexagesimal(value)Mengubah koordinat desimal ke format seksualmal
geolib . decimalToSexagesimal ( 51.49611111 ) ; // -> 51° 29' 46`Mengembalikan nilai baru sebagai string seksagessimal.
geolib.getLatitude(point, raw = false)geolib.getLongitude(point, raw = false)Mengembalikan garis lintang/bujur untuk titik tertentu dan mengubahnya menjadi desimal. Jika argumen kedua diatur ke true, itu tidak mengubah nilai menjadi desimal.
geolib . getLatitude ( { lat : 51.49611 , lng : 7.38896 } ) ; // -> 51.49611
geolib . getLongitude ( { lat : 51.49611 , lng : 7.38896 } ) ; // -> 7.38896Mengembalikan nilai sebagai desimal atau dalam format aslinya jika argumen kedua diatur ke true.
toDecimal(point) Periksa apakah koordinat sudah dalam format desimal dan, jika tidak, mengubahnya menjadi. Bekerja dengan nilai tunggal (mis. 51° 32' 17" ) dan koordinat lengkap (misalnya {lat: 1, lon: 1} ) selama itu dalam format yang didukung.
geolib . toDecimal ( `51° 29' 46" N` ) ; // -> 51.59611111
geolib . toDecimal ( 51.59611111 ) ; // -> 51.59611111Mengembalikan nilai desimal untuk nilai input yang diberikan.
computeDestinationPoint(point, distance, bearing, radius = earthRadius)Menghitung titik tujuan yang diberikan titik awal, jarak (dalam meter) dan bantalan (dalam derajat). Jika tidak ada jari -jari yang diberikan itu default ke jari -jari tanah rata -rata 6.371.000 meter.
Perhatian: Formula ini tidak 100% akurat (tapi sangat dekat).
geolib . computeDestinationPoint (
{ latitude : 52.518611 , longitude : 13.408056 } ,
15000 ,
180
) ; geolib . computeDestinationPoint (
[ 13.408056 , 52.518611 ]
15000 ,
180
) ;Mengembalikan tujuan dalam format yang sama dengan koordinat input. Jadi, jika Anda melewati poin Geojson, Anda akan mendapatkan poin Geojson.
getAreaOfPolygon(points)Menghitung luas permukaan poligon.
geolib . getAreaOfPolygon ( [
[ 7.453635617650258 , 51.49320556213869 ] ,
[ 7.454583481047989 , 51.49328893754685 ] ,
[ 7.454778172179346 , 51.49240881084831 ] ,
[ 7.453832678225655 , 51.49231619246726 ] ,
[ 7.453635617650258 , 51.49320556213869 ] ,
] ) ;Mengembalikan hasilnya sebagai angka dalam meter persegi.
getCoordinateKeys(point)Mendapatkan nama properti yang digunakan pada titik dalam bentuk yang dinormalisasi:
geolib . getCoordinateKeys ( { lat : 1 , lon : 1 } ) ;
// -> { latitude: 'lat', longitude: 'lon' } Mengembalikan objek dengan properti latitude dan longitude . Nilai -nilai mereka adalah nama properti untuk garis lintang dan bujur yang digunakan pada titik yang diteruskan. Mungkin hanya digunakan secara internal.
getCoordinateKey(point, keysToLookup) Digunakan oleh getCoordinateKeys di bawah kap dan mengembalikan nama properti dari daftar nama yang mungkin.
geolib . getCoordinateKey ( { latitude : 1 , longitude : 2 } , [ 'lat' , 'latitude' ] ) ;
// -> latitude Mengembalikan nama properti sebagai string atau undefined jika tidak ada yang tidak cocok.
isValidCoordinate(point)Periksa apakah titik tertentu memiliki setidaknya garis lintang dan bujur dan dalam format yang didukung.
// true:
geolib . isValidCoordinate ( { latitude : 1 , longitude : 2 } ) ;
// false, longitude is missing:
geolib . isValidCoordinate ( { latitude : 1 } ) ;
// true, GeoJSON format:
geolib . isValidCoordinate ( [ 2 , 1 ] ) ; Mengembalikan true atau false .
getSpeed(startPointWithTime, endPointWithTime)Menghitung kecepatan antara dua titik dalam rentang waktu tertentu.
geolib . getSpeed (
{ latitude : 51.567294 , longitude : 7.38896 , time : 1360231200880 } ,
{ latitude : 52.54944 , longitude : 13.468509 , time : 1360245600880 }
) ;Kembalikan kecepatan dalam meter per detik sebagai angka.
convertSpeed(value, unit) Mengubah hasil dari getSpeed menjadi format yang lebih ramah manusia. Unit yang tersedia saat ini adalah mph dan kmh .
unit bisa menjadi salah satu dari:
geolib . convertSpeed ( 29.8678 , 'kmh' ) ;Mengembalikan nilai yang dikonversi sebagai angka.
convertDistance(value, unit)Mengubah jarak yang diberikan (dalam meter) menjadi unit lain.
unit bisa menjadi salah satu dari:
geolib . convertDistance ( 14200 , 'km' ) ; // 14.2
geolib . convertDistance ( 500 , 'km' ) ; // 0.5Mengembalikan jarak yang dikonversi sebagai angka.
convertArea(value, unit) Mengubah hasil dari getAreaForPolygon menjadi unit yang berbeda.
unit bisa menjadi salah satu dari:
geolib . convertArea ( 298678 , 'km2' ) ) ;Mengembalikan area yang dikonversi sebagai angka.
wktToPolygon(wkt)Mengubah teks terkenal (alias WKT) menjadi poligon yang dipahami Geolib. https://en.wikipedia.org/wiki/well-known_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 },}
// ]Mengembalikan berbagai koordinat.
Dalam versi 3.0.0 saya mencoba untuk mendapatkan sedikit kembali ke akar . Geolib pernah dimulai karena saya membutuhkan beberapa metode untuk melakukan tugas -tugas terkait geo yang sangat spesifik seperti mendapatkan jarak atau arah antara dua titik. Karena itu adalah salah satu perpustakaan pertama di NPM saat itu untuk melakukan hal -hal semacam ini dengan cara yang sangat sederhana menjadi sangat populer (dengan lebih dari 300 ribu unduhan per bulan pada April 2019!) Dan sebagai akibatnya mendapat banyak kontribusi selama bertahun -tahun. Banyak dari yang baru saja saya gabungkan selama mereka memiliki tes yang menyertainya, tanpa melihat konsistensi, konvensi, kompleksitas, gaya pengkodean atau bahkan kualitas keseluruhan fungsi yang kadang -kadang saya bahkan tidak sepenuhnya mengerti.
Saya sekarang telah membersihkan basis kode sepenuhnya, membangun kembali seluruh perpustakaan "dari awal", menyatukan semua argumen fungsi, menghapus beberapa fungsi di mana saya tidak yakin apakah mereka harus ada di sini (jangan ragu untuk menambahkannya kembali dari Anda menggunakannya!) Atau jika mereka bahkan digunakan (lakukan beberapa pencarian di Github untuk nama fungsi, ternyata tidak ada hasil nol).
Dukungan ketinggian dijatuhkan, serta beberapa fungsi yang tidak perlu membuat perpustakaan sangat besar dalam ukuran (misalnya isPointInsideRobust sendiri lebih dari 700 [!] Baris kode dan pada dasarnya diambil dari perpustakaan yang berbeda).
Saya menghapus Grunt dari proses pembangunan, menambahkan alat "modern" seperti Eslint dan lebih cantik. Saya beralih dari Travis CI ke Circle CI dan saya sedang dalam proses mengotomatisasi lebih lanjut proses pelepasan versi baru menggunakan semantic-release dan conventional-commits . Saya juga beralih dari JavaScript murni ke TypeScript karena saya pikir itu memang memiliki beberapa manfaat.
getDistance default dari yang lambat, akurat menjadi yang cepat, sedikit tidak akurat. Fungsi getDistance lama sekarang bernama getPreciseDistance sedangkan fungsi getDistanceSimple lama sekarang menjadi fungsi getDistance default. Anda dapat, bagaimanapun, meneruskan getPreciseDistance sebagai argumen untuk fungsi apa pun yang menggunakan perhitungan jarak secara internal.getBoundsOfDistance() sekarang mengembalikan koordinat yang tepat karena penghapusan batasan tempat desimal 8 buatangetCompassDirection() tidak lagi mengembalikan objek dengan arah yang tepat dan kasar tetapi hanya arah yang tepat sebagai stringgetCompassDirection() tidak lagi menjadi string ("lingkaran", "garis") tetapi fungsi untuk menentukan bantalan (Anda dapat melewati getRhumbLineBearing atau getGreatCircleBearing ). Fungsi menerima asal dan tujuan sebagai argumen pertama dan kedua. Jika tidak ada argumen ke -3 yang diberikan, getRhumbLineBearing(origin, dest) digunakan secara default.roughCompassDirection(exact) jika Anda benar -benar hanya membutuhkan arah yang sangat kasar (dan berpotensi tidak akurat atau tidak pantas). Lebih baik jangan gunakan itu.orderByDistance() tidak lagi memodifikasi inputnya sehingga tidak menambahkan distance dan properti key ke koordinat yang dikembalikan.getSpeed() sekarang selalu dikembalikan sebagai meter per detik . Ini dapat dikonversi menggunakan fungsi kenyamanan baru convertSpeed(mps, targetUnit)findNearest() tidak lagi mengambil offset dan limit argumen. Ini hanya metode kenyamanan untuk mendapatkan satu titik terdekat dari satu set koordinat. Jika Anda membutuhkan lebih dari satu, lihat implementasinya dan mengimplementasikan logika Anda sendiri menggunakan orderByDistance52° 46' 21.0004" dalam kasus yang jarang terjadi tetapi juga lebih akurat daripada sebelumnya.computeDestinationPointgetBoundsgetBoundsOfDistancegetCentergetCenterOfBoundsgetCompassDirectiongetDistanceFromLinegetPathLengthgetRhumbLineBearinggetSpeedisDecimalisPointInLineisPointNearLineisSexagesimalorderByDistancegetKeys berganti nama menjadi getCoordinateKeysvalidate berganti nama menjadi isValidCoordinategetLat berganti nama menjadi getLatitudegetLon berganti nama menjadi getLongitudelatitude -> berganti nama menjadi getLatitudelongitude -> berganti nama menjadi getLongitudeconvertUnit -> Realmamed to ConvertDistance, karena nama terlalu ambiguuseDecimal berganti nama menjadi toDecimaldecimal2sexagesimal berganti nama menjadi decimalToSexagesimalsexagesimal2decimal berganti nama menjadi sexagesimalToDecimalgetDistance berganti nama menjadi getPreciseDistancegetDistanceSimple diganti namanya menjadi getDistanceisPointInside diganti namanya menjadi isPointInPolygonisPointInCircle berganti nama menjadi isPointWithinRadiusgetBearing berganti nama menjadi getGreatCircleBearing menjadi lebih eksplisitgetElev -> Dihapuselevation -> Dihapuscoords -> dihapus (mungkin ditambahkan kembali sebagai getCoordinate atau getNormalizedCoordinate)ll -> dihapus (karena wtf?)preparePolygonForIsPointInsideOptimized -> dihapus karena dokumentasi yang hilang dan tes yang hilangisPointInsideWithPreparedPolygon -> dihapus karena dokumentasi yang hilangisInside -> dihapus (terlalu ambigu) - Gunakan isPointInPolygon atau isPointWithinRadiuswithinRadius -> dihapus, gunakan isPointWithinRadiusgetDirection Alias -> dihapus (kekacauan yang tidak perlu) - Gunakan getCompassDirectiongetAreaOfPolygon untuk menghitung area poligongetCoordinateKey untuk mendapatkan nama properti (misalnya lat atau lng objek berdasarkan array nama yang mungkin)