使用postgis类型为postgresql自定义类型创建输入和输出函数

时间:2017-05-31 21:16:40

标签: postgresql postgis plpgsql custom-type

我在postgresql数据库中使用这种复合结构创建了一个自定义类型:

(Xcol1:Xcol999,r1:r999 – Ycol1:Ycol999,r1:r999 )

所以它使用了一些postgis类型(POINT和POLYGON)。 现在我希望能够为这个自定义类型创建一个INPUT和OUTPUT函数,以便我可以传递一个简单的字符串表示(即(x,y),c类似于postgresql本机几何圆类型)来创建一个它的实例

我的输入伪函数看起来像这样:

CREATE TYPE circle_geo AS (
       box geography(POLYGON,4326), 
       center geography(POINT,4326), 
       radius float8
);

我的output_function应该只返回一个由

组成的cstring
input_function(cstring) where cstring is of the form (x,y),r:

radius = r;
center = ST_MakePoint(x,y);
pdist = sqrt(2*radius*radius);
box = ST_MakePolygon(ST_MakeLine(ARRAY[
                ST_Project(center, pdist, radians(45.0)),
                ST_Project(center, pdist, radians(135.0)),
                ST_Project(center, pdist, radians(-135.0)),
                ST_Project(center, pdist, radians(-45.0)),
                ST_Project(center, pdist, radians(45.0))
    ]))

我的问题是我不知道如何写这些输入和输出功能。它们可以用PLPgSQL编写还是必须用C语言编写?如果是这样,我如何调用postgis函数(如ST_MakePoint,ST_MakePolygon,ST_MakeLine,ST_Project ......)? 任何帮助将不胜感激;)

1 个答案:

答案 0 :(得分:0)

类型输入和输出函数必须用C编写,因为它们需要接受或返回类型// Entering paste mode (ctrl-D to finish) trait Domain { trait Bar { type B } type A <: Bar type B = A#B case class Foo(lhs: A, rhs: B) } object SomeDomain extends Domain { sealed trait Baz extends Bar { sealed trait Inner override type B = Inner } case object Brr extends Baz { case object Strawberry extends Inner case object Raspberry extends Inner } case object Bee extends Baz { case object Honey extends Inner case object Pooh extends Inner } override type A = Baz } val foo = SomeDomain.Foo(SomeDomain.Brr, SomeDomain.Bee.Pooh) val f1= foo.lhs val f2 = foo.rhs // Exiting paste mode, now interpreting. defined trait Domain defined object SomeDomain foo: SomeDomain.Foo = Foo(Brr,Pooh) f1: SomeDomain.A = Brr f2: SomeDomain.B = Pooh ,这是一个无法在SQL中处理的普通C字符串。

请参阅the documentation,其中显示了一个示例。

您可以通过Server Programming Interface(SPI)从您的函数调用PostGIS函数,它允许您执行SQL语句,或者通过直接调用从PostGIS导出的C函数来更快地调用(您必须在PostGIS中链接)那个案子)。