Как создать граф из объекта со всеми данными узла? - PullRequest
1 голос
/ 04 февраля 2020

Мне нужно составить маршрутный маршрут для трамваев и метролинов для школьного проекта. Мне дали этот фрагмент кода, который обрабатывает 19 JSON файлов с данными трамвая и метролина. Это включает в себя такие вещи, как имя остановки, местоположение остановки и т. Д. c.

/**
 * ImportMap is a function that read the content from a URL and expects JSON in return.
 * It then hands over the content to the function processMap to actually process its content
 * 
 * @param {*} fileName 
 */

function importMap (fileName) {

    var xmlhttp = new XMLHttpRequest();
    var url = fileName;

    xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            var myArr = JSON.parse(this.responseText);
            processMapInfo(myArr);
        }
    };
    xmlhttp.open("GET", url, true);
    xmlhttp.send();
}

/**
 * Reads the line information and updates the internal map structure
 * @param {*} lineData (JSON string as object)
 */
function processMapInfo (lineData) {
    listOfLines.push(lineData)

    var mainItem;
    var networkItem;
    var networkItemStop;
    var listOfStops = {}; // declared as associative array

    for (mainItem in lineData) {
        logInfo (mainItem,LOG_DETAILS);
        // There should be only 1 mainItem that starts with something like "GVB_"
        // We need this to access the other information

        /* First read the transportation type and its id */
        typeOfTransportation = lineData[mainItem]["Line"].TransportType;
        idOfTransportation = lineData[mainItem]["Line"].LinePublicNumber;

        for (networkItem in lineData[mainItem]["Network"]) {
            // usually there are 1 or 2 networkItems that each represent a list of network stops
            for (networkItemStop in lineData[mainItem]["Network"][networkItem]) {
                // scan all stops
                // add a stop to a list based on its order; this is described by UserStopOrderNumber
                // but only when it does not exist already
                if (!listOfStops.hasOwnProperty(lineData[mainItem]["Network"][networkItem][networkItemStop].UserStopOrderNumber)) {
                    listOfStops [lineData[mainItem]["Network"][networkItem][networkItemStop].UserStopOrderNumber] = 
                        lineData[mainItem]["Network"][networkItem][networkItemStop].TimingPointName;
                }
            }
        }
    }   
    logInfo (listOfStops,LOG_DETAILS);

    // listOfStops now has all the info to update your map structure :-)
}

/**
 * We need a way to check that ALL imports have finished as this is a ASYNCHRONOUS process
 * @param {*} expectedNumberOfFiles 
 */
function checkImport (expectedNumberOfFiles) {
    console.log(listOfLines);

    if (listOfLines.length == expectedNumberOfFiles) {
        clearTimeout ();


        // etc... all JSON files have been processed ... do your thing :-)
    }
}

importMap ("./JSON_files/GVB_1_1.json");
importMap ("./JSON_files/GVB_2_1.json");
importMap ("./JSON_files/GVB_3_1.json");
importMap ("./JSON_files/GVB_4_1.json");
importMap ("./JSON_files/GVB_5_1.json");
importMap ("./JSON_files/GVB_7_1.json");
importMap ("./JSON_files/GVB_11_1.json");
importMap ("./JSON_files/GVB_12_1.json");
importMap ("./JSON_files/GVB_13_1.json");
importMap ("./JSON_files/GVB_14_1.json");
importMap ("./JSON_files/GVB_17_1.json");
importMap ("./JSON_files/GVB_19_1.json");
importMap ("./JSON_files/GVB_24_1.json");
importMap ("./JSON_files/GVB_26_1.json");
importMap ("./JSON_files/GVB_50_1.json");
importMap ("./JSON_files/GVB_51_1.json");
importMap ("./JSON_files/GVB_52_1.json");
importMap ("./JSON_files/GVB_53_1.json");
importMap ("./JSON_files/GVB_54_1.json");


// add a short wait so we know ALL 19 lines have been processed
setTimeout (checkImport (19),1000);

Если честно, я понятия не имею, что именно делает этот код и как он это делает. Но я думаю, что listOfStops содержит все остановки, и эта функция помещает их в эту переменную.

Для планировщика маршрута я должен использовать алгоритм Дийктры. Но прежде чем я смогу использовать алгоритм, мне нужен график, который содержит все остановки в виде узлов и добавляет ребра. Я нашел некоторую информацию в Интернете, но они вручную создавали узлы и ребра. Поскольку есть много остановок, я искал способ создать график из (я думаю) массива listOfStops. Я нашел несколько возможных решений в Интернете, но они используют внешние библиотеки или фреймворки. Моя школа решила, что мне нужно все делать самостоятельно, поэтому никакие внешние библиотеки фреймворков использовать нельзя. Это избавило от всех этих решений.

Я ищу любую возможную помощь по крайней мере для создания графика. Я понятия не имею, как это сделать, и не могу найти ничего в Google или в stackoverflow.

Это один из файлов, который содержит информацию о строке: https://ori.clow.nl/algds/GVB_1_1.json

Любая помощь будет оценена!

...