Что такое запрос postgresql для решения этих довольно сложных шагов? - PullRequest
2 голосов
/ 22 марта 2012

StackOverflow.

Это может быть сложный вопрос, поскольку в него включена функция PostGIS для расчета недостающих данных (the_geom) для каждого актива в соответствии с имеющимися у нас старыми данными. Знаете ли вы PostGIS или нет, вы можете решить этот вопрос.

  • (примечание) Я точно знаю, что я хотел получить от этого вопроса, но я не знаю ШАГОВ, чтобы объединить все это в один запрос или в скрипт PHP. *

Позвольте мне объяснить некоторые детали вопроса. Сначала подумайте о велосипедной дорожке (актив) на улице. Велосипедная дорожка сама по себе является полосой и расположена на одной или нескольких вспомогательных улицах ( sub-ctrl-section ).

Чтобы визуализировать эту проблему, вот некоторые возможные результаты.

==============|=============
x---------------------y

==============|======|==========
   x-------------------------y

==============
    x------y

Примечание: «=======» - это cid (каждый подраздел ctrl ), «|» отделить каждый cid, «-------» - это помощь (каждый актив), «x» - это km_start (начальная точка), «y» - это km_end (конечная точка) каждого актива.

актив (Таблица) - содержит 5 активов

aid | km_start | km_end | ctrl_sec_no | the_geom
1 | 10 | 15 | 1234 | null
2 | 10 | 25 | 1234 | null
3 | 13 | 15 | 5678 | null
4 | 11 | 15 | 5678 | null
5 | 13 | 17 | 5678 | null

осевая линия (Таблица) - содержит 5 подразделов ctrl .

 cid | km_start | km_end | ctrl_sec_no | the_geom(LINESTRING)
   1 | 10 | 12 | 1234 | xxxx...
   2 | 13 | 15 | 1234 | xxxx...
   3 | 16 | 30 | 1234 | xxxx...
   4 | 10 | 15 | 5678 | xxxx...
   5 | 16 | 20 | 5678 | xxxx...

Я хочу, чтобы результат был как

aid(1) -> cid(1) + cid(2)
aid(2) -> cid(1) + cid(2) + cid(3)
aid(3) -> cid(4)
aid(4) -> cid(4)
aid(5) -> cid(4) + cid(5)

примечание: «актив (1) содержится в осевой линии (1) и осевой линии (2) в терминах cid»

Затем, после того, как мы получим каждый cid (осевую линию) из вышеприведенного шага, мы хотим UPDATE the_geom каждой помощи (активов), используя " ST_Line_Substring " для поиска подстроки каждый Сид мы получаем.

Но теперь у нас нет the_geom для актива (Таблица), поэтому мы должны рассчитать его!

Например (ctrl_sec_no: 1234) - это не идеальный масштаб, просто для визуализации

10======12======13======15======16======30
x-------|-------|-------y (aid:1)
x-------|-------|-------------------y (aid:2)
                x-------y (aid:3)

Например (ctrl_sec_no: 5678)

10=====15/16=====20
  x-----y (aid:4)
     x--|----y (aid:5)

Это означает, что мы должны вычислить RATIO актива в каждом sub-ctrl-секциях , используя ST_Line_Substring. Теперь покажем, как работает эта функция:)

Например: (помощь: 5) занято в 2 подразделах ctrl

SELECT ST_Line_Substring('the_geom',13-10/15-10,1.0) FROM centerline WHERE ctrl_sec_id = 4567 and cid = 4

SELECT ST_Line_Substring('the_geom',0.0,17-16/20-16) FROM centerline WHERE ctrl_sec_id = 4567 and cid = 5

(13-10) / (15-10) = 3/5 - это СООТНОШЕНИЕ 1-й части актива (aid: 5), который занимал (cid: 4) - a.km_start - c. km_start / c.km_end - c.km_start

(17-16) / (20-16) = 1/4 - это СООТНОШЕНИЕ 2-й части актива (aid: 5), который занимал (cid: 5) - a.km_start - c. km_start / c.km_end - c.km_start

Затем мы должны ST_Union для каждой части (the_geom, возвращаемой из ST_Line_Substring), которую мы рассчитываем по вышеупомянутым запросам.

Вопрос в том, что является запросом для выполнения всех этих шагов, при необходимости они могут быть выполнены с помощью PHP-скрипта.

1 Ответ

1 голос
/ 22 марта 2012
create table asset (
    aid integer primary key, 
    km_start integer not null, 
    km_end integer not null, 
    ctrl_sec_no integer not null, 
    the_geom text default null
)
;

insert into asset (aid, km_start, km_end, ctrl_sec_no)
values
(1, 10, 15, 1234),
(2, 10, 25, 1234),
(3, 10, 12, 5678), 
(4, 11, 15, 5678),
(5, 13, 17, 5678)
;

create table centerline (
    cid integer primary key, 
    km_start integer not null, 
    km_end integer not null, 
    ctrl_sec_no integer not null, 
    the_geom text not null default 'xxxx...'
)
;

insert into centerline (cid, km_start, km_end, ctrl_sec_no)
values
(1, 10, 12, 1234),
(2, 13, 15, 1234),
(3, 16, 30, 1234),
(4, 10, 15, 5678),
(5, 16, 17, 5678)
;

select aid, cid
from asset a
inner join centerline c on 
    a.ctrl_sec_no = c.ctrl_sec_no
    and (
        a.km_start between c.km_start and c.km_end
        or
        a.km_end between c.km_start and c.km_end
        or
        a.km_start <= c.km_start and a.km_end >= c.km_end
        )
order by aid, cid
;

 aid | cid 
-----+-----
   1 |   1
   1 |   2
   2 |   1
   2 |   2
   2 |   3
   3 |   4
   4 |   4
   5 |   4
   5 |   5
(9 rows)

Я не понимаю вторую часть вашего вопроса.Не могли бы вы подробно это описать?

...