当前位置: 首页 > 知识库问答 >
问题:

如何利用NodeJS中的firebase cloud函数从firebase实时数据库中查找最近的LatLng

孔山
2023-03-14

  • 未配置计费帐户。外部网络无法访问,配额受到严重限制。配置计费帐户以删除这些限制
  • 函数执行时间为60002 ms,结束时状态为'timeout'
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.');
});

共有1个答案

施晗日
2023-03-14

因为Firebase不支持地理空间查询,所以我建议使用geohash

这在这个firebase博客上有很好的暴露:

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

 类似资料:
  • 我正在创建一个应用程序,它使用两步对象创建到firebase实时数据库。 我想要的是,在一个捕获onCreate事件的云函数上,如果一些规则不完整,那么create操作就会被停止。 有办法做到这一点吗?或者我需要移除节点而不是拒绝创建? 谢谢你!

  • 我正在尝试读取我的Flutter应用程序中的firebase实时数据库中的数据,并将其分配给模型类,但是,我在控制台中得到了以下错误。 下面是我到目前为止所做的代码 员工类别 我不知道我做错了什么,请帮我解决这个问题

  • 问题内容: 因此,我正在编写一个从redis读取的节点应用程序,我想执行某种查询,该查询返回有人知道怎么做的数据库数量。 因此,现在基本上我所拥有的是一种获取数据库中所有密钥的方法,但是我希望级别更高,我想遍历所有数据库然后获取所有密钥。这是用于获取当前数据库的所有密钥的代码。 问题答案: 解决方案1 正如@carebdayrvis所提到的,您可以使用command获取数据库信息,并解析该信息以获

  • 我如何删除记录“苹果”(在图片中标记)? 根据文档,要移除一个项,需要对引用调用removeValue()。但要获得引用,我需要子ID。因为它是一个随机生成的id(-kisnx87ayigsh3ilp0d),如何删除它?

  • 问题内容: 我想从下面的数据库表中找到最近的位置 我已经从Google地图中获取了所有数据。在这里,我必须找到一个地方最近的位置。假设我在Surkhet地方,其纬度为28.6,经度为81.6,如何找到距Surkhet地方最近的地方。 问题答案: 这是最好的查询

  • firebase数据库最近的更新似乎有一些变化。我的项目在firebase\u数据库:^7.0.0版本下运行良好,但在firebase数据库的更新版本中,我无法更新项目代码。 以下是v7的工作版本 firebase\u数据库^9.0.12上的同一代码出现错误。我收到的错误在`(DataSnapShot snap)async{…}上错误是 无法将参数类型“Future Function(DataSn