Как я могу нарисовать элементы графа (узлы и ребра) в листовке?

Мне нужно создать простой онлайн-редактор карт, и я собираюсь использовать листовку (но в конечном итоге могу использовать openlayers). Как я могу нарисовать элементы графика (узлы и ребра) в листовке (поверх карты). В частности, я могу рисовать линии (ребра) и окружности (узлы), но они никак не связаны друг с другом, то есть линия не является краем точки, поскольку это две разные геометрии. Следовательно, как я могу рисовать элементы графа, узлы и ребра, где ребра и узлы связаны.

Пример:

Здесь круги должны представлять собой узлы, а полилинии — ребра. Однако две геометрии никак не связаны, то есть я не могу связать ребра с узлами. Что я хочу знать, так это то, как нарисовать граф поверх такой машины, где я могу добавлять, извлекать и удалять ребра и узлы.

введите здесь описание изображения


person Marcos Roriz Junior    schedule 07.10.2018    source источник
comment
Уточнение пожалуйста? В заголовке вы задали вполне конкретный вопрос. затем в теле вы сказали, что можете делать то, что указано в заголовке: Точно, я могу рисовать линии (ребра) и точки (узлы), но они никак не связаны друг с другом. Так что заголовок делает НЕ на самом деле отражают ваши потребности. Ваша потребность отражена в одном слове: коррелирует. Пожалуйста, уточните 1) что вам нужно сделать с корреляцией 2) истинный характер проблемы, мешающей вам это сделать.   -  person Randy Casburn    schedule 16.10.2018
comment
@RandyCasburn спасибо за комментарий. Я отредактировал вопрос, чтобы увидеть, ясно ли теперь   -  person Marcos Roriz Junior    schedule 17.10.2018
comment
Опубликовано как gis.stackexchange.com/q/299162/115   -  person PolyGeo    schedule 17.10.2018


Ответы (1)


Я не уверен, почему вы не хотите напрямую создавать полилинию, но вы можете реализовать свой запрос следующим образом:

    // the given points array
    let points = [
        [51.509, -0.08],
        [51.503, -0.06],
        [51.51, -0.047]
    ];

    // iterate through the points to dynamically create the elements
    for(let i = 0; i < points.length; i++)
    {
        // every point creates a circle (node)
        L.circle(points[i], {radius: 20}).addTo(mymap)

        // every pair of adjacent points creates an edge, 
        // other logic can be implemented
        if(i + 1 < points.length){
            L.polyline([points[i], points[i+1]]).addTo(mymap);
        }
    };

Результат выглядит так:

Если вам все еще нужна полилиния целиком, без разделения узлов и ребер, используйте L.polyline следующим образом:

    // create a polyline from an array of points
    let polyline = L.polyline(points).addTo(map);

Вы можете найти дополнительную информацию о различных вариантах полилиний и окружностей здесь и здесь.

Возможный API для формата графа, как вы просили, для добавления, извлечения и удаления элементов узлов и ребер может быть следующим:

    // points represented by circles

    function addNode(lat, lng){
        L.circle([lat, lng], {radius: 20}).addTo(mymap);
    }


    function deleteNode(node){
        node.remove();
    }


    function retrieveNode(node){
        let latlng = node.getLatLng();
        return [latlng.lat, latlng.lng];
    }


    // edges represented by polylines

    function addEdge(nodeA, nodeB){
        L.polyline([retrieveNode(nodeA), retrieveNode(nodeB)]).addTo(mymap);
    }

    function deleteEdge(edge){
        edge.remove();
    }

    function retrieveEdge(edge)
    {
        let line = edge.getLatLngs();
        return [[line[0].lat, line[0].lng], [line[1].lat, line[1].lng]];
    }

Добавив класс Graph, вы можете продолжить это направление и еще больше абстрагироваться от построения карты.

person Yoav Abadi    schedule 20.10.2018
comment
Есть ли решения для кластеризации графа? - person Vitaliy Demchuk; 02.08.2021