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