Changeset: 0cca40091c2c for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0cca40091c2c
Modified Files:
        geom/lib/libgeom.h
        geom/monetdb5/Makefile.ag
        geom/monetdb5/geom.c
        geom/monetdb5/geom.mal
        geom/sql/40_geom.sql
        monetdb5/mal/mal_client.h
Branch: geo
Log Message:

trying transform


diffs (truncated from 320 to 300 lines):

diff --git a/geom/lib/libgeom.h b/geom/lib/libgeom.h
--- a/geom/lib/libgeom.h
+++ b/geom/lib/libgeom.h
@@ -38,7 +38,7 @@
 #endif
 
 #include <geos_c.h>
-//#include "proj_api.h" //it is needed to transform from one srid to another
+#include "proj_api.h" //it is needed to transform from one srid to another
 
 typedef struct mbr {
        float xmin;
diff --git a/geom/monetdb5/Makefile.ag b/geom/monetdb5/Makefile.ag
--- a/geom/monetdb5/Makefile.ag
+++ b/geom/monetdb5/Makefile.ag
@@ -36,7 +36,7 @@ lib__geom = {
                   ../../gdk/libbat \
               ../../common/stream/libstream \
               ../../monetdb5/tools/libmonetdb5 \
-              $(GEOS_LIBS)
+              $(GEOS_LIBS) $(PROJ_LIBS)
 }
 
 headers_mal = {
diff --git a/geom/monetdb5/geom.c b/geom/monetdb5/geom.c
--- a/geom/monetdb5/geom.c
+++ b/geom/monetdb5/geom.c
@@ -32,7 +32,6 @@
 #include <mal_exception.h>
 #include <mal_client.h>
 #include <stream.h>
-#include "sql_scenario.h"
 
 
 #include <stdio.h>
@@ -151,85 +150,52 @@ geom_export str wkbBuffer(wkb **out, wkb
 geom_export str wkbGeometryN(wkb** out, wkb** geom, int* geometryNum); 
 geom_export str wkbNumGeometries(int* out, wkb** geom);
 
-/*
-//geom_export str wkbTransform(wkb**, wkb*, int*);
-geom_export str wkbTransform(void);
-
-static str executeQuery(char** result, char* query) {
-       // input from GDKin
-       bstream* fin = NULL; 
-
-       // output to user buffer
-       stream* fout = NULL;
-       struct buffer* resultsBuffer = NULL;
-
-       Client c = NULL;
-       str qmsg = MAL_SUCCEED;
-
-       char* resultstring = NULL;
-       int len = 0;
-
-       //create the output stream
-       resultsBuffer = buffer_create(BLOCK);
-       fout = buffer_wastream(resultsBuffer, "resultsring");
-       
-       //create a client
-       c = MCinitClient(CONSOLE, fin, fout);
-       qmsg = SQLstatementIntern(c, &query, "queryName", TRUE, TRUE);
-
-        if (qmsg == MAL_SUCCEED) {
-                resultstring = buffer_get_buf(resultsBuffer);
-                *result = GDKstrdup(resultstring);
-                free(resultstring);
-        } else {
-                len = strlen(qmsg) + 19;
-                resultstring = malloc(len);
-                snprintf(resultstring, len, "{ \"error\": \"%s\" }\n", qmsg);
-                *result = GDKstrdup(resultstring);
-                free(resultstring);
-        }
-        buffer_destroy(resultsBuffer);
-fprintf(stderr, "%s\n", resultstring);
-       
-       //destroy client when done
-       SQLexitClient(c);
-
-
-       return qmsg;
-
-}
-
-str wkbTransform(void) {
-       char* query = "SELECT count(*) FROM spatial_ref_sys";
-       char** result = NULL;
-
-       executeQuery(result, query);
-
-       return MAL_SUCCEED;
-}*/
+geom_export str wkbTransform(wkb**, wkb*, int*, char**, char**);
 
 /* It gets a geometry and transforms its coordinates to the provided srid */
-//str wkbTransform(wkb** trasformedWKB, wkb* geomWKB, int* srid) {
-/*str wkbTransform(wkb* geomWKB, int* srid) {
-       projPJ input_pj, output_pj;
-       GEOSGeom geosGeometry;
+str wkbTransform(wkb** transformedWKB, wkb* geomWKB, int* srid, char** 
proj4_src_str, char** proj4_dst_str) {
+       projPJ proj4_src, proj4_dst;
+       double x=10, y=10, z=10;
+
+
+if(geomWKB == NULL) 
+       fprintf(stderr, "NULL wkb\n");
+*transformedWKB = wkb_nil;
+
+fprintf(stderr, "SRID=%d SRC=%s DEST=%s\n", *srid, *proj4_src_str, 
*proj4_dst_str);
+
+proj4_src = pj_init_plus(*proj4_src_str);
+proj4_dst = pj_init_plus(*proj4_dst_str);
+
+fprintf(stderr, "BEFORE: (%f, %f, %f)\n", x, y, z);
+pj_transform(proj4_src, proj4_dst, 1, 0, &x, &y, &z);
+fprintf(stderr, "AFTER: (%f, %f, %f)\n", x, y, z);
+
+pj_free(proj4_src);
+pj_free(proj4_dst);
+
+//for each geometry in a multigeometry
+//for each point in the geometry
+//pj_transform(proj_src, proj_dst, 1, 0, x, y, z)
+
+
 //     str qmsg = MAL_SUCCEED;
 
        //check if the new srid is the same with the old one
-       if(geomWKB->srid == *srid)
-               fprintf(stderr, "New and old srids are the same\n");
-
-       //get GEOSGeometry from WKB     
-       geosGeometry = wkb2geos(geomWKB);
-       if(geosGeometry == NULL)
-               throw(MAL, "geom.Transform", "wkb2geos failed");
-       
-       //read the projection information from spatial_ref_sys  
-
+//     if(geomWKB->srid == *srid)
+//             fprintf(stderr, "New and old srids are the same\n");
+//
+//     //get GEOSGeometry from WKB     
+//     geosGeometry = wkb2geos(geomWKB);
+//     if(geosGeometry == NULL)
+//             throw(MAL, "geom.Transform", "wkb2geos failed");
+//     
+//     //read the projection information from spatial_ref_sys  
+//
        return MAL_SUCCEED;
 }
 
-*/
+
 
 geom_export str A_2_B(wkb** resWKB, wkb **valueWKB, int* columnType, int* 
columnSRID); 
 
diff --git a/geom/monetdb5/geom.mal b/geom/monetdb5/geom.mal
--- a/geom/monetdb5/geom.mal
+++ b/geom/monetdb5/geom.mal
@@ -255,8 +255,8 @@ comment "Returns the 1-based Nth geometr
 command NumGeometries(g:wkb) :int address wkbNumGeometries
 comment "Returns the number of geometries";
 
-#command Transfomr() :void address wkbTransform
-#comment "";
+command Transform(g:wkb, srid:int, proj_src:str, proj_dest:str) :wkb address 
wkbTransform
+comment "Transforms a geometry from one srid to another";
 
 
 
diff --git a/geom/sql/40_geom.sql b/geom/sql/40_geom.sql
--- a/geom/sql/40_geom.sql
+++ b/geom/sql/40_geom.sql
@@ -16,6 +16,44 @@
 -- All Rights Reserved.
 
 -- make sure you load the geom module before loading this sql module
+-- create spatial_ref_sys metadata table
+
+CREATE FUNCTION Has_Z(info integer) RETURNS integer EXTERNAL NAME geom."hasZ";
+CREATE FUNCTION Has_M(info integer) RETURNS integer EXTERNAL NAME geom."hasM";
+CREATE FUNCTION get_type(info integer) RETURNS string EXTERNAL NAME 
geom."getType";
+
+
+
+CREATE TABLE spatial_ref_sys (
+       srid INTEGER NOT NULL PRIMARY KEY,
+       auth_name VARCHAR (256),
+       auth_srid INTEGER,
+       srtext VARCHAR (2048),
+       proj4text VARCHAR (2048)
+);
+
+-- create geometry_columns metadata view
+create view geometry_columns as
+       select e.value as f_table_catalog,
+               s.name as f_table_schema,
+               y.f_table_name, y.f_geometry_column, y.coord_dimension, y.srid, 
y.type
+       from schemas s, environment e, (
+               select t.schema_id,
+                       t.name as f_table_name,
+                       x.name as f_geometry_column,
+                       has_z(info)+has_m(info)+2 as coord_dimension,
+                       srid, get_type(info) as type
+               from tables t, (
+                       select name, table_id, type_digits AS info, type_scale 
AS srid
+                       from columns
+                       where type in ( select distinct sqlname from types 
where systemname='wkb')
+                       ) as x
+               where t.id=x.table_id
+               ) y
+       where y.schema_id=s.id and e.name='gdk_dbname';
+
+
+copy into spatial_ref_sys from 
'/export/scratch1/alvanaki/DEV/MonetDB/geom/sql/postgis_spatial_ref_sys.csv' 
using delimiters ',';
 
 
 --CREATE TYPE Curve EXTERNAL NAME wkb;
@@ -40,10 +78,6 @@
 CREATE TYPE mbr EXTERNAL NAME mbr;
 
 
-CREATE FUNCTION Has_Z(info integer) RETURNS integer EXTERNAL NAME geom."hasZ";
-CREATE FUNCTION Has_M(info integer) RETURNS integer EXTERNAL NAME geom."hasM";
-CREATE FUNCTION get_type(info integer) RETURNS string EXTERNAL NAME 
geom."getType";
-
 -- currently we only use mbr instead of
 -- Envelope():Geometry
 -- as that returns Geometry objects, and we prefer the explicit mbr's
@@ -202,7 +236,24 @@ CREATE FUNCTION ST_Z(geom Geometry) RETU
 CREATE FUNCTION ST_SetSRID(geom Geometry, srid integer) RETURNS Geometry 
EXTERNAL NAME geom."setSRID";
 --CREATE FUNCTION ST_SnapToGrid RETURNS EXTERNAL NAME
 --CREATE FUNCTION ST_Snap RETURNS EXTERNAL NAME
---CREATE FUNCTION ST_Transform() RETURNS void EXTERNAL NAME geom."Transform";
+CREATE FUNCTION getProj4(srid_in integer) RETURNS string 
+BEGIN
+       RETURN SELECT proj4text FROM spatial_ref_sys WHERE srid=srid_in; 
+END;
+CREATE FUNCTION InternalTransform(geom Geometry, srid integer, proj4_src 
string, proj4_dest string) RETURNS Geometry EXTERNAL NAME geom."Transform";
+CREATE FUNCTION ST_Transform(geom Geometry, srid integer) RETURNS Geometry
+BEGIN
+       DECLARE srid_src integer;
+       DECLARE proj4_src string;
+       DECLARE proj4_dest string;
+
+       SELECT st_srid(geom) INTO srid_src;
+       SELECT getProj4(srid_src) INTO proj4_src;
+       SELECT getProj4(srid) INTO proj4_dest;
+
+       RETURN SELECT InternalTransform(geom, srid, proj4_src, proj4_dest);     
+END;
+
 --CREATE FUNCTION ST_Translate RETURNS EXTERNAL NAME
 --CREATE FUNCTION ST_TransScale RETURNS EXTERNAL NAME
 
@@ -355,36 +406,5 @@ CREATE FUNCTION ST_Union(geom1 Geometry,
 -- CREATE FUNCTION Surface(g Geometry) RETURNS Surface external name 
geom.surface;
 -- CREATE FUNCTION Polygon(g Geometry) RETURNS Polygon external name 
geom.polygon;
 
--- create spatial_ref_sys metadata table
-CREATE TABLE spatial_ref_sys (
-       srid INTEGER NOT NULL PRIMARY KEY,
-       auth_name VARCHAR (256),
-       auth_srid INTEGER,
-       srtext VARCHAR (2048),
-       proj4text VARCHAR (2048)
-);
 
--- create geometry_columns metadata view
-create view geometry_columns as
-       select e.value as f_table_catalog,
-               s.name as f_table_schema,
-               y.f_table_name, y.f_geometry_column, y.coord_dimension, y.srid, 
y.type
-       from schemas s, environment e, (
-               select t.schema_id,
-                       t.name as f_table_name,
-                       x.name as f_geometry_column,
-                       has_z(info)+has_m(info)+2 as coord_dimension,
-                       srid, get_type(info) as type
-               from tables t, (
-                       select name, table_id, type_digits AS info, type_scale 
AS srid
-                       from columns
-                       where type in ( select distinct sqlname from types 
where systemname='wkb')
-                       ) as x
-               where t.id=x.table_id
-               ) y
-       where y.schema_id=s.id and e.name='gdk_dbname';
 
-
-
-
-
diff --git a/monetdb5/mal/mal_client.h b/monetdb5/mal/mal_client.h
--- a/monetdb5/mal/mal_client.h
+++ b/monetdb5/mal/mal_client.h
@@ -62,9 +62,9 @@ typedef struct CLIENT {
        oid user;       /* user id in the auth administration */
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to