Flutter Geofire 和 Firestore 读取问题
Posted
技术标签:
【中文标题】Flutter Geofire 和 Firestore 读取问题【英文标题】:Flutter Geofire and Firestore reads problem 【发布时间】:2020-02-03 07:29:42 【问题描述】:我需要询问有关 Firestore 读数的信息,我开发了一个简单的应用程序,它可以根据半径(最大 10 公里)找到离我最近的人。 问题在于,在同时使用该应用程序的 10,000 名注册用户中,Firestore 的读数呈指数级上升。我使用flutter_geofire插件进行颤振。有没有办法智能地缓存这些数据? 理论上,firestore 会保存电话,但经过各种测试后我不明白多久。 谢谢!
【问题讨论】:
【参考方案1】:我不了解缓存,但一些一般性建议是将用户划分为多个部分。使用 GPS 时,您可以通过 Google 的 Reverse Geocoding API 检测到该人所在的国家/地区。此外,您还可以使用 administrative_area_level_1 来获取州/省,或者您可以使用 Reverse Geocoding Api 找到其他靠近的城市或州。
所以当用户 1 登录应用程序时,您将获取坐标,使用 Google API 并获取 Country: UK, ClosestCity: London, NearbyCities: [oxford,cambridge,...]。
然后在firestore中写入。
cities -> UK -> London -> rendomgeneratedId - userinfo&coordinates
cities -> UK -> Oxford -> rendomgeneratedId - userinfo&coordinates
cities -> UK -> Cambridge -> rendomgeneratedId - userinfo&coordinates
现在,当居住在牛津的用户 2 将半径设置为 10 公里时,应用程序会获取用户 2 的坐标 -> 查找用户 2 的国家、当前城市和附近城市。 并在 Cloud Firestore 中搜索经度和纬度:
//Search in Oxford
cities.UK.Oxford.rendomgeneratedId.where("longitute", "<", 100)
cities.UK.Oxford.rendomgeneratedId.where("longitute", ">", 50)
//same for latitude
//Search in London
cities.UK.London.rendomgeneratedId.where("longitute", "<", 100)
cities.UK.London.rendomgeneratedId.where("longitute", ">", 50)
etc.
我推荐使用 Flutter 包 LatLong 来计算距离中心 0.5 公里的目的地点:
final Distance distance = const Distance();
final num distanceInMeter = (EARTH_RADIUS * math.PI / 4).round();
final p1 = new LatLng(0.0, 0.0);
final p2 = distance.offset(p1, distanceInMeter, 180);
// LatLng(latitude:-45.219848, longitude:0.0)
print(p2.round());
Flutter latlong
【讨论】:
感谢回复,我在应用程序中使用这种方法,我的问题是同时处理大数据,geoflutter插件不支持limit()结果,所以我无法建立分页。 我明白了,是不是因为用户对象的数据太多了?还是收藏太大了? 因为集合太大,firebase 读取太多。以上是关于Flutter Geofire 和 Firestore 读取问题的主要内容,如果未能解决你的问题,请参考以下文章
相同的 Flutter Web 构建使用 `dhttp` 在本地运行,但使用 `firebase serve` 或 `firebase deploy` 失败
如果没有创建Geofire,我如何检查Geofire是否将用户注销?