(Javascript) Как проверить, находятся ли координаты long / lat из navigator.geolocation.getCurrentPosition () в радиусе, основанном на центральной точке? - PullRequest
0 голосов
/ 26 января 2020

Я запрашиваю местоположение пользователя из браузера с помощью 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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...