#sql #postgresql #heroku #postgis #heroku-postgres
#sql #postgresql #heroku #postgis #heroku-postgres
Вопрос:
У меня есть Postgres, расширенный базой данных Postgis версии 2.5 в Heroku.
Я хочу использовать функцию:
ST_Area( a_polygon )
В частности, мне нужен сгенерированный столбец в моей таблице: alter table buildings add building_area float generated always as ( st_area( base_polygon ) ) stored;
Где base_polygon
имеет тип polygon
.
Однако я получаю эту ошибку:
ОШИБКА: функция st_area(полигон) не существует Подсказка: ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явные приведения типов.
Разве эти команды не должны быть доступны после запуска CREATE EXTENSION postgis
?
Или есть что-то еще, что я должен сделать?
Ответ №1:
Похоже, что ваш тип данных столбца polygon — это база postgre, построенная в polygon.
ST_Area ожидает тип геометрии postgis в качестве параметра.
Как в этом примере из документов https://postgis.net/docs/ST_Area.html
select ST_Area(geom) sqft,
ST_Area(ST_Transform(geom, 26986)) As sqm
from (
select
'SRID=2249;POLYGON((743238 2967416,743238 2967450,
743265 2967450,743265.625 2967416,743238 2967416))' :: geometry
geom
) subquery;
Проверьте, работает ли этот пример, это означает, что функция ST_Area существует.
Вы можете добавить столбец с типом геометрии postgis. https://postgis.net/docs/AddGeometryColumn.html
SELECT AddGeometryColumn ('my_schema','my_spatial_table','geom',4326,'POLYGON',2);
Затем преобразуйте ваши полигоны в формат postgis с помощью функций postgis.
Например https://postgis.net/docs/ST_MakePolygon.html
SELECT ST_MakePolygon( ST_GeomFromText('LINESTRING(75 29,77 29,77 29, 75 29)'));
Комментарии:
1. Можно напрямую преобразовать a
polygon
в ageometry
(например:select '((0,0),(0,10),(10,10),(10,0),(0,0))'::polygon::geometry;
)