html5 API геолокации с геозоной - PullRequest
0 голосов
/ 21 мая 2018

Я работаю над проектом с использованием API геолокации HTML5 и в настоящее время использую socket.io, чтобы позволить пользователю находить других в удаленном месте.Теперь для моей следующей цели я хочу, чтобы мое приложение создавало своего рода геозону, которая отправляет уведомление, если пользователи находятся за границей.

Теперь мой вопрос:

  • Могу ли я сделать это без использования какой-либо базы данных?
  • Можно ли использовать только Javascript?

Я использую карты Google, если кто-нибудьспрашивает

1 Ответ

0 голосов
/ 21 мая 2018

Для вас есть способ следить за изменениями в геопозиции. navigator.geolocation.watchPosition

Но нет доступного API геозоны, поэтому вы должны создать его самостоятельно:

Я сделал два класса: SquareGeofenceRegion & CircularGeofenceRegion которые имеют одинаковые API, но рассчитываются по-разному.

class CircularGeofenceRegion {
  constructor(opts) {
    Object.assign(this, opts)
  }

  inside(lat2, lon2) {
    const lat1 = this.latitude
    const lon1 = this.longitude
        const R = 63710; // Earth's radius in m

    return Math.acos(Math.sin(lat1)*Math.sin(lat2) + 
                     Math.cos(lat1)*Math.cos(lat2) *
                     Math.cos(lon2-lon1)) * R < this.radius;
  }
}

class SquareGeofenceRegion {
  constructor(opts) {
    Object.assign(this, opts)
  }

  inside(lat, lon) {
    const x = this.latitude
    const y = this.longitude
    const { axis } = this

    return lat > (x - axis) && 
           lat < (x + axis) &&
           lon > (y - axis) &&
           lon < (y + axis)
  }
}

const fenceA = new CircularGeofenceRegion({
  name: 'myfence',
  latitude: 59.345635,
  longitude: 18.059707,
  radius: 1000 // meters
});

const fenceB = new SquareGeofenceRegion({
  name: 'myfence',
  latitude: 59.345635,
  longitude: 18.059707,
  axis: 1000 // meters in all 4 directions
})

const fences = [fenceA, fenceB]
const options = {}

navigator.geolocation.watchPosition(({coords}) => {
  for (const fence of fences) {
    const lat = coords.latitude
    const lon = coords.longitude

    if (fence.inside(lat, lon)) {
      // do some logic
    }
  }
}, console.error, options);

Я просто хочу предупредить вас, что watchPosition не всегда может быть активировано, когда оно находится в фоновом режиме: Можно ли просматривать местоположение в фоновом режиме на мобильном устройстве (iOS / Android)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...