Географическое положение, широта и долгота не определены после первого вызова - PullRequest
0 голосов
/ 29 мая 2018

У меня есть кнопка, которая вызывает функцию с именем HomeTest ().В этой функции я вызываю geoFindMe (), простую функцию геолокации.Этот geoFindMe () дает мне переменную широту и переменную долготу.В HomeTest () я использую эти переменные, чтобы увидеть, нахожусь ли я в определенном многоугольнике.Если я нахожусь в правильном многоугольнике, кнопка должна измениться на другой .html-файл

Моя проблема заключается в том, что я должен нажать кнопку ДВАЖДЫ, чтобы сайт загрузился на новом.html-файл, так как он, кажется, не получает переменные широты и долготы с первой попытки, хотя я вызываю geoFindMe () перед использованием переменных.Я немного новичок в js, поэтому я не совсем уверен, почему меня не перемещают в новый .html-файл после одного клика, когда я нахожусь в нужной области.У кого-нибудь есть идеи?

function geoFindMe() {
  if (!navigator.geolocation){
    output.innerHTML = "<p>Your browser doesn't support geolocation.</p>";
    return;
  }

  function success(position) {
    latitude  = position.coords.latitude;
    longitude = position.coords.longitude;

  };

  function error() {
    output.innerHTML = "The site was not able to locate you";
    alert("Please use another browser.");
  };


  navigator.geolocation.getCurrentPosition(success, error);
}


function HomeTest(){
    geoFindMe();
    var polygon = [ [ longitude1, latitude1], [ longitude2, latitude2], [ longitude3, latitude3], [ longitude4, latitude4] ];
    insideTest([ longitude, latitude ], polygon); // true -> point coordinates that are searched
   //alert("is inside is " + isInsideTest + " " + latitude + " " + longitude);
    //Test_LockButton();
    if(isInsideTest){
        location.href = './html/testhome.html';
    }
}

Эта функция проверяет, находятся ли широта и долгота в 4 точках многоугольника (см. Выше)

function insideTest(point, vs) {

    var x = point[0], y = point[1];

    for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {
        var xi = vs[i][0], yi = vs[i][1];
        var xj = vs[j][0], yj = vs[j][1];

        var intersect = ((yi > y) != (yj > y))
            && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
        if (intersect) isInsideTest = !isInsideTest;
    }

    return isInsideTest;
}

1 Ответ

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

Это достаточно простая проблема, которая вызывает у вас это горе, функция getCurrentPosition является асинхронной, то есть у вас нет результата к тому времени, когда вы вызываете insideTest.Когда вы нажимаете второй раз, переменные были сохранены, и все работает, как ожидалось.Если вы установите задержку в несколько сотен миллисекунд перед вызовом insideTest, все будет в порядке, однако это не очень хорошая практика, лучше определить функцию обратного вызова для вызова, когда позиция доступна, вот пример:

function insideTest(point, vs) {

    var isInsideTest = false;
    var x = point[0], y = point[1];

    for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {
        var xi = vs[i][0], yi = vs[i][1];
        var xj = vs[j][0], yj = vs[j][1];

        var intersect = ((yi > y) != (yj > y))
            && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
        if (intersect) isInsideTest = !isInsideTest;
    }

    return isInsideTest;
}

function geoFindMe(successCallback) {
    if (!navigator.geolocation){
        output.innerHTML = "<p>Your browser doesn't support geolocation.</p>";
        return;
    }

    function success(position) {
        latitude  = position.coords.latitude;
        longitude = position.coords.longitude;
        successCallback();
    };

    function error() {
        output.innerHTML = "The site was not able to locate you";
        alert("Please use another browser.");
    };

    navigator.geolocation.getCurrentPosition(success, error);
}

function homeTestCallback() {
    var polygon = [ [ longitude1, latitude1], [ longitude2, latitude2], [ longitude3, latitude3], [ longitude4, latitude4] ];
    var isInsidePolygon = insideTest([ longitude, latitude ], polygon);
    if(isInsidePolygon) {
        location.href = './html/testhome.html';
    }
}

function HomeTest() {
    // Pass in a function to call when the position is ready
    geoFindMe(homeTestCallback);
}
...