Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Построение линии из отрезков / 3 сообщений из 3, страница 1 из 1
22.03.2015, 23:24
    #38912671
Построение линии из отрезков
Есть таблица отрезков:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE TABLE WAYS (
    WAYID   BIGINT NOT NULL,
    NODEID  BIGINT NOT NULL,
    POS     BIGINT NOT NULL,
    TITL    VARCHAR(255) NOT NULL
);

INSERT INTO WAYS VALUES (1, 100, 1, 'a');
INSERT INTO WAYS VALUES (1, 101, 2, 'a');
INSERT INTO WAYS VALUES (1, 102, 3, 'a');
INSERT INTO WAYS VALUES (1, 103, 4, 'a');
INSERT INTO WAYS VALUES (2, 105, 3, 'a');
INSERT INTO WAYS VALUES (2, 104, 2, 'a');
INSERT INTO WAYS VALUES (2, 103, 1, 'a');
INSERT INTO WAYS VALUES (3, 107, 3, 'b');
INSERT INTO WAYS VALUES (3, 106, 2, 'b');
INSERT INTO WAYS VALUES (3, 103, 1, 'b');
INSERT INTO WAYS VALUES (4, 105, 1, 'a');
INSERT INTO WAYS VALUES (4, 108, 2, 'a');
INSERT INTO WAYS VALUES (5, 107, 1, 'b');
INSERT INTO WAYS VALUES (5, 109, 2, 'b');
INSERT INTO WAYS VALUES (5, 110, 3, 'b');
INSERT INTO WAYS VALUES (6, 108, 4, 'a');
INSERT INTO WAYS VALUES (6, 111, 3, 'a');
INSERT INTO WAYS VALUES (6, 112, 2, 'a');
INSERT INTO WAYS VALUES (6, 113, 1, 'a');
INSERT INTO WAYS VALUES (7, 108, 1, 'a');
INSERT INTO WAYS VALUES (7, 114, 2, 'a');
INSERT INTO WAYS VALUES (7, 115, 3, 'a');
INSERT INTO WAYS VALUES (8, 115, 3, 'a');
INSERT INTO WAYS VALUES (8, 116, 2, 'a');
INSERT INTO WAYS VALUES (8, 117, 1, 'a');
INSERT INTO WAYS VALUES (9, 118, 1, 'b');
INSERT INTO WAYS VALUES (9, 119, 2, 'b');
INSERT INTO WAYS VALUES (9, 120, 3, 'b');



Очень нужен запрос (процедура) для вывода всех отрезков линии по заданному wayid, которые стыкуются по общим точкам и имеют отдинаковый заголовок. POS задаёт последовательность точек лишь внутри отрезка, т.е. в линии точки отрезка могут идти как последовательно в одном направлении, так и в обратном. И по POS можно находить концы отрезка.

Например для текущих исходных данный вот все возможные линии:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
a1:
(1, 100, 1, 'a')
(1, 101, 2, 'a')
(1, 102, 3, 'a')
(1, 103, 4, 'a')
(2, 103, 1, 'a')
(2, 104, 2, 'a')
(2, 105, 3, 'a')
(4, 105, 1, 'a')
(4, 108, 2, 'a') \ - развилка (можно вывести в конце или чередовать)
(6, 108, 4, 'a')  (7, 108, 1, 'a')
(6, 111, 3, 'a')  (7, 114, 2, 'a')
(6, 112, 2, 'a')  (7, 115, 3, 'a')
(6, 113, 1, 'a')  (8, 115, 3, 'a')
                  (8, 116, 2, 'a')
                  (8, 117, 1, 'a')

b1:
(3, 103, 1, 'b')
(3, 106, 2, 'b')
(3, 107, 3, 'b')
(5, 107, 1, 'b')
(5, 109, 2, 'b')
(5, 110, 3, 'b')

b2:
(9, 118, 1, 'b')
(9, 119, 2, 'b')
(9, 120, 3, 'b')

b1 и b2 не имеют общих точек, поэтому выводятся как раздельные линии.
В идеале, хотелось бы вывести линии с отрезками учитывая их последовательность, но как запасной вариант, хватило бы получить только все wayid принадлежащие одному отрезку.
Заранее спасибо за ответы, уже вторые сутки ломаю голову.
...
Рейтинг: 0 / 0
22.03.2015, 23:34
    #38912680
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Построение линии из отрезков
как-то сложновато
я храню точки отдельно, связи отдельно
граф отлично строится
когда нужно построить/запомнить way запоминаю как
~13~29~4775~
соотв-но в процедуре всегда можно для каждой точки набор точек, куда можно перейти
и четвертое поле (туда обратно) не требуется
таблица ребер задает направление
p1=13, p2=29
p1=29, p2=13
туда/обратно - две записи
...
Рейтинг: 0 / 0
23.03.2015, 18:46
    #38913961
Построение линии из отрезков
Нет, других связей никаких нет.
Естественно можно легко рекурсией сделать например используя sql+php, но хочется ограничиться sql

Пытался через рекурсию, но никак...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
BEGIN
    FOR WITH RECURSIVE rp AS (
        SELECT * FROM WAYS WHERE wayid = :wayid_in
        UNION ALL
        -- не могу закончить
        -- rp, (SELECT FIRST 1 * FROM WAYS WHERE wayid = :wayid_in ORDER BY pos DESC) AS fwn
    )
    SELECT
        rp.wayid, rp.nodeid, rp.pos, rp.titl
    FROM rp
    INTO :wayid, :nodeid, :pos, :titl
    DO BEGIN
        SUSPEND;
    END
END
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Построение линии из отрезков / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]