Changeset: 1b20018fb88a for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1b20018fb88a
Modified Files:
        geom/sql/40_geom.sql
        sql/backends/monet5/vaults/lidar/75_lidar.sql
        sql/backends/monet5/vaults/lidar/lidar.c
        sql/backends/monet5/vaults/lidar/lidar.mal
Branch: geo
Log Message:

Added an export function for LiDAR files.


diffs (truncated from 532 to 300 lines):

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
@@ -4419,4 +4419,44 @@ CREATE FUNCTION ST_DumpPoints(geom Geome
 -- CREATE FUNCTION Surface(g Geometry) RETURNS Surface external name 
geom.surface;
 -- CREATE FUNCTION Polygon(g Geometry) RETURNS Polygon external name 
geom.polygon;
 
+-------------------------------------------------------------------------
+----------------------- Handle SRID information -------------------------
+-------------------------------------------------------------------------
+--CREATE FUNCTION UpdateGeometrySRID(catalogn_name varchar, schema_name 
varchar, table_name varchar, column_name varchar, new_srid_in integer) RETURNS 
text -- external name geom.updateGeometrySRID;
+--BEGIN
+--     
+--END;
+
+--CREATE FUNCTION UpdateGeometrySRID(schema_name varchar, table_name varchar, 
column_name varchar, new_srid_in integer) RETURNS text
+--BEGIN
+--     RETURN UpdateGeometrySRID('',schema_name, table_name, column_name, 
new_srid_in);
+--END;
+--CREATE FUNCTION UpdateGeometrySRID(table_name varchar, column_name varchar, 
new_srid_in integer) RETURNS text
+--BEGIN
+--     RETURN UpdateGeometrySRID('','', table_name, column_name, new_srid_in);
+--END;
+
+
+--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;
+--
+--IF proj4_src IS NULL THEN
+--     RETURN SELECT InternalTransform(geom, srid_src, srid, 'null', 
proj4_dest);
+--ELSE
+--     IF proj4_dest IS NULL THEN
+--             RETURN SELECT InternalTransform(geom, srid_src, srid, 
proj4_src, 'null');
+--     ELSE
+--             RETURN SELECT InternalTransform(geom, srid_src, srid, 
proj4_src, proj4_dest);
+--     END IF;▸
+--END IF;
+
+
+-------------------------------------------------------------------------
+---------------------------- Miscellaneous ------------------------------
+-------------------------------------------------------------------------
 CREATE FUNCTION Contains(a Geometry, x double, y double) RETURNS BOOLEAN 
external name geom."Contains";
diff --git a/sql/backends/monet5/vaults/lidar/75_lidar.sql 
b/sql/backends/monet5/vaults/lidar/75_lidar.sql
--- a/sql/backends/monet5/vaults/lidar/75_lidar.sql
+++ b/sql/backends/monet5/vaults/lidar/75_lidar.sql
@@ -1,2 +1,3 @@
 create procedure lidarattach(fname string) external name lidar.attach;
 create procedure lidarload(tname string) external name lidar.load;
+create procedure lidarexport(tname string, fname string, format string) 
external name lidar.export;
diff --git a/sql/backends/monet5/vaults/lidar/lidar.c 
b/sql/backends/monet5/vaults/lidar/lidar.c
--- a/sql/backends/monet5/vaults/lidar/lidar.c
+++ b/sql/backends/monet5/vaults/lidar/lidar.c
@@ -358,39 +358,25 @@ lidar2subtype(sql_subtype *tpe, int t, l
 
 str LIDARexportTable(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
-(void) cntxt;
-(void) mb;
-(void) stk;
-(void) pci;
-#if 0
        str msg = MAL_SUCCEED;
+//     int* res_id = *getArgReference_str(stk, pci, 1);
        str tname = *getArgReference_str(stk, pci, 1);
+       str filename = *getArgReference_str(stk, pci, 2);
+       str format = toLower(*getArgReference_str(stk, pci, 2));
        mvc *m = NULL;
        sql_trans *tr;
        sql_schema *sch;
-       sql_table *tbl, *column, *tables = NULL;
-       sql_column *col;
-       oid rid = oid_nil;
-       str type, name, *colname, *tform;
-       lidarfile *fptr;
-       char filename[BUFSIZ];
-       long nrows = 0, optimal;
-       rids * rs;
+       sql_table *tbl;
+       BUN nrows = 0;
+       BUN i;
+       
+       sql_column *cols[3];
+       dbl *cols_dbl[3];
+       BAT *bats_dbl[3];
 
-       int tm0, texportboolean=0, texportchar=0, texportstring=0, 
texportshort=0, texportint=0, texportlong=0, texportfloat=0, texportdouble=0;
-       int numberrow = 0, cc = 0, status = 0, j = 0, columns, fid, dimension = 
0, block = 0;
-       int boolcols = 0, charcols = 0, strcols = 0, shortcols = 0, intcols = 
0, longcols = 0, floatcols = 0, doublecols = 0;
-       int hdutype;
-
-       char charvalue, *readcharrows;
-       str strvalue; char **readstrrows;
-       short shortvalue, *readshortrows;
-       int intvalue, *readintrows;
-       long longvalue, *readlongrows;
-       float realvalue, *readfloatrows;
-       double doublevalue, *readdoublerows;
-       _Bool boolvalue, *readboolrows;
-       struct list * set;
+       LASHeaderH header;
+       LASWriterH writer;
+       LASPointH point;
 
        if ((msg = getSQLContext(cntxt, mb, &m, NULL)) != MAL_SUCCEED)
                return msg;
@@ -408,328 +394,98 @@ str LIDARexportTable(Client cntxt, MalBl
                return msg;
        }
 
-       set = (*tbl).columns.set;
+       /* Bind the necessary columns */
+       cols[0] = mvc_bind_column(m, tbl, "x");
+       cols[1] = mvc_bind_column(m, tbl, "y");
+       cols[2] = mvc_bind_column(m, tbl, "z");
+       if (cols[0] == NULL || cols[1] == NULL || cols[2] == NULL) {
+               msg = createException(MAL, "lidar.exporttable", "Could not 
locate a column with name 'x', 'y', or 'z'.");
+               return msg;
+       } 
+       //bats_dbl[0] = mvc_bind(m, *sname, *tname, *cname, *access);
+       bats_dbl[0] = store_funcs.bind_col(tr, cols[0], 0);
+       bats_dbl[1] = store_funcs.bind_col(tr, cols[1], 0);
+       bats_dbl[2] = store_funcs.bind_col(tr, cols[2], 0);
 
-       columns = list_length(set);
-       colname = (str *) GDKmalloc(columns * sizeof(str));
-       tform = (str *) GDKmalloc(columns * sizeof(str));
+       cols_dbl[0] = (dbl*)Tloc(bats_dbl[0], BUNfirst(bats_dbl[0]));
+       cols_dbl[1] = (dbl*)Tloc(bats_dbl[1], BUNfirst(bats_dbl[1]));
+       cols_dbl[2] = (dbl*)Tloc(bats_dbl[2], BUNfirst(bats_dbl[2]));
 
-       /* fprintf(stderr,"Number of columns: %d\n", columns);*/
+       nrows = store_funcs.count_col(tr, cols[0], 1);
 
-       tables = mvc_bind_table(m, sch, "_tables");
-       col = mvc_bind_column(m, tables, "name");
-       rid = table_funcs.column_find_row(m->session->tr, col, tname, NULL);
+       /* Populate the header */
+       header = LASHeader_Create();
+       LASHeader_SetCompressed(header, (strcmp(format, "laz") == 0));
+/*
+       LASHeader_SetCreationDOY
+       LASHeader_SetCreationYear
+       LASHeader_SetDataFormatId
+       LASHeader_SetDataOffset
+       LASHeader_SetDataRecordLength
+       LASHeader_SetFileSourceId
+       LASHeader_SetGUID
+       LASHeader_SetHeaderPadding
+       LASHeader_SetMax
+       LASHeader_SetMin
+       LASHeader_SetOffset
+       LASHeader_SetPointRecordsByReturnCount
+*/
+       LASHeader_SetPointRecordsCount(header, nrows);
+/*
+       LASHeader_SetProjectId
+       LASHeader_SetReserved
+       LASHeader_SetScale
+       LASHeader_SetSchema
+*/
+       LASHeader_SetSoftwareId(header, "MonetDB B.V.");
+/*     LASHeader_SetSRS */
+       LASHeader_SetSystemId(header, "MonetDB B.V.");
+       LASHeader_SetVersionMajor(header, '1');
+       LASHeader_SetVersionMinor(header, '2');
 
-       col = mvc_bind_column(m, tables, "id");
-       fid = *(int*) table_funcs.column_find_value(m->session->tr, col, rid);
+       /* Create the writer*/
+       MT_lock_set(&mt_lidar_lock);
+       writer = LASWriter_Create(filename, header, LAS_MODE_WRITE);
+       // TODO: Failure is always an option
+       MT_lock_unset(&mt_lidar_lock);
 
-       column =  mvc_bind_table(m, sch, "_columns");
-       col = mvc_bind_column(m, column, "table_id");
 
-       rs = table_funcs.rids_select(m->session->tr, col, (void *) &fid, (void 
*) &fid, NULL);
+       /* Iterate over the table */
+       for (i = 0; i < nrows; i++) {
+               point = LASPoint_Create();
+/*
+               LASPoint_SetClassification
+               LASPoint_SetColor
+               LASPoint_SetData
+               LASPoint_SetFlightLineEdge
+               LASPoint_SetHeader
+               LASPoint_SetIntensity
+               LASPoint_SetNumberOfReturns
+               LASPoint_SetPointSourceId
+               LASPoint_SetRawX
+               LASPoint_SetRawY
+               LASPoint_SetRawZ
+               LASPoint_SetReturnNumber
+               LASPoint_SetScanAngleRank
+               LASPoint_SetScanDirection
+               LASPoint_SetScanFlags
+               LASPoint_SetTime
+               LASPoint_SetUserData
+*/
+               LASPoint_SetX(point, cols_dbl[0][i]);
+               LASPoint_SetY(point, cols_dbl[1][i]);
+               LASPoint_SetZ(point, cols_dbl[2][i]);
 
-       while ((rid = table_funcs.rids_next(rs)) != oid_nil)
-       {
-               col = mvc_bind_column(m, column, "name");
-               name = (char *) table_funcs.column_find_value(m->session->tr, 
col, rid);
-               colname[j] = toLower(name);
-
-               col = mvc_bind_column(m, column, "type");
-               type = (char *) table_funcs.column_find_value(m->session->tr, 
col, rid);
-
-               if (strcmp(type,"boolean")==0) tform[j] = "1L";
-
-               if (strcmp(type,"char")==0) tform[j] = "1S";
-
-               if (strcmp(type,"varchar")==0) tform[j] = "8A";
-
-               if (strcmp(type,"smallint")==0) tform[j] = "1I";
-
-               if (strcmp(type,"int")==0) tform[j] = "1J";
-
-               if (strcmp(type,"bigint")==0) tform[j] = "1K";
-
-               if (strcmp(type,"real")==0) tform[j] = "1E";
-
-               if (strcmp(type,"double")==0) tform[j] = "1D";
-
-               j++;
+               LASWriter_WritePoint(writer, point);
+               LASPoint_Destroy(point);
        }
 
-       col = mvc_bind_column(m, tbl, colname[0]);
+       MT_lock_set(&mt_lidar_lock);
+       LASHeader_Destroy(header);
+       LASWriter_Destroy(writer);
+       MT_lock_unset(&mt_lidar_lock);
 
-       nrows = store_funcs.count_col(tr, col, 1);
-
-       snprintf(filename,BUFSIZ,"\n%s.fit",tname);
-       fprintf(stderr, "Filename: %s\n", filename);
-
-       remove(filename);
-
-       status=0;
-
-       lidar_create_file(&fptr, filename, &status);
-       lidar_create_img(fptr,  USHORT_IMG, 0, NULL, &status);
-       lidar_close_file(fptr, &status);
-       lidar_open_file(&fptr, filename, READWRITE, &status);
-
-       lidar_movabs_hdu(fptr, 1, &hdutype, &status);
-       lidar_create_tbl( fptr, BINARY_TBL, 0, columns, colname, tform, NULL, 
tname, &status);
-
-       for (cc = 0; cc < columns; cc++)
-       {
-               char * columntype;
-               col = mvc_bind_column(m, tbl, colname[cc]);
-               columntype = col -> type.type->sqlname;
-
-               if (strcmp(columntype,"boolean")==0)
-               {
-                       boolcols++; dimension = 0; block = 0;
-                       lidar_get_rowsize(fptr,&optimal,&status);
-                       readboolrows = (_Bool *) GDKmalloc (sizeof(_Bool) * 
optimal);
-
-                       for (numberrow = 0; numberrow < nrows ; numberrow++)
-                       {
-                               boolvalue = *(_Bool*) 
table_funcs.column_find_value(m->session->tr, col, numberrow);
-                               readboolrows[dimension] = boolvalue;
-                               dimension++;
-
-                               if (dimension == optimal)
-                               {
-                                       dimension = 0;
-                                       tm0 = GDKms();
-                                       lidar_write_col(fptr, TLOGICAL, cc+1, 
(optimal*block)+1, 1, optimal, readboolrows, &status);
-                                       texportboolean += GDKms() - tm0;
-                                       GDKfree(readboolrows);
-                                       readboolrows = (_Bool *) GDKmalloc 
(sizeof(_Bool) * optimal);
-                                       block++;
-                               }
-                       }
-                       tm0 = GDKms();
-                       lidar_write_col(fptr, TLOGICAL, cc+1, 
(optimal*block)+1, 1, dimension, readboolrows, &status);
-                       texportboolean += GDKms() - tm0;
-                       GDKfree(readboolrows);          
-               }
-
-               if (strcmp(columntype,"char")==0)
-               {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to