Как я могу проверить, находится ли текущее местоположение вне установленного радиуса? - PullRequest
2 голосов
/ 11 марта 2020

В настоящее время я работаю над приложением, которое запускает уведомление, когда кто-то находится в квадрате. Следующее определяет квадрат:

var zonebounds = [[30,35], [40,45]];
var zone = L.rectangle(zonebounds, {color: "#ff7800", weight: 1, oppacity: .5});

Я сделал следующее утверждение, чтобы проверить, находится ли кто-то внутри квадрата.

if (posY > zonebounds[0][0] && posY < zonebounds[1][0] && posX > zonebounds[0][1] && posX < zonebounds[1][1] && zoneTimer == 0) {
    ons.notification.toast('Test', { timeout: 5000 });
    zoneTimer = 1;
} else if (posY >! zonebounds[0][0] && posY <! zonebounds[1][0] && posX >! zonebounds[0][1] && posX <! zonebounds[1][1] && zoneTimer == 1) {
    zoneTimer = 0;
}

Я думаю, >!, к сожалению, не ведет себя как я бы этого хотел.

Я сделал переменную zoneTimer, чтобы уведомление не повторялось. Возможно, есть еще лучший способ сделать это.

Обновление

Я исправил это, используя комбинацию двух полученных ответов, вот окончательный результат:

if(zoneBoundslatLng.contains(latLng)){
    if (inZone == 0) {
    inZone = 1;
    ons.notification.toast('Zone 1, klik voor informatie.', { timeout: 5000 });
    }
} else {
    inZone = 0;
}

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

С помощью листовки вы можете проверить, находится ли точка в прямоугольнике.

var bounds = L.latLngBounds(zonebounds);


if(bounds.contains(latlng) ){
    console.log("notify");
}else{
    console.log("nothing");
}

Если ваша точка (posX и posY) - это пиксели, вы можете использовать ее для преобразования:

var point = L.point(posX ,posY); // x=0,y=0
var latlng = map.layerPointToLatLng(point);

Обновление ...

var bounds = L.latLngBounds(zonebounds);

if(bounds.contains(latlng) && zoneTimer == 0){
    zoneTimer = 1;
    ons.notification.toast('Test', { timeout: 5000 });
    console.log("notify");
}else{
    zoneTimer = 0;
    console.log("nothing");
}
2 голосов
/ 11 марта 2020

Для проверки можно использовать обратную сторону >, <=.

Для второй проверки вам необходимо условие ИЛИ.

if (
    posY > zonebounds[0][0] && posY < zonebounds[1][0] &&
    posX > zonebounds[0][1] && posX < zonebounds[1][1] &&
    zoneTimer === 0
) {
    ons.notification.toast('Test', { timeout: 5000 });
    zoneTimer = 1;
} else if (
    (posY <= zonebounds[0][0] || posY >= zonebounds[1][0] || 
    posX <= zonebounds[0][1] || posX >= zonebounds[1][1]) &&
    zoneTimer === 1
) {
    zoneTimer = 0;
}

Более короткая проверка.

if (posY > zonebounds[0][0] && posY < zonebounds[1][0] && posX > zonebounds[0][1] && posX < zonebounds[1][1]) {
    if (zoneTimer === 0) {
        ons.notification.toast('Test', { timeout: 5000 });
        zoneTimer = 1;
    }
} else {
    if (zoneTimer === 1) {
        zoneTimer = 0;
    }
}
...