我在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应该只返回一个由
组成的cstringinput_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 ......)? 任何帮助将不胜感激;)
答案 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中链接)那个案子)。