Как перебрать данные столбца Geometry в MySQL / PostgreSQL?

0

У меня есть столбец с именем schedule с типом данных MULTILINESTRING.
В LINESTRING случаев этот столбец содержит все 1 LINESTRING, поэтому я легко LINESTRING данные по сценарию

ST_GeometryN(schedule, 1)

а затем я проверяю условия из полученных данных.

Но если этот столбец содержит еще одно LINESTRING, мне нужно зациклиться на нем, чтобы проверить.

Каков наилучший способ?
Извините за мой плохой английский.

  • 0
    Это mysql или postgresql?
  • 0
    Это для обоих братан
Теги:
postgis

1 ответ

0

PostgreSQL (PostGIS)

Функция, которую вы ищете, - ST_NumGeometries.

Основываясь на следующей структуре таблицы:

CREATE TEMPORARY TABLE tb (id INT, schedule GEOMETRY);

Содержащие следующие записи:

INSERT INTO tb 
VALUES (1,ST_GEOMFROMTEXT('MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))'));
INSERT INTO tb 
VALUES (2,ST_GEOMFROMTEXT('LINESTRING (30 10, 10 30, 40 40)'));

Итерируйте по геометриям, используя что-то вроде (быстрое и грязное):

DO $$
DECLARE 
  i INT DEFAULT 0; 
  j RECORD;
  dim INT DEFAULT 0;  
BEGIN
    FOR j IN SELECT * FROM tb LOOP
      SELECT ST_NumGeometries(j.schedule) INTO dim;
      WHILE i < dim LOOP
        i:=i+1;  
        RAISE NOTICE 'Do something with geometry % : %',j.id,(SELECT ST_ASTEXT(ST_GeometryN(j.schedule, i)) );          
      END LOOP;
      i:=0;
    END LOOP;
END$$;

Выход:

Do something with geometry 1 : LINESTRING(10 10,20 20,10 40)
Do something with geometry 1 : LINESTRING(40 40,30 30,40 20,30 10)
Do something with geometry 2 : LINESTRING(30 10,10 30,40 40)

В зависимости от того, что вам нужно делать с этими linestrings, я бы предложил включить этот код в функцию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню