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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list