Проверить, что пользователь находится в определенном радиусе или нет (Flutter)
Я хочу проверить, находится ли пользователь в своем доме, используя свою геолокацию. Приложение будет работать на переднем плане, и карта отображаться не будет. Широта и долгота дома пользователя будут храниться в Firestore.
Когда пользователь открывает приложение, я хочу проверить, находится ли он в своем доме. Поскольку размер дома может отличаться, я бы рассмотрел его для радиуса в несколько метров.
Любая помощь будет оценена по достоинству.
4 ответа
Вы можете сделать следующее:
double getDistanceBetweenPositions({
required double homeLat,
required double homeLong,
required double userLat,
required double useLong,
}) {
final latDif = radians(homeLat - userLat);
final longDif = radians(homeLong - useLong);
final a = sin(latDif / 2) * sin(latDif / 2) +
cos(radians(userLat)) *
cos(radians(homeLat)) *
sin(longDif / 2) *
sin(longDif / 2);
final b = 2 * atan2(sqrt(a), sqrt(1 - a));
final result = earthRadius * b;
return result;
}
Если расстояние <= размера дома (вашего радиуса), это означает, что пользователь находится в доме.
Вы можете проверить пакет geo_firestore. Он позволяет вам использовать объект GeoPoint и заданный радиус в километрах и возвращает documentSnapshots документов, находящихся в этом радиусе.
Посмотрите на пример ниже:
final List<DocumentSnapshot> nearbyUsersInTheArea =
await geoFirestoreUser.getAtLocation(currentUserAddress,
1000.0);
//here, currentUserAddress is a GeoPoint object and any document which is inside the radius (centre of the circle is my GeoPoint) will be returned as a list of documents
Дополнительные примеры и подробное объяснение см. На сайте geo_firestore.
Есть простой способ:
MouseRegion(
onHover: (event) => setState(() {
Offset mousePosition = event.localPosition;
var circle = Path()..addOval(Rect.fromCircle(center: Offset(0, 0), radius: 50));
bool isHovered = circle.contains(mousePosition);
})
)
Есть две вещи, которые вы должны установить самостоятельно: смещение и радиус круга.
Смещение должно быть посередине вашего дочернего виджета: ширина / 2 и высота / 2. Вы можете получить это с помощью LayoutBuilder, если у вас нет нужного размера.
Радиус может быть шириной / 2.