Страница 1 из 1
Замена тяжелых данных PostGIS линией
Добавлено: 05 мар 2019, 11:41
CatalystW
Добрый день, нужна помощь с запросами PostGIS.
Есть очень "тяжелые данные" (около 2 миллионов точек) с геохимическими измерениями в базе PostGIS, и выводить их на карту Leaflet - не очень хорошая идея. Сеть измерений настолько частая, что фактически сливается в линию и тяжело переваривается компьютером. Идея такая:
1)Есть 4 класса, на которые можно разбить все данные по тому или иному атрибуту (содержанию определенного вещества)
2)создать столбец, в который записать соответствующий класс
3)Все стоящие друг за другом точки с одинаковыми классами объединить в линию.
Как написать запрос с преобразованием точек в ломаную линию? Будет ли это легче отрисовывать? Если это дурацкая идея, помогите пожалуйста советом с визуализацией "тяжелых данных"
Re: Замена тяжелых данных PostGIS линией
Добавлено: 05 мар 2019, 11:47
trir
Re: Замена тяжелых данных PostGIS линией
Добавлено: 05 мар 2019, 11:51
CatalystW
знаю об этом, но видите ли, это будет совсем не информативно, на мой взгляд. Данные по геохимии воды, и писались треком на сотни километров в процессе плавания и выглядят в виде вытянутой линии.
Re: Замена тяжелых данных PostGIS линией
Добавлено: 05 мар 2019, 12:02
trir
Как написать запрос с преобразованием точек в ломаную линию?
Код: Выделить всё
PROCEDURE `CreateTrkLine`(nid INT)
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE coup, i INT DEFAULT 0;
DECLARE p1, p2, CrP point;
DECLARE CrLn LineString;
DECLARE Cur1 Cursor FOR
SELECT p FROM `gpx_db`.`trkpt` WHERE trk_id=nid AND nseg=1;
DECLARE Continue Handler FOR NOT found SET done = 1;
OPEN Cur1;
Repeat
Fetch Cur1 INTO CrP;
IF NOT Done THEN
CASE i
WHEN 0 THEN
SET p1 = geomfromtext(concat('Point(', X(CrP), ' ', Y(CrP), ')'));
WHEN 1 THEN
SET CrLn = geometryfromtext(concat('LineString(',x(p1),' ',y(p1),',',x(CrP),' ',y(CrP),')'));
ELSE
SET CrLn = `LS_AddPoint`(CrLn, CrP);
END CASE;
SET i=i+1;
END IF;
Until done END Repeat;
Close Cur1;
UPDATE trk SET `trk_line`=CrLn WHERE id=nid;
END $$
http://wiki.gis-lab.info/w/%D0%9F%D1%80 ... 0%B8%D0%B9
Re: Замена тяжелых данных PostGIS линией
Добавлено: 05 мар 2019, 12:21
CatalystW
Очень благодарен за помощь. Попробую
Re: Замена тяжелых данных PostGIS линией
Добавлено: 05 мар 2019, 12:23
gamm
Не мудрите, для вывода интерполируйте на растр, обрежьте по границе воды, и нашинкуйте тайлы. Будет красиво и быстро. А на большом зуме подменяйте точками, их будет немного.
P.S. Для водохранилища с притоками мы когда-то делали такую приблуду для мапинфы ...
Re: Замена тяжелых данных PostGIS линией
Добавлено: 05 мар 2019, 12:26
trir
В PostGIS есть
ST_MakeLine
Re: Замена тяжелых данных PostGIS линией
Добавлено: 07 мар 2019, 10:33
CatalystW
trir писал(а): ↑05 мар 2019, 12:26
В PostGIS есть ST_MakeLine
После дня плясок с бубном у меня получилось соединить все точки по возрастанию времени, до этого была видимо неправильная геометрия.
Код: Выделить всё
CREATE TABLE test2 as
SELECT ST_MakeLine ("geom" ORDER BY timestamp ASC) AS geom2
from first
У меня все значения разбиты на 4 класса. Но как сделать запрос, чтобы алгоритм рисовал отрезки по очереди так же, но до границы следующего класса (где допустим ph воды с 7 до 10), а там уже следующую линию до следующей смены класса?
Re: Замена тяжелых данных PostGIS линией
Добавлено: 07 мар 2019, 10:46
trir
group by класс?
Re: Замена тяжелых данных PostGIS линией
Добавлено: 07 мар 2019, 11:10
freeExec
Ещё наверное упростить надо, а то в чём выгода, если там 100500 точек на одной прямой.
Re: Замена тяжелых данных PostGIS линией
Добавлено: 11 мар 2019, 08:07
CatalystW
trir писал(а): ↑07 мар 2019, 10:46
group by класс?
Если я дописываю GROUP BY CLASS, то он просто группирует все значения с одинаковыми классами и делает их линиями. Да, я получаю 4 линии 4 классов, но тогда PostGIS не берет в расчет, что в разрыв линии может включаться другой класс
viewtopic.php?f=19&t=21702 нашёл в чем-то похожую тему, но не могу понять саму суть запроса, который там пишется.
Я пытаюсь такой запрос:
Код: Выделить всё
SELECT
ST_Makeline(p1, p2) as geom, id, num, class
FROM
(SELECT
id, row_number() over w as num, class, geom as p1, lead(geom) over w as p2
FROM first
window w as (partition by class order by timestamp)
)
as query where p2 is not NULL
Но как результат ERROR: ОШИБКА: Input geometries must be points or lines