Как использовать Google Maps с PubNub в Angular - PullRequest
1 голос
/ 29 мая 2020

Я пытаюсь внедрить систему отслеживания в свое приложение с помощью PubNub. Я создал карту Google, используя Javascript, изменив конфигурации в файле Angular. json. Я вызываю внешний файл javascript.

Я не могу отобразить карту в моем приложении Angular, но когда я использую тот же код в обычном HTML, он работает. Но когда я добавил тот же код в свое приложение Angular, карта не отображается.

HTML:

   <script src="https://cdn.pubnub.com/sdk/javascript/pubnub.4.19.0.min.js"></script>


   <div class="container">
    <h1>PubNub Google Maps - Live Device Location</h1>
    <div id="map" style="width:100%;height:600px"></div>
  </div>

JS:

             window.lat = 28.7041;
             window.lng = 77.1025;

            function getLocation() {
                if (navigator.geolocation) {
                navigator.geolocation.getCurrentPosition(updatePosition);
              }

           return null;
           };

          function updatePosition(position) {
           if (position) {
             window.lat = position.coords.latitude;
            window.lng = position.coords.longitude;
           }
          }

          setInterval(function(){updatePosition(getLocation());}, 20000);

         function currentLocation() {
            return {lat:window.lat, lng:window.lng};
         };

        var map;
        var mark;
        var lineCoords = [];
        var initialize = function() {
        var icon = {
           url: "assests/images/download.png", // url
           scaledSize: new google.maps.Size(30, 30), // scaled size
           origin: new google.maps.Point(0,0), // origin
          anchor: new google.maps.Point(0, 0) // anchor
        };

       map  = new google.maps.Map(document.getElementById('map-canvas'), {center:  {lat:lat,lng:lng},zoom:12});
       mark = new google.maps.Marker({position:{lat:lat, lng:lng}, map:map,
      icon: icon
      });

    };
    window.initialize = initialize;

    var redraw = function(payload) {
        lat = payload.message.lat;
        lng = payload.message.lng;
        map.setCenter({lat:lat, lng:lng, alt:0});
        mark.setPosition({lat:lat, lng:lng, alt:0});
        lineCoords.push(new google.maps.LatLng(lat, lng));
        var lineCoordinatesPath = new google.maps.Polyline({
          path: lineCoords,
          geodesic: true,
          strokeColor: '#FF0000'
        });
        lineCoordinatesPath.setMap(map);
      };

    var pnChannel = "map-channel";

    var pubnub = new PubNub({
      publishKey:   'pub-c-redacted',
      subscribeKey: 'sub-c-redacted'
    });

    pubnub.subscribe({channels: [pnChannel]});
    pubnub.addListener({message:redraw});

    setInterval(function() {
        pubnub.publish({channel:pnChannel, message:{lat:window.lat + 0.001, lng:window.lng + 0.01}});
      }, 10000);

Обнаружение ошибки:

 Uncaught TypeError: Cannot read property 'setCenter' of undefined

1 Ответ

1 голос
/ 30 мая 2020

Прозрачность: я работаю в PubNub и не очень хорошо знаю Google Maps. Я хотел задать несколько вопросов в комментариях, но обнаружил некоторые потенциальные ошибки в вашем коде, поэтому добавил сюда потенциальный ответ с новым кодом, чтобы попробовать. В этом коде есть комментарии, касающиеся потенциальных ошибок. Прокомментируйте, если у вас есть вопросы или если это решит вашу проблему.

Я также добавил дополнительную разметку HTML, например <head> и <body>, и переместил все скрипты / код под тегом <body>. Это может быть или не быть тем, что вам нужно сделать, но все равно должно работать.

<html>
<head>
<title>PubNub & Google Maps</title>
</head>

<body>
<div class="container">
    <h1>PubNub Google Maps - Live Device Location</h1>

    <!-- You used "map" as your id here: 
    <div id="map" style="width:100%;height:600px"></div>
    ... but down in your code you getElementById('map-canvas')
    Shouldn't this id be "map-canvas"? That might be why it doesn't display.
    -->
    <div id="map-canvas" style="width:100%;height:600px"></div>
</div>
</body>

<!-- I don't have the index.js file so I couldn't properly test your code -->
<script src="./assests/js/index.js"></script>

<!-- PubNub JS SDK v4.19.0 is pretty old. You should use the latest version of PubNub JS SDK - v4.27.6 -->
<!-- script src="https://cdn.pubnub.com/sdk/javascript/pubnub.4.19.0.min.js"></script> -->
<script src="https://cdn.pubnub.com/sdk/javascript/pubnub.4.27.6.min.js"></script>

<!-- added this script tag and the closing script tag at the end of this code -->
<script type="text/javascript">
window.lat = 28.7041;
window.lng = 77.1025;

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(updatePosition);
    }

    return null;
};

function updatePosition(position) {
    if (position) {
        window.lat = position.coords.latitude;
        window.lng = position.coords.longitude;
    }
}

setInterval(function(){updatePosition(getLocation());}, 20000);

function currentLocation() {
    return {lat:window.lat, lng:window.lng};
};

var map;
var mark;
var lineCoords = [];
var initialize = function() {
    var icon = {
        url: "assests/images/download.png", // url
           scaledSize: new google.maps.Size(30, 30), // scaled size
           origin: new google.maps.Point(0,0), // origin
          anchor: new google.maps.Point(0, 0) // anchor
      };


      // this is where you do getElementById('map-canvas') 
      // but the id in the `<body>` was `map`
      // I suspect the variable here should be `map` but the id above should
      // be `map-canvas` and that is probably why you get that
      // error when you call `map.setCenter`
      map  = new google.maps.Map(document.getElementById('map-canvas'), {center:  {lat:lat,lng:lng},zoom:12});
      mark = new google.maps.Marker({position:{lat:lat, lng:lng}, map:map,
        icon: icon
      });

  };
  window.initialize = initialize;

  var redraw = function(payload) {
    lat = payload.message.lat;
    lng = payload.message.lng;
    map.setCenter({lat:lat, lng:lng, alt:0});
    mark.setPosition({lat:lat, lng:lng, alt:0});
    lineCoords.push(new google.maps.LatLng(lat, lng));
    var lineCoordinatesPath = new google.maps.Polyline({
        path: lineCoords,
        geodesic: true,
        strokeColor: '#FF0000'
    });
    lineCoordinatesPath.setMap(map);
  };

  var pnChannel = "map-channel";

  // redacted your keys - do not share with public
  var pubnub = new PubNub({
    publishKey:   'pub-c-redacted',
    subscribeKey: 'sub-c-redacted'
  });

  // switched the order of these two lines of code
  // you should addListener first, then subscribe
  pubnub.addListener({message:redraw});
  pubnub.subscribe({channels: [pnChannel]});

  setInterval(function() {
    pubnub.publish({channel:pnChannel, message:{lat:window.lat + 0.001, lng:window.lng + 0.01}});
  }, 10000);

// here's the ending script tag I added that I mentioned above
</script>
</html>

Я знаю, что исправления / рекомендации кода PubNub правильные. Сообщите мне, правильно ли я сказал о проблемах с html / javascript / google maps. Я не смог полностью протестировать ваш код, потому что у меня нет вашего файла кода assests/js/index.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...