Googlemaps Api странное поведение - PullRequest
0 голосов
/ 19 февраля 2020

Я решил поиграть с googlemaps и API ISS, чтобы создать базовый трекер c. Я планирую добавить кучу вещей к этому, но пока это остается простым.

Проблема, с которой я столкнулся, заключается в том, что я могу установить фиктивные значения в asp: метки для широты и долготы, а затем заполнить ими строку, которую я могу использовать с картами Google.

var ISS = { lat: parseFloat(document.getElementById('lblLat').innerText), lng: parseFloat(document.getElementById('lblLong').innerText) };

Это работает, когда я тогда пытаюсь использовать значения, полученные из обратного вызова json, хотя я могу видеть их, когда использую console.log (), они не работают.

ISS = { lat: data['iss_position']['latitude'], lng: data['iss_position']['longitude'] };

I попытался вместо чтения напрямую добавить обратно к asp: Label, а затем прочитать, но это тоже не работает.

Что я делаю не так? Я пытался не добавлять никакой сложности к этому, пока я играю с googlemaps api, но это не работает, сбивает меня с толку, так как я не вижу, что отличается от фиктивных значений по сравнению с тем, что я получаю из API. webpage

Ниже приведен весь мой код для этой страницы.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ISS.aspx.cs" Inherits="WebApps.IIS" %>

<!DOCTYPE html>
<html>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
    <head runat="server">
        <title>ISS Tracker</title>
        <style>
          #map {
            height: 400px;  /* The height is 400 pixels */
            width: 100%;  /* The width is the width of the web page */
           }
          #pageTitle{
              margin: auto;
              padding: 10px;
          }
        </style>
    </head>
    <body>
        <div id="pageTitle">
            <h3>ISS Tracker</h3>
            <h4>International Space Station</h4>
        </div>
        <form runat="server">
            <label>Latitude: </label><asp:Label runat="server" ID="lblLat"/><br />
            <label>Longitude: </label><asp:Label runat="server" ID="lblLong"/><br />
            <label>Time: </label><asp:Label runat="server" ID="lblTime" Text="13/02/2020 15:45:00" /><br />
            <asp:Button runat="server" ID="btnRefresh" Text="Refresh" onClick="btnRefresh_Click" style="height: 26px" />
            <div id="map"></div>
        </form>
        <script>

            //globals
            var map;
            var ISS;// = { lat: parseFloat(document.getElementById('lblLat').innerText), lng: parseFloat(document.getElementById('lblLong').innerText) };
            var image = 'http://icons.iconarchive.com/icons/goodstuff-no-nonsense/free-space/256/international-space-station-icon.png'

            // Initialize and add the map
            function initMap() {
                // The location of ISS
                $.getJSON('http://api.open-notify.org/iss-now.json?callback=?', function (data) {
                    ISS = { lat: data['iss_position']['latitude'], lng: data['iss_position']['longitude'] }; 
                    console.log("latitude: " + data['iss_position']['latitude'] + " & longitude: " + data['iss_position']['longitude']);
                    document.getElementById('lblLat').innerText = data['iss_position']['latitude'];
                    document.getElementById('lblLong').innerText = data['iss_position']['longitude'];
                });
                // The map, centered at ISS
                map = new google.maps.Map(
                    document.getElementById('map'), { zoom: 10, center: ISS });
                // The marker, positioned at ISS
                var marker = new google.maps.Marker({
                    position: ISS,
                    map: map,
                    icon: {
                        url: image,
                        scaledSize: new google.maps.Size(128, 128),
                        size: new google.maps.Size(128, 128)
                    }
                });
                marker.position = ISS;

            }

            //Will use later when i want to update
            function moveISS() {
                $.getJSON('http://api.open-notify.org/iss-now.json?callback=?', function (data) {
                    var lat = data['iss_position']['latitude'];
                    var lon = data['iss_position']['longitude'];
                    ISS = { lat: lat, lng: lon }; 
                    document.getElementById('lblLat').innerText = lat;
                    document.getElementById('lblLong').innerText = lon;
                });
                setTimeout(moveISS, 5000);
            } 
        </script>
        <script async defer src="https://maps.googleapis.com/maps/api/js?key=*****api key *****&callback=initMap">
        </script>
    </body>
</html>

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Похоже, вы ничего не понимаете в JS вызовах API. Когда вы вызываете $ .get JSON, у вас есть метод обратного вызова, который будет иметь результат при загрузке данных. Поэтому, когда вы создаете маркер, вы не определили координаты широты / долготы IIS. Еще одна интересная вещь о JS, которую вы должны знать - JS - это синхронный язык, поэтому ваш обратный вызов будет выполнен после выполнения всех операций (ваша последняя строка для скрипта - marker.position = ISS;). Просто создайте маркер в вашем обратном вызове $ .get JSON, чтобы он заработал

Я создал рабочую демонстрацию, которая исправляет некоторые другие ошибки, которые присутствуют.

здесь я отображаю начальное местоположение - вы необходимо преобразовать координаты в тип числа:

function initMap() {
            // The location of ISS
            $.getJSON('http://api.open-notify.org/iss-now.json?callback=?', function (data) {
                ISS = new google.maps.LatLng(Number(data.iss_position.latitude), Number(data.iss_position.longitude)); 
                console.log("latitude: " + data['iss_position']['latitude'] + " & longitude: " + data['iss_position']['longitude']);
                document.getElementById('lblLat').value = data['iss_position']['latitude'];
                document.getElementById('lblLong').value = data['iss_position']['longitude'];

                // The map, centered at ISS
            map = new google.maps.Map(
                document.getElementById('map'), { zoom: 10, center: ISS });
            // The marker, positioned at ISS
            marker = new google.maps.Marker({
                position: ISS,
                map: map,
                icon: {
                    url: image,
                    scaledSize: new google.maps.Size(128, 128),
                    size: new google.maps.Size(128, 128)
                }
            });

            });   
        }

код маркера перемещения (используйте google классы для определения местоположения нового google.maps.LatLng):

function moveISS() {
            $.getJSON('http://api.open-notify.org/iss-now.json?callback=?', function (data) {
                ISS = new google.maps.LatLng(Number(data.iss_position.latitude), Number(data.iss_position.longitude)); 
                document.getElementById('lblLat').value = data.iss_position.latitude;
                document.getElementById('lblLong').value = data.iss_position.longitude;
                marker.setPosition(ISS);
                map.setCenter(ISS);
            });

            setTimeout(moveISS, 5000);
        } 

http://jsfiddle.net/cheaterr/41h7tmqb/11/

1 голос
/ 19 февраля 2020

Ваша проблема связана с тем, когда что-то происходит

Ваш вызов get JSON запускается, а затем возвращается с ответом на данные в какой-то момент в будущем, однако остальная часть вашего код (с недопустимым значением для ISS) будет выполнен немедленно

var map;
var image = 'http://icons.iconarchive.com/icons/goodstuff-no-nonsense/free-space/256/international-space-station-icon.png';

// ISS start position
var ISS  = { lat: 0.0, lng: 0.0 };

function initMap() {
  // create the map and marker before you know where ISS is
  // The map, centered at ISS
   map = new google.maps.Map(
     document.getElementById('map'), { zoom: 10, center: ISS });
   // The marker, positioned at ISS
   var marker = new google.maps.Marker({
     position: ISS,
     map: map,
     icon: {
       url: image,
       scaledSize: new google.maps.Size(128, 128),
       size: new google.maps.Size(128, 128)
     }
   });


}

function updateISS() {
  // The location of ISS
  $.getJSON('http://api.open-notify.org/iss-now.json?callback=?', 
     function (data) {
       ISS = { 
         lat: data['iss_position']['latitude'], 
         lng: data['iss_position']['longitude'] 
       };

       // update the Marker position here
       marker.setPosition(ISS);

       console.log("latitude: " + ISS['lat'] + " & longitude: " + ISS['lng']);
       document.getElementById('lblLat').innerText = ISS['lat'];
       document.getElementById('lblLong').innerText = ISS['lng'];
     });

}

// update ISS position every 5 seconds.
var repeat = setInterval( updateISS, 5000)

Выше приведен первый проход решения, создание карты и маркера перед вызовом get JSON и обновление позиции маркера при получении ответа JSON.

Также я хотел бы отметить, что вы используете смесь JavaScript и JQuery, которая не очень симпатична

...