Замена тяжелых данных PostGIS линией

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
Ответить
CatalystW
Новоприбывший
Сообщения: 14
Зарегистрирован: 20 сен 2017, 15:27
Репутация: 0
Откуда: Иркутск

Замена тяжелых данных PostGIS линией

Сообщение CatalystW » 05 мар 2019, 11:41

Добрый день, нужна помощь с запросами PostGIS.
Есть очень "тяжелые данные" (около 2 миллионов точек) с геохимическими измерениями в базе PostGIS, и выводить их на карту Leaflet - не очень хорошая идея. Сеть измерений настолько частая, что фактически сливается в линию и тяжело переваривается компьютером. Идея такая:
1)Есть 4 класса, на которые можно разбить все данные по тому или иному атрибуту (содержанию определенного вещества)
2)создать столбец, в который записать соответствующий класс
3)Все стоящие друг за другом точки с одинаковыми классами объединить в линию.

Как написать запрос с преобразованием точек в ломаную линию? Будет ли это легче отрисовывать? Если это дурацкая идея, помогите пожалуйста советом с визуализацией "тяжелых данных"

trir
Гуру
Сообщения: 5278
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1014
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Замена тяжелых данных PostGIS линией

Сообщение trir » 05 мар 2019, 11:47


CatalystW
Новоприбывший
Сообщения: 14
Зарегистрирован: 20 сен 2017, 15:27
Репутация: 0
Откуда: Иркутск

Re: Замена тяжелых данных PostGIS линией

Сообщение CatalystW » 05 мар 2019, 11:51

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

trir
Гуру
Сообщения: 5278
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1014
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Замена тяжелых данных PostGIS линией

Сообщение trir » 05 мар 2019, 12:02

Как написать запрос с преобразованием точек в ломаную линию?

Код: Выделить всё

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

CatalystW
Новоприбывший
Сообщения: 14
Зарегистрирован: 20 сен 2017, 15:27
Репутация: 0
Откуда: Иркутск

Re: Замена тяжелых данных PostGIS линией

Сообщение CatalystW » 05 мар 2019, 12:21

Очень благодарен за помощь. Попробую

gamm
Гуру
Сообщения: 4048
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1050
Ваше звание: программист
Откуда: Казань

Re: Замена тяжелых данных PostGIS линией

Сообщение gamm » 05 мар 2019, 12:23

Не мудрите, для вывода интерполируйте на растр, обрежьте по границе воды, и нашинкуйте тайлы. Будет красиво и быстро. А на большом зуме подменяйте точками, их будет немного.

P.S. Для водохранилища с притоками мы когда-то делали такую приблуду для мапинфы ...

trir
Гуру
Сообщения: 5278
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1014
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Замена тяжелых данных PostGIS линией

Сообщение trir » 05 мар 2019, 12:26

В PostGIS есть ST_MakeLine

CatalystW
Новоприбывший
Сообщения: 14
Зарегистрирован: 20 сен 2017, 15:27
Репутация: 0
Откуда: Иркутск

Re: Замена тяжелых данных PostGIS линией

Сообщение CatalystW » 07 мар 2019, 10:33

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), а там уже следующую линию до следующей смены класса?

trir
Гуру
Сообщения: 5278
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1014
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Замена тяжелых данных PostGIS линией

Сообщение trir » 07 мар 2019, 10:46

group by класс?

freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: Замена тяжелых данных PostGIS линией

Сообщение freeExec » 07 мар 2019, 11:10

Ещё наверное упростить надо, а то в чём выгода, если там 100500 точек на одной прямой.

CatalystW
Новоприбывший
Сообщения: 14
Зарегистрирован: 20 сен 2017, 15:27
Репутация: 0
Откуда: Иркутск

Re: Замена тяжелых данных PostGIS линией

Сообщение CatalystW » 11 мар 2019, 08:07

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

Ответить

Вернуться в «Общий - ПО»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей