Я запрашиваю местоположение пользователя из браузера с помощью navigator.geolocation.getCurrentPosition (), но я хочу проверить, находятся ли они в радиусе 100 футов от центральной точки. Центральная точка будет магазином, и пользователь должен иметь возможность доступа к определенной странице только в том случае, если они находятся в пределах указанного радиуса.
Я довольно плохо знаком с Javascript, поэтому я не был уверен, что простой способ сделать это без вычисления границ радиуса.
<script>
var x = document.getElementById("demo");
function getLocationStarbucks() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(checkPosition, showError);
} else {
location.href="{% url 'location-unavailable' %}"
}
}
function checkPosition(position) {
var lat = position.coords.latitude;
var long = position.coords.longitude;
var centerLat = 100.0;
var centerLong = 100.0;
//calculate radius of 100ft from center coordinates
if ( (lat, long) in radius)
location.href="{% url 'main-update' %}"
else
location.href="{% url 'location-invalid' %}"
}
function showError(error) {
switch(error.code) {
case error.PERMISSION_DENIED:
location.href="{% url 'location-denied' %}"
break;
case error.POSITION_UNAVAILABLE:
location.href="{% url 'location-unavailable' %}"
break;
case error.TIMEOUT:
location.href="{% url 'location-unavailable' %}"
break;
case error.UNKNOWN_ERROR:
location.href="{% url 'location-unavailable' %}"
break;
}
}
</script>
Редактировать: Решение
function getLocation() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(checkPosition, showError);
} else {
// geolocation not supported
location.href="{% url 'location-unavailable' %}"
}
}
function checkPosition(position) {
var centerLat = 123.45;
var centerLong = 123.45;
var userLat = position.coords.latitude;
var userLong = position.coords.longitude;
var dis = getDistanceFromLatLonInFt(centerLat, centerLong, userLat, userLong);
if (dis < 100) {
location.href="{% url 'main-update' %}";
} else {
location.href="{% url 'location-invalid' %}";
}
}
// calculates distance between points in feet
function getDistanceFromLatLonInFt(lat1, lon1, lat2, lon2) {
var R = 20902464; // Radius of the earth in ft
var dLat = deg2rad(lat2-lat1); // deg2rad below
var dLon = deg2rad(lon2-lon1);
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c; // Distance in feet
return d;
}
function deg2rad(deg) {
return deg * (Math.PI/180);
}
function showError(error) {
switch(error.code) {
case error.PERMISSION_DENIED:
location.href="{% url 'location-denied' %}"
break;
case error.POSITION_UNAVAILABLE:
location.href="{% url 'location-unavailable' %}"
break;
case error.TIMEOUT:
location.href="{% url 'location-unavailable' %}"
break;
case error.UNKNOWN_ERROR:
location.href="{% url 'location-unavailable' %}"
break;
}
}