簡體   English   中英

如何使用NodeJS中的Firebase雲功能從Firebase實時數據庫中找出最近的位置LatLng

[英]How to find out nearest location LatLng from firebase real-time database using firebase cloud function in NodeJS

數據庫:

在此處輸入圖片說明 大家好,我嘗試使用雲功能從1公里范圍內的Firebase實時數據庫中搜索LatLng。 但是在Logs中顯示的自爆之后,我面臨一個問題。

問題:

  • 未配置結算帳戶。 無法訪問外部網絡,並且配額受到嚴格限制。 配置計費帳戶以消除這些限制
  • 函數執行耗時60002 ms,狀態為:“超時”

源代碼:

 const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); //https://*********.cloudfunctions.net/searchNearbyLatLng?originlat=23.7939419&originlng=90.3888492 exports.searchNearbyLatLng = functions.https.onRequest((request, response) => { let lat1Param = request.query.originlat; let lng1Param = request.query.originlng; let rootRef = admin.database().ref('riders_online'); rootRef.once('value', gotData, errData); function gotData(data) { let items = data.val(); let keys = Object.keys(items); for (let i = 0; i < keys.length; i++) { let key = keys[i]; let item = items[key]; //console.log(item.isUserRequested, item.riderOriginLatitude, key); let distance = getDistance( lat1Param, lng1Param, data.val().riderOriginLatitude, data.val().riderOriginLongitude ); if( distance < 1 ) { response.send('Record' + item.riderOriginLatitude); } } } function errData(error) { console.log("Something went wrong."); console.log(error); } function getDistance( latitude1, longitude1, latitude2, longitude2 ) { let earth_radius = 6371; let dLat = degToRad( latitude2 - latitude1 ); let dLng = degToRad( longitude2 - longitude1 ); let a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(degToRad(latitude1)) * Math.cos(degToRad(latitude2)) * Math.sin(dLng/2) * Math.sin(dLng/2); let c = 2 * Math.asin(Math.sqrt(a)); let d = earth_radius * c; return d; } function degToRad(degrees){ let pi = Math.PI; return degrees * (pi/180); } }, err => { console.error(err.stack); response.status(500).send('Unexpected error.'); }); 

由於Firebase不支持地理空間查詢,因此建議使用geohash

在以下Firebase博客上可以很好地了解這一點:

https://firebase.googleblog.com/2013/09/geofire-location-queries-for-fun-and.html

 const functions = require('firebase-functions'); //const GeoFire = require('geofire'); const admin = require('firebase-admin'); admin.initializeApp(); exports.searchNearbyLatLng = functions.runWith({ memory: '1GB', timeoutSeconds: 120 }).https.onRequest((request, response) => { let lat1Param = request.query.originlat; let lng1Param = request.query.originlng; let lat2Param = request.query.destLat; let lng2Param = request.query.destLng; let rootRef = admin.database().ref('riders_online').orderByChild('isUserRequested').equalTo('false'); rootRef.once('value', gotData, errData); // The data comes back as an object function gotData(data) { let items = data.val(); // Grab all the keys to iterate over the object let keys = Object.keys(items); // Loop through array for (let i = 0; i < keys.length; i++) { let key = keys[i]; let item = items[key]; console.log(item.isUserRequested, item.riderOriginLatitude, key); //response.json(data.val()); let distance = getDistance( lat1Param, lng1Param, item.riderOriginLatitude, item.riderOriginLongitude ); if( distance < 1 ) { let dist = getDistance( lat2Param, lng2Param, item.riderDestinationLatitude, item.riderDestinationLongitude ); if( dist < 1 ) { let jsonData = { "info": { "createdAt": item.info.createdAt, "riderBirthDate": item.info.riderBirthDate, "riderDistrict": item.info.riderDistrict, "riderEmail": item.info.riderEmail, "riderFullName": item.info.riderFullName, "riderGender": item.info.riderGender, "riderImageUrl": item.info.riderImageUrl, "riderLicense": item.info.riderLicense, "riderNid": item.info.riderNid, "riderPhoneNumber": item.info.riderPhoneNumber, "riderToken": item.info.riderToken, "riderVehicle": item.info.riderVehicle, "riderVehicleNo": item.info.riderVehicleNo }, "isUserRequested": item.isUserRequested, "riderAvailableTime": item.riderAvailableTime, "riderDestinationLatitude": item.riderDestinationLatitude, "riderDestinationLongitude": item.riderDestinationLongitude, "riderOriginLatitude": item.riderOriginLatitude, "riderOriginLongitude": item.riderOriginLongitude, "riderPrice": item.riderPrice, "riderToken": item.riderToken } response.json(jsonData); } } } } function errData(error) { console.log("Something went wrong."); console.log(error); } function getDistance( latitude1, longitude1, latitude2, longitude2 ) { let earth_radius = 6371; let dLat = degToRad( latitude2 - latitude1 ); let dLng = degToRad( longitude2 - longitude1 ); let a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(degToRad(latitude1)) * Math.cos(degToRad(latitude2)) * Math.sin(dLng/2) * Math.sin(dLng/2); let c = 2 * Math.asin(Math.sqrt(a)); let d = earth_radius * c; return d; } function degToRad(degrees){ let pi = Math.PI; return degrees * (pi/180); } }, err => { console.error(err.stack); response.status(500).send('Unexpected error.'); }); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM