Flutter Firebase GeoQueries 返回大量虚假数据
Flutter Firebase GeoQueries is giving back a lot of false data
我正在构建一个类似于 Uber eats 的订餐应用程序。所以,我正在使用 flutter 制作一个应用程序,但是现在我 运行 遇到了寻找最近的 restau运行ts.
的问题
我目前正在使用 geoflutterfire 包存储位置详细信息。请参阅所附图片。
看看我的代码。
getLocation() async {
// Create a geoFirePoint
GeoFirePoint center =
geo.point(latitude: 28.706707247639613, longitude: 80.58572410373661);
// get the collection reference or query
var collectionReference = _firestore.collection('locations');
double radius = 5;
String field = 'position';
Stream<List<DocumentSnapshot>> stream = geo
.collection(collectionRef: collectionReference)
.within(center: center, radius: radius, field: field);
stream.forEach((element) {
element.forEach((e) {
double fbLat = e.get('position')['geopoint'].latitude;
double fbLng = e.get('position')['geopoint'].longitude;
LatLng loc2 = LatLng(fbLat, fbLng);
LatLng loc1 = LatLng(center.latitude, center.longitude);
final distance =
distanceBetweenTwoLocations(location1: loc1, location2: loc2);
print('=======distance is ======');
print('${distance / 1000}KM');
});
});
}
是的,我正在从数据库中返回最近的位置,但是我返回了 30 多个结果,其中只有 6-7 个是正确的,我认为扩展效率不高,因为它增加了我的读取以及客户端的开销以过滤它们。
现在我的问题是,我如何实现完美的地理查询来过滤云 Firestore 中最近的餐厅运行TS 和驱动程序?请帮忙
Firestore 的大多数地理查询实现(例如一个 documented by Firebase itself) use geohash 值允许对两个值进行范围查询 (lat/lon)。虽然 geohash 值允许地理查询运行,但根据定义它们是不精确的, 它们匹配矩形区域中的项目。
当您在绿色区域中查找文档时,geohashes 的范围实际上可能会扩展到包括红色区域:
要将返回的项目限制在您想要的圆半径范围内,您需要 post- 处理您正在做的结果。在我的测试中,查询读取的文档比需要的多 5 倍,有些查询(通常是结果更少的查询)读取的文档多 15 倍。基于此,您的结果似乎是平均水平。
如果你有兴趣了解更多,我建议你看看我几年前做的一次演讲的视频:Querying Firebase and Firestore based on geographic location or distance。
我正在构建一个类似于 Uber eats 的订餐应用程序。所以,我正在使用 flutter 制作一个应用程序,但是现在我 运行 遇到了寻找最近的 restau运行ts.
的问题我目前正在使用 geoflutterfire 包存储位置详细信息。请参阅所附图片。
看看我的代码。
getLocation() async {
// Create a geoFirePoint
GeoFirePoint center =
geo.point(latitude: 28.706707247639613, longitude: 80.58572410373661);
// get the collection reference or query
var collectionReference = _firestore.collection('locations');
double radius = 5;
String field = 'position';
Stream<List<DocumentSnapshot>> stream = geo
.collection(collectionRef: collectionReference)
.within(center: center, radius: radius, field: field);
stream.forEach((element) {
element.forEach((e) {
double fbLat = e.get('position')['geopoint'].latitude;
double fbLng = e.get('position')['geopoint'].longitude;
LatLng loc2 = LatLng(fbLat, fbLng);
LatLng loc1 = LatLng(center.latitude, center.longitude);
final distance =
distanceBetweenTwoLocations(location1: loc1, location2: loc2);
print('=======distance is ======');
print('${distance / 1000}KM');
});
});
}
是的,我正在从数据库中返回最近的位置,但是我返回了 30 多个结果,其中只有 6-7 个是正确的,我认为扩展效率不高,因为它增加了我的读取以及客户端的开销以过滤它们。
现在我的问题是,我如何实现完美的地理查询来过滤云 Firestore 中最近的餐厅运行TS 和驱动程序?请帮忙
Firestore 的大多数地理查询实现(例如一个 documented by Firebase itself) use geohash 值允许对两个值进行范围查询 (lat/lon)。虽然 geohash 值允许地理查询运行,但根据定义它们是不精确的, 它们匹配矩形区域中的项目。
当您在绿色区域中查找文档时,geohashes 的范围实际上可能会扩展到包括红色区域:
要将返回的项目限制在您想要的圆半径范围内,您需要 post- 处理您正在做的结果。在我的测试中,查询读取的文档比需要的多 5 倍,有些查询(通常是结果更少的查询)读取的文档多 15 倍。基于此,您的结果似乎是平均水平。
如果你有兴趣了解更多,我建议你看看我几年前做的一次演讲的视频:Querying Firebase and Firestore based on geographic location or distance。