2017-05-31 3 views
0

J'ai créé un type personnalisé dans ma base de données postgresql avec cette structure composite:la création de fonctions d'entrée et de sortie pour le type de postgresql personnalisé à l'aide des types de PostGIS

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

donc il utilise certains types de PostGIS (POINT et POLYGON). Maintenant je voudrais pouvoir créer une fonction INPUT et OUTPUT pour ce type personnalisé afin que je puisse passer une simple représentation de chaîne (qui serait (x, y), c comme pour le type de cercle de géométrie native postgresql) pour créer une instance de celui-ci

ma pseudo-fonction d'entrée ressemblerait à ceci:

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)) 
    ])) 

et mon fonction_sortie devrait retourner simplement un cstring composé de

(center.x_lon,center.y_lat),radius 

mon problème est que je ne suis pas savoir comment écrire ces entrée un nd fonctions de sortie. Peuvent-ils être écrits en PLPgSQL ou devraient-ils être écrits en C? Et si oui, comment puis-je faire des appels aux fonctions postgis (comme ST_MakePoint, ST_MakePolygon, ST_MakeLine, ST_Project ...) à l'intérieur d'eux?

Répondre

0

Les fonctions d'entrée et de sortie de type doivent être écrites en C, car elles doivent accepter ou renvoyer le type cstring, qui est une chaîne C simple qui ne peut pas être gérée en SQL.

Voir the documentation qui montre un exemple. Vous pouvez appeler les fonctions PostGIS à partir de votre fonction via le Server Programming Interface (SPI), ce qui vous permet d'exécuter une instruction SQL, ou plus rapidement en appelant directement des fonctions C exportées de PostGIS (vous devez alors lier avec PostGIS) .