TypeError: Cannot read property 'geometry' of undefined

0

Występuje taki błąd jak w tytule czy ktoś może mi pomoc gdzie popełniam blad? Skleiłem kod z kilku zródeł i cos nie chce mi sie skompilować.Kod wklejam bo moze troche byc za długi. Z góry dziekuje za pomoc

https://babeljs.io/repl#?browsers=&am[...]on=7.9.0&externalPlugins=

2

Nic nie ma w tym linku, pusty edytor. Co robisz?

0

wkleje jeszcze tutaj:

import React, { Component } from 'react';

import mapboxgl from 'mapbox-gl';

mapboxgl.accessToken = "pk.eyJ1Ijoicm9iZXJ0MTk5NSIsImEiOiJjazhqZGQ4b2owN255M2VxcXBkaHp5cGowIn0.5oKYRrs_iAmrx2HfbpB-Hw";

class App extends Component {

  state = {
    lng: 18.6155611,
    lat: 53.0331258,
    zoom: 10
  };

  componentDidMount() {
    const map = new mapboxgl.Map({
      container: this.mapContainer,
      style: 'mapbox://styles/mapbox/streets-v11',
      center: [this.state.lng, this.state.lat],
      zoom: this.state.zoom
    });
    var bounds = [
      [18.11318691590263, 53.022222],
      [18.90647886197926, 53.3331258]
    ];
    map.setMaxBounds(bounds);

    // initialize the map canvas to interact with later
    var canvas = map.getCanvasContainer();

    // an arbitrary start will always be the same
    // only the end or destination will change
    var start = [53.0331258, 18.6155611];
    // this is where the code for the next step will go
    // create a function to make a directions request
    function getRoute(end)  {
      // make a directions request using cycling profile
      // an arbitrary start will always be the same
      // only the end or destination will change
      var start = [18.6155611, 53.0331258];
      var url = 'https://api.mapbox.com/directions/v5/mapbox/cycling/' + start[0] + ',' + start[1] + ';' + end[0] +
        ',' + end[1] + '?steps=true&geometries=geojson&access_token=' + mapboxgl.accessToken;

      // make an XHR request https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest
      var req = new XMLHttpRequest();
      req.open('GET', url, true);
      req.onload = function () {
        var json = JSON.parse(req.response);
        var data = json.routes[0];
        var route = data.geometry.coordinates;
        var geojson = {
          type: 'Feature',
          properties: {},
          geometry: {
            type: 'LineString',
            coordinates: route
          }
        };
        // if the route already exists on the map, reset it using setData
        if (map.getSource('route')) {
          map.getSource('route').setData(geojson);
        } else { // otherwise, make a new request
          map.addLayer({
            id: 'route',
            type: 'line',
            source: {
              type: 'geojson',
              data: {
                type: 'Feature',
                properties: {},
                geometry: {
                  type: 'LineString',
                  coordinates: geojson
                }
              }
            },
            layout: {
              'line-join': 'round',
              'line-cap': 'round'
            },
            paint: {
              'line-color': '#3887be',
              'line-width': 5,
              'line-opacity': 0.75
            }
          });
        }
        // get the sidebar and add the instructions
        var instructions = document.getElementById('instructions');
        var steps = data.legs[0].steps;

        var tripInstructions = [];
        for (var i = 0; i < steps.length; i++) {
          // tripInstructions.push('<br><li>' + steps[i].maneuver.instruction) + '</li>';
          instructions.innerHTML = '<br><span class="duration">Trip duration: ' + Math.floor(data.duration /
            60) +
            ' min 🚴 </span>' + tripInstructions;
        }
      };
      req.send();
    }

    map.on('load', function () {
      // make an initial directions request that
      // starts and ends at the same location
      getRoute(start);

      // Add starting point to the map
      map.addLayer({
        id: 'point',
        type: 'circle',
        source: {
          type: 'geojson',
          data: {
            type: 'FeatureCollection',
            features: [{
              type: 'Feature',
              properties: {},
              geometry: {
                type: 'Point',
                coordinates: start
              }
            }]
          }
        },
        paint: {
          'circle-radius': 10,
          'circle-color': '#3887be'
        }
      });
      // this is where the code from the next step will go
    });
    map.on('click', function (e) {
      var coordsObj = e.lngLat;
      canvas.style.cursor = '';
      var coords = Object.keys(coordsObj).map(function (key) {
        return coordsObj[key];
      });
      var end = {
        type: 'FeatureCollection',
        features: [{
          type: 'Feature',
          properties: {},
          geometry: {
            type: 'Point',
            coordinates: coords
          }
        }]
      };
      if (map.getLayer('end')) {
        map.getSource('end').setData(end);
      } else {
        map.addLayer({
          id: 'end',
          type: 'circle',
          source: {
            type: 'geojson',
            data: {
              type: 'FeatureCollection',
              features: [{
                type: 'Feature',
                properties: {},
                geometry: {
                  type: 'Point',
                  coordinates: coords
                }
              }]
            }
          },
          paint: {
            'circle-radius': 10,
            'circle-color': '#f30'
          }
        });
      }
      getRoute(coords);
    });
  }

  render() {
    return (
      <div>
        <div ref={el => this.mapContainer = el} className='mapContainer' />
      </div>
    )
  }
}
export default App;
1
        var json = JSON.parse(req.response);
        var data = json.routes[0];
        var route = data.geometry.coordinates;

jeśli masz ten błąd "cannot read property geometry of undefined" tutaj (jak się domyślam) var route = data.geometry.coordinates; znaczy to, że data jest undefined, więc json.routes[0] jest też undefined. Na tym etapie mógłbyś zrobić tak:

console.log(json.routes)

albo nawet tak console.log(req.response) i zobaczy, czy dostajesz prawidłowe dane (otwierając konsole w dev toolsach / narzędziach developerskich). Po nitce do kłębka.

możesz zrobić również tak:

req.onload = function () {
        debugger; // <------ dodajesz tę linię
        var json = JSON.parse(req.response);

dzięki dodaniu debugger; otworzy ci się debugger i będziesz mógł krok po kroku przelecieć przez kod i zobaczyć, co jest źle. BTW teraz możesz korzystać z fetch: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API
nie musisz tworzyć obiektu XMLHttpRequest.

Adekwatnie w innych miejscach (console.log albo debugger)

  var url = 'https://api.mapbox.com/directions/v5/mapbox/cycling/' + start[0] + ',' + start[1] + ';' + end[0] +
        ',' + end[1] + '?steps=true&geometries=geojson&access_token=' + mapboxgl.accessToken;

Jeśli korzystasz z zewnętrznego API, to być może złego URLa konstruujesz. Możesz sprawdzić, jakiego masz URLa dodając console.log(url) po tej linii, czy nie zawiera jakichś ewidentnych głupot. Możesz też sprawdzić, co ci przeglądarka (w dev toolsach) pobiera pod tym url, może to złe zapytanie itp. Może też podajesz nieprawidłowego tokena. itp. Warto sprawdzić i poczytać dokumentację tego całego mapboxa.

Ale możliwe, że problem leży jeszcze gdzie indziej. Anyway, najważniejsze to złapać pewne metody debugowania i rozwiązywania błędów, zamiast latać po omacku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0