Подтвердить что ты не робот

Выражения PostgreSQL из выражений STDIN

Я пытаюсь использовать COPY FROM STDIN для импорта данных в таблицу. Один из столбцов моей таблицы имеет геометрию типа. Моя команда выглядит примерно так:

COPY "WeatherStations" ("Station_ID", "Station_Code", "Station_Name", "Station_Location") FROM stdin;
1       KAVP    WILKES-BARRE    ST_GeomFromText('POINT(41.338055 -75.724166)')
2       KOKV    WINCHESTER      ST_GeomFromText('POINT(39.143333 -78.144444)')
3       KSHD    SHENANDOAH      ST_GeomFromText('POINT(38.263611 -78.896388)')
...

Тем не менее, я думаю, что он пытается вставить текст "ST_GeomFromText (" POINT... ") и не выполнить оценку выражения и вставить результат выражения. Кто-нибудь знает, что может происходить здесь, и как я может получить фактические геомы вставлены?

4b9b3361

Ответ 1

Мне было плохо, когда я выяснял, как массировать копии/данные геометрии в PostGIS с помощью команды COPY FROM STDIN, я не мог найти официальную документацию по этой теме.

Изменение столбца во время массовой загрузки (ALTER TABLE/SET DATA TYPE/USING) не было для меня, потому что это поддерживается только в PostGIS 2.0+ для типа геометрии, а также неприменимо использование временной таблицы.

Существует действительно прямой способ сделать это (по крайней мере, в PostGIS 1.5.2+). Вы можете просто переписать данные для своего оператора копирования таким образом, используя простое представление WKT (хорошо известный текст) для ваших данных геометрии:

1       KAVP    WILKES-BARRE    POINT(41.338055 -75.724166)
2       KOKV    WINCHESTER      POINT(39.143333 -78.144444)
3       KSHD    SHENANDOAH      POINT(38.263611 -78.896388)

Если вы установили ограничение SRID в столбце геометрии, вам придется использовать следующий синтаксис (в этом примере SRID - 4326), известный как EWKT (Extended Well-Known Text, который является Формат PostGIS):

1       KAVP    WILKES-BARRE    SRID=4326;POINT(41.338055 -75.724166)
2       KOKV    WINCHESTER      SRID=4326;POINT(39.143333 -78.144444)
3       KSHD    SHENANDOAH      SRID=4326;POINT(38.263611 -78.896388)

Заключительное примечание: между "POINT" и открывающей скобкой не должно быть пробела "(", или COPY все равно вернет ошибку, заявив, что ваши данные геометрии имеют недопустимый формат.

Ответ 2

Вы можете опустить функцию, обертывающую текст, импорт во временную таблицу с текстовым столбцом, а затем запустите INSERT/SELECT в постоянную таблицу с помощью функции, выполняющей преобразование на этом шаге.

INSERT INTO "WeatherStations"
  ("Station_ID", "Station_Code", "Station_Name", "Station_Location")
  SELECT "Station_ID", "Station_Code", "Station_Name",
         ST_GeomFromText("Station_Location")
    FROM "TempWeatherStations";

Ответ 3

Значение точки выглядит примерно так: 0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840.

Я обычно храню столбцы latitude и longitude в своих таблицах и строю пространственные данные с помощью триггеров.

Я не знаю, как скопировать POINT из stdin в противном случае.