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-скрипта.