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