Сочетание объектов POINT и LINESTRING в столбце PostgreSQL. Как извлечь ТОЧКУ и первую точку из ЛИНЕСТРИНГА? - PullRequest
1 голос
/ 21 октября 2019

Итак, у меня есть столбец в базе данных PostgreSQL, который содержит объекты POINT и объекты LINESTRING. Теперь моя конечная цель - извлечь широту и долготу из этих объектов. Для объектов POINT это я могу просто сделать, сделав запрос:

SELECT ST_X(records.primary_location) AS latitude,
       ST_Y(records.primary_location) AS longitude
FROM records

Теперь я получу все значения широты и долготы, если это просто объекты POINT в базе данных. Тем не менее, есть также LINESTRING. Из них я хочу извлечь первую точку, а затем извлечь широту и долготу для каждой из этих точек. Чтобы добиться получения широты и долготы от POINTS и LINESTRING, я попытался:

SELECT ST_X(ST_PointN(records.primary_location, 1)) AS latitude,
       ST_Y(ST_PointN(records.primary_location, 1)) AS longitude
FROM records

. Я предположил, что ST_PointN() извлечет первую точку из LINESTRING и просто сохранит одну точку из объекта POINT. Однако это не работает.

Кто-нибудь знает, как я могу одновременно получать координаты широты / долготы из этих двух типов объектов в одном столбце? Кроме того, я бы предпочел, чтобы это происходило с одним запросом.

1 Ответ

1 голос
/ 21 октября 2019

Вы пробовали встраивать эти условия в выражение CASE на основе результата ST_GeometryType?

Образец данных

CREATE TABLE t (geom GEOMETRY);
INSERT INTO t VALUES ('POINT(1 1)'),
                     ('LINESTRING (8 1, 1 3, 4 4)'),
                     ('POINT(8 2)'),
                     ('LINESTRING (4 2, 2 4, 5 5)');

Запрос

SELECT 
  CASE 
    WHEN ST_GeometryType(geom) = 'ST_Point' 
      THEN ST_AsText(geom)
    WHEN ST_GeometryType(geom) = 'ST_LineString' 
      THEN ST_AsText(ST_PointN(geom,1))
  END
FROM t;

    case    
------------
 POINT(1 1)
 POINT(8 1)
 POINT(8 2)
 POINT(4 2)
(4 Zeilen)

Вы можете сделать это еще проще, если уверены, что в столбце нет другого типа геометрии, кроме точки и строки

SELECT 
  CASE 
    WHEN ST_GeometryType(geom) = 'ST_LineString' 
      THEN ST_AsText(ST_PointN(geom,1))
    ELSE ST_AsText(geom)
  END
FROM t;

 st_astext  
------------
 POINT(1 1)
 POINT(8 1)
 POINT(8 2)
 POINT(4 2)
(4 Zeilen)
...