Страница 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
trir писал(а):
05 мар 2019, 11:47
https://blog.mapbox.com/clustering-mill ... ff959cb10d
знаю об этом, но видите ли, это будет совсем не информативно, на мой взгляд. Данные по геохимии воды, и писались треком на сотни километров в процессе плавания и выглядят в виде вытянутой линии.

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