Проверить, что пользователь находится в определенном радиусе или нет (Flutter)

Я хочу проверить, находится ли пользователь в своем доме, используя свою геолокацию. Приложение будет работать на переднем плане, и карта отображаться не будет. Широта и долгота дома пользователя будут храниться в Firestore.

Когда пользователь открывает приложение, я хочу проверить, находится ли он в своем доме. Поскольку размер дома может отличаться, я бы рассмотрел его для радиуса в несколько метров.

Любая помощь будет оценена по достоинству.

4 ответа

Это называется геозоной. В этом случае радиус в несколько метров вокруг дома — это геозона.

Вы сможете легко сделать это, используя этот пакет флаттера . Есть много других пакетов для геозон. Проверить на pub.dev

Вы можете сделать следующее:

      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.

Другие вопросы по тегам