#javascript #html #cordova #leaflet
#javascript #HTML #кордова #брошюра
Вопрос:
Мне нужно проверять каждые 5 секунд, содержится ли маркер (пользователь) в маркере круга (loc)
function updateLocation(){
if(!isSet){clearInterval(start)}else{
user.setLatLng(new L.LatLng(lat, lng));
if(loc.getBounds().contains(new L.LatLng(lat, lng))){
document.getElementById('setButton').style.background = 'purple'
soundAlarm();
isSet = false;
}
}
}
Выше приведен текущий код, который у меня есть, который вызывается этим:
var start = setInterval(updateLocation, 5000);
Заранее спасибо, Эд.
Комментарии:
1. И что происходит вместо этого?
2. К сожалению, ничего. Он просто действует так, как будто он не видит маркер в circleMarker .
3.
loc.getBounds().contains(new L.LatLng(lat, lng))
Вычисляется как false .4. var start = setInterval(UpdateLocation(), 5000); может быть лучше [примечание добавлено в скобки]
5. Это вызовет функцию только один раз, в отличие от выполнения ее несколько раз.
Ответ №1:
Кажется, вы пытаетесь сделать геозонирование, но странным образом. Зачем полагаться на нарисованный вид CircleMarker
s, когда все, что вам нужно, это знать, меньше ли расстояние от пользователя до чего-либо порогового значения ( CircleMarker
радиуса)?
Просто используйте distance
метод L.Map
:
var guardedLocation = L.latLng(...);
var thresholdDistance = 100; // In meters
var start;
function updateLocation(){
var userPosition = L.latLng(lat, lng);
user.setLatLng(userPosition);
if(map.distance(userPosition, guardedLocation) <= thresholdDistance) {
document.getElementById('setButton').style.background = 'purple'
soundAlarm();
isSet = false;
clearInterval(start);
}
}
start = setInterval(updateLocation, 5000);
Комментарии:
1. Извините, я не отметил ваш ответ как правильный раньше, я был очень занят в последнее время и только что вернулся к проекту. Спасибо, это решение было идеальным.
metresPerPixel = 40075016.686 * Math.abs(Math.cos(map.getCenter().lat * 180/Math.PI)) / Math.pow(2, map.getZoom() 8);
Кстати, я обнаружил, что этот код полезен для преобразования между пикселями и метрами, если у кого-то еще есть эта проблема.
Ответ №2:
Если ваша loc
переменная действительно an L.circleMarker
, пожалуйста, поймите, что по определению маркер — это точка / место, т. Е. У него нет области, следовательно, нет границ. Вероятно, вы изначально хотели использовать L.circle
for loc
.
В листовке 0.x (например, версии 0.7.7) L.circleMarker
наследуется от L.circle
, поэтому у него есть .getBounds()
метод, хотя он бессмыслен. На самом деле он возвращает нулевую область (юго-западные координаты равны северо-восточным координатам, равным положению маркера).
Демонстрация: https://jsfiddle.net/y63u5utf/2 /
Таким образом, ваш код будет фактически оцениваться, true
если местоположение пользователя точно такое же, как у вас loc
.
В листовке 1.x (например, текущая версия 1.0.1) это несоответствие было исправлено, и L.circleMarker
.getBounds()
метод больше не используется.
Демонстрация: https://jsfiddle.net/y63u5utf/1 /
(увеличивайте и уменьшайте масштаб, чтобы увидеть, как радиус красного маркера круга корректируется, чтобы сохранить тот же размер в пикселях, пока при большом увеличении маркер не выйдет из него. В то время как синий круг имеет радиус, который масштабируется в соответствии с масштабированием, поскольку он представляет фактическую длину; поэтому он всегда содержит (или нет) маркер)