【问题标题】:How to find out nearest location LatLng from firebase real-time database using firebase cloud function in NodeJS如何使用NodeJS中的firebase云功能从firebase实时数据库中找出最近的位置LatLng
【发布时间】:2019-06-16 05:21:07
【问题描述】:

数据库:

大家好, 我正在尝试使用云功能从 1 公里半径内的 firebase 实时数据库中搜索 LatLng。但是在日志中显示的自爆之后,我遇到了一个问题。

问题:

  • 未配置结算帐户。外部网络无法访问 并且配额受到严格限制。配置结算帐号以删除 这些限制
  • 函数执行耗时 60002 毫秒,完成 状态:“超时”

源代码:

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.');
});

【问题讨论】:

    标签: javascript java android node.js


    【解决方案1】:

    由于 Firebase 不支持地理空间查询,我建议使用 geohash

    这在这个 firebase 博客上得到了很好的展示:

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

    【讨论】:

    【解决方案2】:

    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.');
    });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2018-11-21
      • 2018-10-30
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多