1
/************************************************************************************
2
TerraLib - a library for developing GIS applications.
3
Copyright ļæ½ 2001-2004 INPE and Tecgraf/PUC-Rio.
5
This code is part of the TerraLib library.
6
This library is free software; you can redistribute it and/or
7
modify it under the terms of the GNU Lesser General Public
8
License as published by the Free Software Foundation; either
9
version 2.1 of the License, or (at your option) any later version.
11
You should have received a copy of the GNU Lesser General Public
12
License along with this library.
14
The authors reassure the license terms regarding the warranties.
15
They specifically disclaim any warranties, including, but not limited to,
16
the implied warranties of merchantability and fitness for a particular purpose.
17
The library provided hereunder is on an "as is" basis, and the authors have no
18
obligation to provide maintenance, support, updates, enhancements, or modifications.
19
In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
20
indirect, special, incidental, or consequential damages arising out of the use
21
of this library and its documentation.
22
*************************************************************************************/
24
#include "TeDecoderDatabase.h"
25
#include "TeRasterRemap.h"
26
#include "TeGeometryAlgorithms.h"
27
#include "TeSpatialOperations.h"
28
#include "TeImportRaster.h"
29
#include "TeDatabase.h"
33
typedef map<int,TeNode> TeNodeMap;
35
static const int scales [] =
55
//-*********************
57
TeDatabase::TeDatabase() :
70
TeDatabase::~TeDatabase()
74
bool TeDatabase::validTable (TeTable& table)
78
bool changeTable = false;
79
bool uniqueName, linkName;
81
TeAttributeList::iterator it = table.attributeList().begin();
82
TeAttributeList::iterator it2;
83
while(it != table.attributeList().end())
88
if((*it).rep_.name_==table.uniqueName())
91
if((*it).rep_.name_==table.linkName())
95
string temp = TeCheckName((*it).rep_.name_, change, errorMess);
99
it2 = table.attributeList().begin();
100
while(it2!=table.attributeList().end())
102
if(temp==(*it2).rep_.name_)
104
temp += Te2String(cont);
105
it2 = table.attributeList().begin();
115
if(change && uniqueName)
116
table.setUniqueName(temp);
117
if(change && linkName)
118
table.setLinkName (temp);
120
(*it).rep_.name_ = temp;
128
string TeDatabase::getTableName(int tableId)
132
TeDatabasePortal* pt = getPortal();
133
string q = "SELECT attr_table FROM te_layer_table";
134
q += " WHERE table_id = " + Te2String(tableId);
135
if (pt->query(q) == true && pt->fetchRow())
136
tableName = pt->getData("attr_table");
141
bool TeDatabase::createTable(const string& table, TeAttributeList &attr)
143
string q ="CREATE TABLE " + table +" (";
150
TeAttributeList::iterator it;
152
while ( it != attr.end() )
154
string name = (*it).rep_.name_;
156
switch ((*it).rep_.type_)
160
sprintf (size,"(%d)",(*it).rep_.numChar_);
161
type += string (size);
165
sprintf (size,"(%d,%d)",(*it).rep_.numChar_, (*it).rep_.decimals_);
166
type += string (size);
175
type = "DATETIME "; //time
182
sprintf (size,"(%d)",(*it).rep_.numChar_);
183
type += string (size);
187
if((*it).rep_.isAutoNumber_ && (*it).rep_.isPrimaryKey_)
188
type += " AUTO_INCREMENT ";
195
q += name + " " + type;
197
// check if column is part of primary key
198
if ( (*it).rep_.isPrimaryKey_ && (*it).rep_.type_ != TeBLOB )
202
pkeys += (*it).rep_.name_;
210
q += ", PRIMARY KEY (" + pkeys + ") ";
217
TeDatabase::deleteTable (const string& table)
219
int f = table.find ("te_collection", std::string::npos);
221
if( table=="te_theme" ||
223
table=="te_representation" ||
224
table=="te_tables_relation" ||
225
table=="te_layer_table" ||
226
table=="te_raster_metadata" ||
227
table=="te_projection" ||
229
table=="te_legend" ||
230
table=="te_visual" ||
231
table=="te_database" ||
234
errorMessage_ = "Nļæ½o ļæ½ possļæ½vel deletar tabelas do modelo!";
238
string del = "DROP TABLE " + table;
247
TeDatabase::deleteColumn (const string& table, const string& colName)
249
if (!tableExist(table))
252
if (!columnExist(table,colName,attr))
254
string drop = "ALTER TABLE " + table + " DROP COLUMN " + colName;
255
if(execute(drop) == false)
259
TeDatabasePortal* portal = getPortal();
260
string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + table + "'";
261
if(portal->query(sql) && portal->fetchRow())
262
tableId = portal->getData(0);
265
if(tableId.empty() == false)
268
sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
269
sql += " AND related_attr = '" + colName + "')";
270
sql += " OR (external_table_name = '" + table + "'";
271
sql += " AND external_attr = '" + colName + "')";
272
if(execute(sql) == false)
276
TeDatabasePortal* portal = getPortal();
277
sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + table + "." + colName + "'";
278
if(portal->query(sql) && portal->fetchRow())
280
string themeId = portal->getData(0);
282
sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
283
if(execute(sql) == false)
291
sql = "DELETE FROM te_grouping";
292
sql += " WHERE grouping_attr = '" + table + "." + colName + "'";
293
if(execute(sql) == false)
301
TeDatabase::defineIntegrity(void)
303
if (existRelation("te_layer","fk_layer_proj_id") == TeNoRelation )
304
if (!createRelation("fk_layer_proj_id", "te_layer", "projection_id", "te_projection", "projection_id", false))
307
if (existRelation("te_representation","fk_rep_layer_id") == TeNoRelation )
308
if (!createRelation("fk_rep_layer_id", "te_representation", "layer_id", "te_layer", "layer_id", true))
311
if (existRelation("te_view","fk_view_proj_id") == TeNoRelation )
312
if (!createRelation("fk_view_proj_id", "te_view", "projection_id", "te_projection", "projection_id", false))
315
if (existRelation("te_theme","fk_theme_layer_id") == TeNoRelation )
316
if (!createRelation("fk_theme_layer_id", "te_theme", "layer_id", "te_layer", "layer_id", true))
319
if (existRelation("te_theme","fk_theme_view_id") == TeNoRelation )
320
if (!createRelation("fk_theme_view_id", "te_theme", "view_id", "te_view", "view_id", true))
323
if (existRelation("te_theme_table","fk_thmtable_theme_id") == TeNoRelation )
324
if (!createRelation("fk_thmtable_theme_id", "te_theme_table", "theme_id", "te_theme", "theme_id", true))
327
if (existRelation("te_theme_table","fk_thmtable_lytable_id") == TeNoRelation )
328
if (!createRelation("fk_thmtable_lytable_id", "te_theme_table", "table_id", "te_layer_table", "table_id", true))
331
if (existRelation("te_theme_table","fk_thmtable_relation_id") == TeNoRelation )
332
if (!createRelation("fk_thmtable_relation_id", "te_theme_table", "relation_id", "te_tables_relation", "relation_id", true))
335
if (existRelation("te_grouping","fk_group_theme_id") == TeNoRelation )
336
if (!createRelation("fk_group_theme_id", "te_grouping", "theme_id", "te_theme", "theme_id", true))
339
if (existRelation("te_legend","fk_legend_theme_id") == TeNoRelation )
340
if (!createRelation("fk_legend_theme_id", "te_legend", "theme_id", "te_theme", "theme_id", true))
343
if (existRelation("te_visual","fk_visual_legend_id") == TeNoRelation )
344
if (!createRelation("fk_visual_legend_id", "te_visual", "legend_id", "te_legend", "legend_id", true))
347
if (existRelation("te_layer_table","fk_laytable_layer_id") == TeNoRelation )
348
if (!createRelation ("fk_laytable_layer_id", "te_layer_table", "layer_id", "te_layer", "layer_id", true))
351
if (existRelation("te_tables_relation","fk_tabrelation_laytable_id") == TeNoRelation )
352
if (!createRelation("fk_tabrelation_laytable_id", "te_tables_relation", "related_table_id", "te_layer_table", "table_id", true))
355
if (existRelation("te_visual_raster","fk_visrast_theme_id") == TeNoRelation )
356
if (!createRelation("fk_visrast_theme_id", "te_visual_raster", "theme_id", "te_theme", "theme_id", true))
363
TeDatabase::createConceptualModel(bool withIntegrity, bool newDatabase, bool /* createIndex */)
366
bool createMainTables = false;
368
if (!this->tableExist("te_projection"))
370
status = this->createProjectionTable();
373
createMainTables = true;
376
if (!this->tableExist("te_layer"))
378
status = this->createLayerTable();
381
createMainTables = true;
384
if (!this->tableExist("te_layer_table"))
386
status = this->createLayerTableTable();
389
createMainTables = true;
392
if (!this->tableExist("te_tables_relation"))
394
status = this->createTablesRelationTable();
399
if (!this->tableExist("te_representation"))
401
status = this->createRepresentationTable();
404
createMainTables = true;
407
if (!this->tableExist("te_view"))
409
status = this->createViewTable();
412
createMainTables = true;
415
if (!this->tableExist("te_theme"))
417
status = this->createThemeTable();
422
if (!this->tableExist("te_grouping"))
424
status = this->createGroupingTable();
429
if (!this->tableExist("te_theme_table"))
431
status = this->createThemeTablesTable();
436
if (!this->tableExist("te_legend"))
438
status = this->createLegendTable();
443
if (!this->tableExist("te_visual"))
445
status = this->createVisualTable();
450
if (!this->tableExist("te_visual_raster"))
452
status = this->createVisualRasterTable();
457
if (!this->tableExist("te_database"))
459
status = this->createDatabaseTable();
464
if(newDatabase || createMainTables)
466
string ins = "INSERT INTO te_database (db_version) VALUES ('3.0.2')";
472
status = defineIntegrity();
478
TeDatabase::createIndex(const string& tableName, const string& indexName, const string& columnsName)
480
string sql = "CREATE INDEX " + indexName + " ON " + tableName + "(" + columnsName + ")";
481
return execute (sql);
485
TeDatabase::createDatabaseTable()
487
string create = "CREATE TABLE te_database (";
488
create += "db_version VARCHAR(50) NOT NULL,";
489
create += "db_creation DATETIME,";
490
create += "PRIMARY KEY (db_version))";
491
return execute (create);
496
TeDatabase::createProjectionTable ()
498
string create = "CREATE TABLE te_projection (";
499
create += "projection_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
500
create += "name VARCHAR(50) NOT NULL,";
501
create += "long0 DOUBLE(24,15) DEFAULT '0.0',";
502
create += "lat0 DOUBLE(24,15) DEFAULT '0.0',";
503
create += "offx DOUBLE(24,15) DEFAULT '0.0',";
504
create += "offy DOUBLE(24,15) DEFAULT '0.0',";
505
create += "stlat1 DOUBLE(24,15) DEFAULT '0.0',";
506
create += "stlat2 DOUBLE(24,15) DEFAULT '0.0',";
507
create += "unit VARCHAR(50) NOT NULL,";
508
create += "scale DOUBLE(24,15) DEFAULT '0.0',";
509
create += "hemis INT(4) NOT NULL,";
510
create += "datum VARCHAR(50) NOT NULL,";
511
create += "radius DOUBLE(24,15) DEFAULT '0.0',";
512
create += "flattening DOUBLE(24,15) DEFAULT '0.0',";
513
create += "dx DOUBLE(24,15) DEFAULT '0.0',";
514
create += "dy DOUBLE(24,15) DEFAULT '0.0',";
515
create += "dz DOUBLE(24,15) DEFAULT '0.0',";
516
create += "PRIMARY KEY (projection_id))";
517
return execute (create);
520
bool TeDatabase::createLayerTable ()
522
string create = "CREATE TABLE te_layer (";
523
create += "layer_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
524
create += "projection_id INT(10) UNSIGNED NOT NULL,";
525
create += "name VARCHAR(255) NOT NULL,";
526
create += "lower_x DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
527
create += "lower_y DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
528
create += "upper_x DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
529
create += "upper_y DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
530
create += "initial_time DATETIME,";
531
create += "final_time DATETIME, ";
532
create += "PRIMARY KEY (layer_id))";
533
return execute (create);
536
bool TeDatabase::createLayerTableTable()
538
string create = "CREATE TABLE te_layer_table (";
539
create += "table_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
540
create += "layer_id INT(10) UNSIGNED,";
541
create += "attr_table VARCHAR(255) NOT NULL,";
542
create += "unique_id VARCHAR(255), ";
543
create += "attr_link VARCHAR(255), ";
544
create += "attr_initial_time VARCHAR(255), ";
545
create += "attr_final_time VARCHAR(255), ";
546
create += "attr_time_unit INT(4) UNSIGNED, ";
547
create += "attr_table_type INT(4) UNSIGNED, ";
548
create += "user_name VARCHAR(255),";
549
create += "initial_time DATETIME,";
550
create += "final_time DATETIME, ";
551
create += "PRIMARY KEY (table_id))";
552
return execute (create);
556
TeDatabase::updateTableInfo(int layerId, TeTable &table, const string user)
558
if (table.id() <= 0 ) // table information doesnļæ½t exist in database yet
559
return this->insertTableInfo(layerId,table,user);
561
sql = "UPDATE te_layer_table SET ";
562
sql += "unique_id='" + table.uniqueName() + "', ";
563
sql += "attr_link='" + table.linkName() + "', ";
564
sql += "attr_initial_time='" + table.attInitialTime() + "', ";
565
sql += "attr_final_time='" + table.attFinalTime() + "', ";
566
sql += "attr_time_unit=" + Te2String(table.attTimeUnit()) + ", ";
567
sql += "attr_table_type="+ Te2String(table.tableType()) + ", ";
568
sql += "user_name='" + user + "' WHERE ";
569
sql += "layer_id=" + Te2String(layerId) + " AND ";
570
sql += "attr_table_name='" + table.name() + "'";
571
return execute (sql);
575
TeDatabase::loadTableInfo(TeTable& table)
577
if (table.name().empty())
580
TeDatabasePortal* portal = this->getPortal();
583
this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
587
string get = "SELECT * FROM te_layer_table WHERE attr_table = '" + table.name() + "'";
588
if (!portal->query(get) || !portal->fetchRow())
594
table.setId(portal->getInt("table_id"));
595
table.setLinkName(portal->getData("attr_link"));
596
table.setUniqueName(portal->getData("unique_id"));
597
table.setTableType(TeAttrTableType(portal->getInt("attr_table_type")));
598
TeAttributeList attrList;
599
getAttributeList(table.name(), attrList);
600
table.setAttributeList(attrList);
601
table.attInitialTime(portal->getData("attr_initial_time"));
602
table.attFinalTime(portal->getData("attr_final_time"));
603
table.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
609
bool TeDatabase::createLUTTable(const string& name)
611
string create = "CREATE TABLE " + name + "(";
612
create += "index_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
613
create += "r_val INT(10) UNSIGNED NOT NULL,";
614
create += "g_val INT(10) NOT NULL,";
615
create += "b_val INT(10) NOT NULL,";
616
create += "PRIMARY KEY (index_id))";
617
return execute (create);
620
bool TeDatabase::createTablesRelationTable()
622
string create = "CREATE TABLE te_tables_relation (";
623
create += "relation_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
624
create += "related_table_id INT(10) NOT NULL,";
625
create += "related_attr VARCHAR(255) NOT NULL,";
626
create += "external_table_name VARCHAR(255) NOT NULL,";
627
create += "external_attr VARCHAR(255) NOT NULL,";
628
create += "PRIMARY KEY (relation_id))";
629
return execute (create);
632
bool TeDatabase::createRepresentationTable ()
634
string create = "CREATE TABLE te_representation (";
635
create += "repres_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, ";
636
create += "layer_id INT(10) UNSIGNED NOT NULL, ";
637
create += "geom_type INT(10) NOT NULL, ";
638
create += "geom_table VARCHAR(255) NOT NULL, ";
639
create += "description VARCHAR(255), ";
640
create += "lower_x DOUBLE(24,15) DEFAULT '0.0', ";
641
create += "lower_y DOUBLE(24,15) DEFAULT '0.0', ";
642
create += "upper_x DOUBLE(24,15) DEFAULT '0.0', ";
643
create += "upper_y DOUBLE(24,15) DEFAULT '0.0', ";
644
create += "res_x DOUBLE(24,15) DEFAULT '0.0', ";
645
create += "res_y DOUBLE(24,15) DEFAULT '0.0', ";
646
create += "num_cols INT(10), ";
647
create += "num_rows INT(10), ";
648
create += "initial_time DATETIME, ";
649
create += "final_time DATETIME, ";
650
create += "PRIMARY KEY (repres_id), ";
651
create += "INDEX representation_index (layer_id,geom_type))";
652
return execute (create);
655
bool TeDatabase::createRasterMetadataTable(const string& tableName)
657
if (tableName.empty())
660
string create = "CREATE TABLE " + tableName + " (";
661
create += " geom_id INT(10) UNSIGNED NOT NULL, ";
662
create += " band_id INT(10) UNSIGNED NOT NULL, ";
663
create += " min_value DOUBLE(24,15) DEFAULT '0.0', ";
664
create += " max_value DOUBLE(24,15) DEFAULT '0.0', ";
665
create += " num_bits INT(10), ";
666
create += " data_type INT(4), ";
667
create += " photometric_type INT(4), ";
668
create += " compression_type INT(4), ";
669
create += " dummy DOUBLE(24,15), ";
670
create += " PRIMARY KEY (geom_id, band_id))";
671
return execute (create);
675
bool TeDatabase::createRasterGeometry(const string& tableName)
677
if (tableName.empty())
680
string create = "CREATE TABLE " + tableName + " (";
681
create += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, ";
682
create += "object_id VARCHAR(255) NOT NULL, ";
683
create += "raster_table VARCHAR(255) NOT NULL, ";
684
create += "lut_table VARCHAR(255), ";
685
create += "res_x DOUBLE(24,15) DEFAULT '0.0', ";
686
create += "res_y DOUBLE(24,15) DEFAULT '0.0', ";
687
create += "num_bands INT(10), ";
688
create += "num_cols INT(10), ";
689
create += "num_rows INT(10), ";
690
create += "block_height INT(10), ";
691
create += "block_width INT(10), ";
692
create += "lower_x DOUBLE(24,15) DEFAULT '0.0', ";
693
create += "lower_y DOUBLE(24,15) DEFAULT '0.0', ";
694
create += "upper_x DOUBLE(24,15) DEFAULT '0.0', ";
695
create += "upper_y DOUBLE(24,15) DEFAULT '0.0', ";
696
create += "tiling_type INT(4), ";
697
create += "PRIMARY KEY (geom_id), ";
698
create += "INDEX " + tableName + "_index(object_id))";
699
return execute (create);
702
bool TeDatabase::createViewTable ()
704
string create = "CREATE TABLE te_view (";
705
create += "view_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
706
create += "projection_id INT(10) UNSIGNED NOT NULL,";
707
create += "name VARCHAR(255) NOT NULL,";
708
create += "user_name VARCHAR(255),";
709
create += "visibility INT(4),";
710
create += "PRIMARY KEY (view_id))";
711
return execute (create);
714
bool TeDatabase::createThemeTable ()
716
string create = "CREATE TABLE te_theme (";
717
create += " theme_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
718
create += " layer_id INT(10) UNSIGNED,";
719
create += " view_id INT(10) UNSIGNED NOT NULL,";
720
create += " name VARCHAR(255) NOT NULL,";
721
create += " parent_id INT(10) UNSIGNED NOT NULL,";
722
create += " priority INT(10) UNSIGNED NOT NULL,";
723
create += " node_type INT(4) UNSIGNED NOT NULL,";
724
create += " min_scale DOUBLE(24,15),";
725
create += " max_scale DOUBLE(24,15),";
726
create += " generate_attribute_where VARCHAR(255),";
727
create += " generate_spatial_where VARCHAR(255),";
728
create += " generate_temporal_where VARCHAR(255),";
729
create += " collection_table VARCHAR(255),";
730
create += " visible_rep INT(10) UNSIGNED,";
731
create += " enable_visibility INT(10) UNSIGNED,";
732
create += " PRIMARY KEY (theme_id),";
733
create += " INDEX view_id_idx(view_id))";
734
return execute (create);
737
bool TeDatabase::createGroupingTable()
739
string create = "CREATE TABLE te_grouping (";
740
create += " theme_id INT(10) UNSIGNED NOT NULL,";
741
create += " grouping_number INT(10) UNSIGNED,";
742
create += " grouping_attr VARCHAR(255),";
743
create += " grouping_attr_type INT(4) UNSIGNED,";
744
create += " grouping_mode INT(4) UNSIGNED,";
745
create += " grouping_norm_attr VARCHAR(255),";
746
create += " grouping_std_dev DOUBLE(24,15) DEFAULT '0.0',";
747
create += " grouping_precision INT(10) UNSIGNED,";
748
create += " grouping_function VARCHAR(20),";
749
create += " PRIMARY KEY (theme_id))";
750
return execute (create);
753
bool TeDatabase::createThemeTablesTable()
755
string create = "CREATE TABLE te_theme_table (";
756
create += " theme_table_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
757
create += " theme_id INT(10) UNSIGNED NOT NULL,";
758
create += " table_id INT(10) UNSIGNED NOT NULL,";
759
create += " relation_id INT(10) UNSIGNED,";
760
create += " table_order INT(10) UNSIGNED,";
761
create += " PRIMARY KEY (theme_table_id), ";
762
create += " INDEX theme_table_index(theme_id))";
764
return execute (create);
767
bool TeDatabase::createLegendTable ()
769
string create = "CREATE TABLE te_legend (";
770
create += " legend_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
771
create += " theme_id INT(10) UNSIGNED NOT NULL,";
772
create += " group_id INT(10) ,";
773
create += " num_objs INT(10) UNSIGNED,";
774
create += " lower_value VARCHAR(255),";
775
create += " upper_value VARCHAR(255),";
776
create += " label VARCHAR(255), ";
777
create += " PRIMARY KEY (legend_id),";
778
create += " INDEX legend_index (theme_id))";
779
return execute (create);
783
bool TeDatabase::createVisualTable()
785
string create = "CREATE TABLE te_visual (";
786
create += " legend_id INT(10) UNSIGNED NOT NULL,";
787
create += " geom_type INT(4) UNSIGNED NOT NULL,";
788
create += " lib_name VARCHAR(255), ";
789
create += " symb_id INT(10), ";
790
create += " red INT(4) UNSIGNED,";
791
create += " green INT(4) UNSIGNED,";
792
create += " blue INT(4) UNSIGNED,";
793
create += " transparency INT(4) UNSIGNED,";
794
create += " width INT(4) UNSIGNED,";
795
create += " contour_lib_name VARCHAR(255), ";
796
create += " contour_symb_id INT(10), ";
797
create += " contour_red INT(4) UNSIGNED,";
798
create += " contour_green INT(4) UNSIGNED,";
799
create += " contour_blue INT(4) UNSIGNED,";
800
create += " contour_transp INT(4) UNSIGNED,";
801
create += " contour_width INT(10) UNSIGNED,";
802
create += " size_value INT(10) UNSIGNED,";
803
create += " pt_angle INT(4) UNSIGNED,";
804
create += " family VARCHAR(255),";
805
create += " bold INT(4) UNSIGNED,";
806
create += " italic INT(4) UNSIGNED,";
807
create += " alignment_vert DOUBLE(24,15),";
808
create += " alignment_horiz DOUBLE(24,15),";
809
create += " tab_size INT(4) UNSIGNED,";
810
create += " line_space INT(4) UNSIGNED,";
811
create += " fixed_size INT(4) UNSIGNED,";
812
create += " PRIMARY KEY (legend_id, geom_type))";
813
return execute (create);
816
bool TeDatabase::createVisualRasterTable()
818
string create = "CREATE TABLE te_visual_raster (";
819
create += " theme_id INT(10) UNSIGNED NOT NULL,";
820
create += " band_in INT(4) UNSIGNED NOT NULL,";
821
create += " band_out INT(4) UNSIGNED, ";
822
create += " transf_type INT(4), ";
823
create += " param1 DOUBLE(24,15),";
824
create += " param2 DOUBLE(24,15),";
825
create += " lut_table VARCHAR(255), ";
826
create += " PRIMARY KEY (theme_id, band_in))";
827
return execute (create);
830
bool TeDatabase::insertVisual (TeLegendEntry *legend)
832
TeGeomRepVisualMap mapVis = legend->getVisualMap();
833
TeGeomRepVisualMap::iterator it = mapVis.begin();
834
while ( it != mapVis.end())
836
TeGeomRep rep = it->first;
837
TeVisual vis = it->second;
839
string style, contourStyle, sizeValue, width;
841
if(rep == TePOLYGONS || rep == TeCELLS)
843
sizeValue = Te2String(0);
844
contourStyle = Te2String(vis.contourStyle());
845
width = Te2String(0);
846
style = Te2String(vis.style());
848
else if(rep == TeLINES)
850
sizeValue = Te2String(0);
851
contourStyle = Te2String(0);
852
width = Te2String(vis.width());
853
style = Te2String(vis.style());
855
else if(rep == TePOINTS)
857
sizeValue = Te2String(vis.size());
858
contourStyle = Te2String(0);
859
width = Te2String(0);
860
style = Te2String(vis.style());
862
else if(rep == TeTEXT)
864
sizeValue = Te2String(vis.size());
865
contourStyle = Te2String(0);
866
width = Te2String(0);
867
style = Te2String(0);
870
string insert = "INSERT INTO te_visual(legend_id, geom_type, ";
871
insert += "lib_name, symb_id, ";
872
insert += "red, green, blue, transparency, width, ";
873
insert += "contour_lib_name, contour_symb_id, ";
874
insert += "contour_red, contour_green,";
875
insert += "contour_blue, contour_transp, contour_width, size_value,";
876
insert += "pt_angle, family, bold, italic, ";
877
insert += "alignment_vert, alignment_horiz, tab_size, line_space, fixed_size) ";
878
insert += " VALUES (";
879
insert += Te2String(legend->id()) + ", ";
880
insert += Te2String(rep)+ ", ";
882
TeColor cor = vis.color(); // filling color
883
TeColor contourCor = vis.contourColor();// contour color
885
insert += "'"+ vis.libName() + "', ";
886
insert += style + ", ";
887
insert += Te2String(cor.red_) + ", ";
888
insert += Te2String(cor.green_) + ", ";
889
insert += Te2String(cor.blue_) + ", ";
890
insert += Te2String(vis.transparency()) + ", ";
891
insert += width +",";
893
insert += "'"+ vis.contourLibName() + "', ";
894
insert += contourStyle + ", ";
895
insert += Te2String(contourCor.red_) + ", ";
896
insert += Te2String(contourCor.green_) + ", ";
897
insert += Te2String(contourCor.blue_) + ", ";
898
insert += Te2String(vis.contourTransparency()) + ", ";
899
insert += Te2String(vis.contourWidth()) + ", ";
901
insert += sizeValue +",";
902
insert += Te2String(vis.ptAngle()) +", ";
904
insert += "'" + vis.family() + "', ";
913
insert += Te2String(vis.alignmentVert()) + ",";
914
insert += Te2String(vis.alignmentHoriz()) + ",";
915
insert += Te2String(vis.tabSize()) + ",";
916
insert += Te2String(vis.lineSpace()) +",";
923
if (!execute(insert))
930
bool TeDatabase::createCollectionTable(const string& tableName)
932
string create = "CREATE TABLE " + tableName + " (";
933
create += " c_object_id VARCHAR(255) NOT NULL, ";
934
create += " c_legend_id INT(10), ";
935
create += " label_x DOUBLE(24,9), ";
936
create += " label_y DOUBLE(24,9), ";
937
create += " c_legend_own INT(10), ";
938
create += " c_object_status INT(10), ";
939
create += " PRIMARY KEY (c_object_id))";
940
return execute (create);
943
bool TeDatabase::createCellGeometry (const string& table)
945
string q ="CREATE TABLE " + table +"(";
946
q += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
947
q += "object_id VARCHAR(255) NOT NULL ,";
948
q += "lower_x double(24,15) NOT NULL ,";
949
q += "lower_y double(24,15) NOT NULL ,";
950
q += "upper_x double(24,15) NOT NULL ,";
951
q += "upper_y double(24,15) NOT NULL ,";
952
q += "col_number INT(10) NOT NULL ,";
953
q += "row_number INT(10) NOT NULL ,";
954
q += "PRIMARY KEY (geom_id),";
955
q += "INDEX (object_id),";
956
q += "INDEX box_idx (lower_x, lower_y,upper_x, upper_y),";
957
q += "INDEX lc (row_number, col_number))";
961
bool TeDatabase::createTextGeometry(const string& table)
963
string q ="CREATE TABLE " + table +"(";
964
q += " geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
965
q += " object_id VARCHAR(255) NOT NULL ,";
966
q += " x DOUBLE(24,9) DEFAULT '0.0',";
967
q += " y DOUBLE(24,9) DEFAULT '0.0',";
968
q += " text_value VARCHAR(255),";
969
q += " angle DOUBLE(24,9) DEFAULT '0.0',";
970
q += " height DOUBLE(24,9) DEFAULT '0.0',";
971
q += " alignment_vert DOUBLE(24,9),";
972
q += " alignment_horiz DOUBLE(24,9),";
973
q += "PRIMARY KEY (geom_id),";
974
q += "INDEX (object_id),";
975
q += "INDEX pos_idx(x,y))";
979
bool TeDatabase::createNodeGeometry(const string& table)
981
string q ="CREATE TABLE " + table +"(";
982
q += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
983
q += "object_id VARCHAR(255) NOT NULL ,";
984
q += "x DOUBLE(24,15) DEFAULT '0.0',";
985
q += "y DOUBLE(24,15) DEFAULT '0.0',";
986
q += "PRIMARY KEY (geom_id),";
987
q += "INDEX (object_id),";
988
q += "INDEX pos_idx(x,y))";
992
bool TeDatabase::createPointGeometry(const string& table)
994
string q ="CREATE TABLE " + table +"(";
995
q += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
996
q += "object_id VARCHAR(255) NOT NULL ,";
997
q += "x DOUBLE(24,15) DEFAULT '0.0',";
998
q += "y DOUBLE(24,15) DEFAULT '0.0',";
999
q += "PRIMARY KEY (geom_id),";
1000
q += "INDEX (object_id),";
1001
q += "INDEX pos_idx(x,y))";
1005
bool TeDatabase::createArcGeometry(const string& table)
1007
string q ="CREATE TABLE " + table +"(";
1008
q += "geom_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
1009
q += "object_id VARCHAR(255) NOT NULL ,";
1010
q += "from_node INT(10),";
1011
q += "to_node INT(10),";
1012
q += "PRIMARY KEY (geom_id),";
1013
q += "INDEX (object_id),";
1014
q += "INDEX (from_node),";
1015
q += "INDEX (to_node))";
1021
TeDatabase::insertTable (TeTable &table)
1023
string tableName = table.name();
1024
TeAttributeList att = table.attributeList();
1025
TeAttributeList::iterator it = att.begin();
1030
for ( i = 0; i < table.size(); i++ )
1034
string q = "INSERT INTO "+tableName+" values(";
1038
while ( it != att.end() )
1040
if(((*it).rep_.type_==TeDATETIME) && (!row[jj].empty()))
1042
const string temp_dt = string(row[jj].c_str());
1043
TeTime t(temp_dt, (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_, (*it).timeSeparator_, (*it).indicatorPM_);
1044
dt=t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-");
1047
switch ((*it).rep_.type_)
1050
q += "'"+this->escapeSequence(row[jj])+"'";
1053
q += "'"+row[jj]+"'";
1056
q += "'"+row[jj]+"'";
1062
q += "'"+this->escapeSequence(row[jj])+"'";
1072
if (!this->execute(q))
1080
TeDatabase::alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName)
1082
if(!tableExist(tableName))
1087
if(oldColName.empty())
1089
tab = " ALTER TABLE " + tableName + " MODIFY ";
1090
tab += rep.name_ +" ";
1094
tab = " ALTER TABLE " + tableName + " CHANGE ";
1095
tab += oldColName +" "+ rep.name_ +" ";
1101
tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
1125
tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
1133
if(errorMessage_.empty())
1134
errorMessage_ = "Error alter table " + tableName + " !";
1139
TeDatabasePortal* portal = getPortal();
1140
string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + tableName + "'";
1141
if(portal->query(sql) && portal->fetchRow())
1142
tableId = portal->getData(0);
1146
if(tableId.empty() == false)
1148
if(oldColName.empty() == false) // column name changed
1151
sql = "UPDATE te_tables_relation SET related_attr = '" + rep.name_ + "'";
1152
sql += " WHERE related_table_id = " + tableId;
1153
sql += " AND related_attr = '" + oldColName + "'";
1154
if(execute(sql) == false)
1157
sql = "UPDATE te_tables_relation SET external_attr = '" + rep.name_ + "'";
1158
sql += " WHERE external_table_name = '" + tableName + "'";
1159
sql += " AND external_attr = '" + oldColName + "'";
1160
if(execute(sql) == false)
1164
sql = "UPDATE te_grouping SET grouping_attr = '" + tableName + "." + rep.name_ + "'";
1165
sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
1166
if(execute(sql) == false)
1169
else // column type changed
1172
sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
1173
sql += " AND related_attr = '" + rep.name_ + "')";
1174
sql += " OR (external_table_name = '" + tableName + "'";
1175
sql += " AND external_attr = '" + rep.name_ + "')";
1176
if(execute(sql) == false)
1180
TeDatabasePortal* portal = getPortal();
1181
sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
1182
if(portal->query(sql) && portal->fetchRow())
1184
string themeId = portal->getData(0);
1186
sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
1187
if(execute(sql) == false)
1195
sql = "DELETE FROM te_grouping";
1196
sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
1197
if(execute(sql) == false)
1205
TeDatabase::getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType)
1207
TeDatabasePortal* portal = this->getPortal();
1210
this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
1215
string get = " SELECT * FROM te_layer_table";
1216
if (attType != TeAllAttrTypes)
1217
get += " WHERE attr_table_type = " + Te2String(attType);
1218
if (!portal->query(get))
1224
while (portal->fetchRow())
1226
string tableName = portal->getData("attr_table");
1227
int tableId = portal->getInt("table_id");
1228
string indexName = portal->getData("attr_link");
1230
TeAttributeList attrList;
1231
getAttributeList(tableName, attrList);
1233
TeTable attTable(tableName,attrList,
1234
portal->getData("unique_id"), indexName,
1235
TeAttrTableType(portal->getInt("attr_table_type")));
1237
attTable.setId(tableId);
1238
attTable.attInitialTime(portal->getData("attr_initial_time"));
1239
attTable.attFinalTime(portal->getData("attr_final_time"));
1240
attTable.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
1241
atts.push_back(attTable);
1244
return (atts.size() > 0);
1248
TeDatabase::updateTable (TeTable &table)
1250
string tableName = table.name();
1251
TeAttributeList att = table.attributeList();
1252
TeAttributeList::iterator it = att.begin();
1256
string uniqueName = table.uniqueName();
1258
bool isUniqueValString = false;
1260
for ( i = 0; i < table.size(); i++ )
1264
string q = "UPDATE "+tableName+" SET ";
1265
unsigned int jj = 0;
1266
while ( it != att.end() )
1268
string val = row[jj];
1272
if ((*it).rep_.name_ != uniqueName)
1274
q += (*it).rep_.name_ + "=";
1275
switch ((*it).rep_.type_)
1278
q += "'"+escapeSequence(row[jj])+"'";
1287
q += "'"+escapeSequence(row[jj])+"'";
1290
if (jj < att.size()-1)
1295
if((*it).rep_.type_ == TeSTRING)
1296
isUniqueValString = true;
1297
uniqueVal = row[jj];
1304
if(isUniqueValString)
1305
q += " WHERE " + uniqueName + " = '" + uniqueVal +"'";
1307
q += " WHERE " + uniqueName + " = " + uniqueVal;
1309
if (!this->execute(q))
1317
TeDatabase::loadTable(const string& tableName, TeTable &table)
1319
TeDatabasePortal* portal = this->getPortal();
1323
string q ="SELECT * FROM " + tableName;
1324
if (!portal->query(q))
1329
table.name(tableName);
1330
table.setAttributeList(portal->AttributeList());
1332
while (portal->fetchRow())
1335
for (int j = 0; j < portal->numFields(); j++)
1336
row.push_back (portal->getData (j));
1344
TeDatabase::selectTable (const string& tableName, const string& criteria, TeTable &table)
1346
TeDatabasePortal* portal = this->getPortal();
1350
string q ="SELECT * FROM " + tableName;
1351
if (!criteria.empty())
1352
q += " WHERE " + criteria;
1354
if (!portal->query(q))
1359
table.name(tableName);
1360
table.setAttributeList(portal->AttributeList());
1362
while (portal->fetchRow())
1365
for(int i = 0; i < portal->numFields(); i++)
1366
row.push_back(portal->getData(i));
1374
TeDatabase::updateView (TeView *view)
1376
TeProjection* proj = view->projection();
1379
if (proj->id() <= 0)
1380
this->insertProjection(view->projection());
1382
this->updateProjection(view->projection());
1386
errorMessage_ = "Nļæ½o ļæ½ possļæ½vel atualizar vista sem projeļæ½ļæ½o!";
1390
string sql = "UPDATE te_view SET projection_id=" + Te2String(proj->id());
1391
sql+= ", name='" + view->name() + "'";
1392
sql+= ", user_name='" + view->user() + "'";
1393
sql+= ", visibility= " + Te2String((int)view->isVisible());
1394
sql +=" WHERE view_id = " + Te2String(view->id());
1396
if (!this->execute (sql))
1399
TeViewTree* tree = view->root();
1401
return updateViewTree(tree);
1407
TeDatabase::loadViewSet (const string& user)
1409
TeViewMap::iterator it = viewMap_.begin();
1410
while (it != viewMap_.end())
1417
TeDatabasePortal* portal = this->getPortal();
1423
sql = "SELECT * FROM te_view WHERE user_name = '" + user + "'";
1425
sql = "SELECT * FROM te_view WHERE user_name = '" + this->user() + "'";
1427
if (!portal->query(sql))
1432
while (portal->fetchRow())
1434
TeView *view = new TeView();
1435
view->id (portal->getInt("view_id"));
1443
TeDatabase::loadViewTree(TeView* view, int id)
1448
TeDatabasePortal* portal = this->getPortal();
1453
TeViewTree *node = 0;
1457
q = "SELECT * FROM te_theme";
1458
q += " WHERE view_id = " + Te2String (view->id());
1459
q += " AND theme_id = " + Te2String(id);
1461
if (!portal->query(q) || !portal->fetchRow())
1467
TeViewNodeType type = (TeViewNodeType)portal->getInt("node_type");
1470
portal->freeResult();
1475
node = portal->getViewTree();
1476
portal->freeResult();
1479
q ="SELECT * FROM te_theme";
1480
q += " WHERE view_id = " + Te2String (view->id());
1481
q += " AND parent_id = " + Te2String(id);
1482
q += " ORDER BY priority ASC";
1484
if (!portal->query(q))
1490
while (portal->fetchRow())
1492
TeViewNodeType childType = (TeViewNodeType)portal->getInt("node_type");
1493
TeViewNode *childNode;
1494
if (childType == TeTHEME)
1496
childNode = new TeTheme();
1497
childNode->id(portal->getInt(0));
1498
this->loadTheme((TeTheme*)childNode);
1502
childNode = loadViewTree(view, portal->getInt("theme_id"));
1507
view->add(childNode);
1511
// view->addTheme(childNode);
1512
node->add(childNode);
1520
TeDatabase::loadView (TeView* view)
1524
q = "SELECT * FROM te_view WHERE view_id=" + Te2String(view->id());
1525
else if (!view->name().empty())
1527
q = "SELECT * FROM te_view WHERE name='" + view->name() + "'";
1529
if(!view->user().empty())
1530
q += " AND user_name='" + view->user() + "'";
1535
TeDatabasePortal* portal = getPortal();
1538
this->errorMessage_ = "Erro ao tentar abrir um portal";
1542
if (!portal->query(q))
1545
this->errorMessage_ = "Erro ao submeter query: \"" + q + "\"";
1549
if (!portal->fetchRow())
1555
int projId = portal->getInt("projection_id");
1556
TeProjection* proj = loadProjection(projId);
1558
view->projection(proj);
1559
view->name(portal->getData("name"));
1560
view->user(portal->getData("user_name"));
1561
view->isVisible (portal->getBool("visibility"));
1562
view->id(portal->getInt("view_id"));
1563
portal->freeResult();
1565
loadViewTree(view, 0);
1569
vector<TeViewNode*> &themes = view->themes();
1570
for (unsigned int i = 0; i < themes.size() ; i++)
1572
TeTheme *theme = (TeTheme*)themes[i];
1573
int id = theme->layerId();
1574
TeLayerMap::iterator it = layerMap_.find(id);
1575
if (it == layerMap_.end())
1580
theme->layer(layerMap_[id]);
1581
if (!loadLegend (theme)) // retrieve associated legend
1584
viewMap_[view->id()] = view;
1592
TeViewMap::iterator viewIt;
1593
for (viewIt = viewMap_.begin(); viewIt != viewMap_.end(); ++viewIt)
1594
delete viewIt->second;
1596
TeLayerMap::iterator layerIt;
1597
for (layerIt = layerMap_.begin(); layerIt != layerMap_.end(); ++layerIt)
1598
delete layerIt->second;
1607
TeDatabase::deleteView (int viewId)
1609
TeDatabasePortal* portal = this->getPortal();
1611
// view projection should be deleted manually
1612
string sql = "SELECT projection_id FROM te_view WHERE view_id=" + Te2String(viewId);
1613
portal->freeResult();
1614
if (!portal->query(sql))
1619
if (!portal->fetchRow())
1624
string projId = portal->getData("projection_id");
1625
portal->freeResult();
1627
// delete themes belonging to this view
1628
sql = "SELECT theme_id FROM te_theme WHERE view_id=" + Te2String(viewId);
1629
if (!portal->query(sql))
1634
while (portal->fetchRow())
1636
int id = atoi(portal->getData(0));
1637
if(deleteTheme(id) == false)
1644
sql = "DELETE FROM te_view WHERE view_id = " + Te2String(viewId);
1645
if (!this->execute (sql))
1651
sql = "DELETE FROM te_projection WHERE projection_id = " + projId;
1652
if (!this->execute (sql))
1658
// Delete the view and its themes
1659
TeView* view = viewMap_[viewId];
1660
viewMap_.erase(viewId);
1667
TeDatabase::updateViewTree (TeViewTree *tree)
1672
sql = "UPDATE te_theme SET ";
1673
sql += "name='" + tree->name()+"'";
1674
sql += ", parent_id=" + Te2String (tree->parentId());
1675
sql += ", node_type=" + Te2String (tree->type());
1676
sql += " ,priority=" + Te2String (tree->priority());
1677
sql += " WHERE theme_id = " + Te2String(tree->id());
1679
if(!this->execute (sql)) return false;
1682
for (unsigned int th=0; th<tree->size(); th++)
1684
TeViewNode* node = tree->retrieve(th);
1685
if (node->type() == TeTHEME)
1687
TeTheme *theme = (TeTheme*)node;
1688
if(!updateTheme(theme)) return false;
1692
TeViewTree* tree = (TeViewTree*)node;
1693
if(!updateViewTree(tree)) return false;
1700
TeDatabase::viewExist(string viewName)
1702
TeDatabasePortal* portal = this->getPortal();
1706
viewName = TeConvertToUpperCase(viewName);
1708
string sql = "SELECT name FROM te_view";
1709
if (!portal->query(sql))
1714
while (portal->fetchRow())
1716
string name = portal->getData(0);
1717
name = TeConvertToUpperCase(name);
1718
if (viewName == name)
1730
TeDatabase::updateTheme (TeTheme *theme)
1734
if (theme->id() <= 0 ) // theme doesnļæ½t exist in the database yet
1736
return this->insertTheme(theme);
1739
// update theme metadata
1740
sql = "UPDATE te_theme SET ";
1741
sql += " layer_id=" + Te2String (theme->layerId());
1742
sql += ", view_id=" + Te2String (theme->view());
1743
sql += ", name='" + escapeSequence(theme->name())+"'";
1744
sql += ", parent_id=" + Te2String (theme->parentId());
1745
sql += ", priority=" + Te2String (theme->priority());
1746
sql += ", node_type=" + Te2String (theme->type());
1747
sql += ", min_scale=" + Te2String (theme->minScale(),5);
1748
sql += ", max_scale=" + Te2String (theme->maxScale(),5);
1749
sql += ", generate_attribute_where='" + escapeSequence(theme->attributeRest())+"'";
1750
sql += ", generate_spatial_where='" + escapeSequence(theme->spatialRest())+"'";
1751
sql += ", generate_temporal_where='" + escapeSequence(theme->temporalRest())+"'";
1752
sql += ", collection_table='" + theme->collectionTable() + "'";
1753
sql += ", visible_rep= " + Te2String(theme->visibleRep ());
1754
sql += ", enable_visibility= " + Te2String(theme->visibility());
1755
sql += " WHERE theme_id=" + Te2String (theme->id());
1757
if (!this->execute (sql))
1761
sql = "DELETE FROM te_grouping WHERE theme_id= "+ Te2String(theme->id());
1762
this->execute (sql);
1764
if(theme->grouping())
1766
if(!insertGrouping(theme->id(), theme->grouping()))
1770
// update each of its legends
1773
if(theme->legend().size() == 0)
1775
if(!deleteLegend(theme->id()))
1780
for (unsigned int i = 0; i < theme->legend().size() ; i++)
1782
status = updateLegend(&(theme->legend()[i]));
1788
status = updateLegend(&(theme->withoutDataConnectionLegend()));
1792
status = updateLegend(&(theme->outOfCollectionLegend()));
1796
status = updateLegend(&(theme->defaultLegend()));
1800
status = updateLegend(&(theme->pointingLegend()));
1804
status = updateLegend(&(theme->queryLegend()));
1808
status = updateLegend(&(theme->queryAndPointingLegend()));
1813
return updateThemeTable (theme);
1817
TeDatabase::loadTheme (TeTheme* theme)
1822
string get = "SELECT te_theme.* FROM te_view INNER JOIN te_theme ON te_view.view_id = te_theme.view_id WHERE ";
1823
if (theme->id() > 0)
1824
get += " te_theme.theme_id = "+ Te2String(theme->id());
1825
else if (!theme->name().empty())
1826
get += " te_theme.name = '"+ theme->name() + "'";
1829
this->errorMessage_ = "Theme procurado nļæ½o possui nem id nem nome";
1832
get += " AND te_view.user_name = \'" + this->user() +"\'";
1834
TeDatabasePortal* portal = this->getPortal();
1837
this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
1841
if (!portal->query (get))
1846
if (!portal->fetchRow())
1853
theme->id(atoi (portal->getData(0)));
1854
theme->layerId (atoi(portal->getData(1)));
1855
theme->view (atoi(portal->getData (2)));
1856
theme->name(string (portal->getData("name")));
1857
theme->parentId( atoi(portal->getData ("parent_id")));
1858
theme->type (TeViewNodeType(atoi(portal->getData ("node_type"))));
1859
theme->priority(portal->getInt("priority"));
1860
theme->minScale (portal->getDouble ("min_scale"));
1861
theme->maxScale (portal->getDouble ("max_scale"));
1862
theme->attributeRest(string(portal->getData ("generate_attribute_where")));
1863
theme->spatialRest(string(portal->getData ("generate_spatial_where")));
1864
theme->temporalRest(string(portal->getData ("generate_temporal_where")));
1865
theme->collectionTable(string(portal->getData ("collection_table")));
1866
theme->collectionAuxTable(theme->collectionTable() + "_aux");
1867
theme->visibleRep(atoi(portal->getData ("visible_rep")));
1868
theme->visibility(atoi(portal->getData ("enable_visibility")));
1871
int id = theme->layerId();
1872
TeLayerMap::iterator it = layerMap_.find(id);
1873
if (it == layerMap_.end())
1878
theme->layer(layerMap_[id]);
1879
portal->freeResult();
1881
// load them grouping
1882
get = "SELECT * FROM te_grouping WHERE theme_id = " + Te2String(theme->id());
1883
if (portal->query (get) && portal->fetchRow())
1885
TeAttributeRep atRep;
1886
string attname = portal->getData ("grouping_attr");
1887
string norname = portal->getData ("grouping_norm_attr");
1888
int f = attname.find("(");
1891
string alias = attname;
1892
attname.erase(f, attname.size()-f);
1893
alias.erase(0, f+1);
1894
alias.erase(alias.size()-1, 1);
1895
map<string, string>& m = mapThemeAlias_[theme->id()];
1898
f = norname.find("(");
1901
string alias = norname;
1902
norname.erase(f, norname.size()-f);
1903
alias.erase(0, f+1);
1904
alias.erase(alias.size()-1, 1);
1905
map<string, string>& m = mapThemeAlias_[theme->id()];
1915
atRep.name_ = attname;
1916
atRep.type_ = TeAttrDataType(atoi(portal->getData ("grouping_attr_type")));
1918
TeGrouping* g = new TeGrouping ( atRep, norname,
1919
TeGroupingMode(atoi(portal->getData ("grouping_mode"))),
1920
atoi(portal->getData ("grouping_number")),
1921
atoi(portal->getData ("grouping_precision")),
1922
portal->getDouble("grouping_std_dev"),
1923
portal->getData("grouping_function") );
1927
portal->freeResult();
1929
// load theme tables
1930
if(!loadThemeTable(theme))
1936
get = "SELECT * FROM te_visual_raster WHERE theme_id = " + Te2String(theme->id());
1937
if (portal->query (get) && portal->fetchRow())
1939
TeRasterTransform* vis = new TeRasterTransform();
1940
vis->setSrcBand(portal->getInt(1));
1941
vis->setDestBand(portal->getInt(2));
1942
vis->setTransfFunction(static_cast<TeRasterTransform::TeRasterTransfFunctions>(portal->getInt(3)));
1943
if (vis->getTransfFunction() == TeRasterTransform::TeExtractRGB ||
1944
vis->getTransfFunction() == TeRasterTransform::TeExtractBands)
1948
vis->setBChannelMapping(portal->getInt(1),static_cast<TeRasterTransform::TeRGBChannels>(portal->getInt(2)));
1949
}while (portal->fetchRow());
1951
theme->rasterVisual(vis);
1954
// load theme legends
1957
themeMap_[theme->id()] = theme;
1965
TeDatabase::loadThemeTable (TeTheme* theme)
1967
TeDatabasePortal* portal = this->getPortal();
1970
this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
1975
string sel = "SELECT te_theme_table.*, te_tables_relation.*, te_layer_table.*";
1976
sel += " FROM (te_theme_table LEFT JOIN te_tables_relation";
1977
sel += " ON te_theme_table.relation_id = te_tables_relation.relation_id)";
1978
sel += " LEFT JOIN te_layer_table ON te_theme_table.table_id = te_layer_table.table_id";
1979
sel += " WHERE te_theme_table.theme_id = " + Te2String(theme->id());
1980
sel += " ORDER BY table_order";
1982
if (!portal->query (sel))
1988
while(portal->fetchRow ())
1990
string tableName = portal->getData("attr_table");
1991
TeAttributeList attrList;
1992
getAttributeList(tableName, attrList);
1993
string uniqueId = portal->getData("unique_id");
1994
string linkName = portal->getData("attr_link");
1996
TeTable table(tableName, attrList, uniqueId, linkName);
1997
table.setId(portal->getInt("te_theme_table.table_id"));
1998
table.setOrder(portal->getInt("table_order"));
1999
table.attInitialTime(portal->getData("attr_initial_time"));
2000
table.attFinalTime(portal->getData("attr_final_time"));
2001
table.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
2003
int tableType = portal->getInt("attr_table_type");
2004
if (tableType == TeAttrExternal)
2006
int relatedTableId = portal->getInt("related_table_id");
2007
table.relatedTableName(getTableName(relatedTableId));
2008
int relationId = portal->getInt("te_theme_table.relation_id");
2009
relationMSet_.insert(relationId);
2011
string relatedAttr = portal->getData("related_attr");
2012
table.setTableType(TeAttrExternal, relatedTableId, relatedAttr);
2014
table.setLinkName(portal->getData("external_attr"));
2017
table.setTableType((TeAttrTableType)tableType);
2019
theme->addThemeTable(table);
2028
TeDatabase::insertThemeTable(TeTheme *theme, TeTable& inputTable)
2030
int themeId = theme->id();
2036
// Get the order of the last theme table
2037
qString = "SELECT MAX(table_order) FROM te_theme_table";
2038
qString += " WHERE theme_id = " + Te2String(themeId);
2040
TeDatabasePortal* portal = getPortal();
2041
if (portal->query(qString) == false || portal->fetchRow() == false)
2044
string data = portal->getData(0);
2049
tableOrder = atoi(portal->getData(0));
2052
inputTable.setOrder(tableOrder);
2055
if (inputTable.tableType() == TeAttrExternal)
2057
status = insertRelationInfo(inputTable.relatedTableId(),inputTable.relatedAttribute(),
2058
inputTable.name(),inputTable.linkName(),relationId);
2059
if (status == false)
2061
relationMSet_.insert(relationId);
2063
status = insertThemeTable(themeId, inputTable.id(), relationId, tableOrder);
2067
// Insert the table in the te_theme_table
2068
status = insertThemeTable(themeId, inputTable.id(), 0, tableOrder);
2074
TeDatabase::removeThemeTable(TeTheme *theme, int tableOrder)
2079
int relationId = -1;
2082
TeAttrTableVector attrTableVector;
2083
theme->getAttTables(attrTableVector);
2085
// If the table is external, find the relation id
2086
qString = "SELECT relation_id FROM te_theme_table";
2087
qString += " WHERE theme_id = " + Te2String(theme->id());
2088
qString += " AND relation_id IS NOT NULL";
2089
qString += " AND table_order = " + Te2String(tableOrder);
2091
TeDatabasePortal* portal = getPortal();
2092
if (portal->query(qString) && portal->fetchRow())
2093
relationId = portal->getInt("relation_id");
2101
// Remove the relation from the te_tables_relation
2102
// table if only this theme is using it
2105
if (relationMSet_.count(relationId) == 1)
2107
qString = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(relationId);
2108
if (execute(qString) == false)
2110
relationMSet_.erase(relationId);
2113
relationMSet_.erase(relationMSet_.find(relationId));
2116
// Remove the table from the te_theme_table
2117
qString = "DELETE FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
2118
qString += " AND table_order = " + Te2String(tableOrder);
2120
if (execute(qString) == false)
2128
TeDatabase::updateThemeTable(TeTheme *theme)
2130
//Initially remove from te_theme_table all the records of this theme
2131
string q = "SELECT * FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
2132
TeDatabasePortal *portal = getPortal();
2134
if (portal->query(q) == false)
2140
while (portal->fetchRow())
2143
int themeTableId = portal->getInt("theme_table_id");
2145
string data = portal->getData("relation_id");
2149
relationId = atoi(data.c_str());
2151
// Remove the relation from the te_tables_relation
2152
// table if only this theme is using it
2155
if (relationMSet_.count(relationId) == 1)
2157
q = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(relationId);
2158
if (execute(q) == false)
2163
relationMSet_.erase(relationId);
2166
relationMSet_.erase(relationMSet_.find(relationId));
2169
// Remove the table from the te_theme_table
2170
q = "DELETE FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
2171
q += " AND theme_table_id = " + Te2String(themeTableId);
2172
if (execute(q) == false)
2180
// Update te_theme_table and te_tables_relation(if there are any external tables)
2181
// with the information provided from the new vector of theme tables
2182
TeAttrTableVector tablesVector;
2183
theme->getAttTables(tablesVector);
2184
for (unsigned i = 0; i < tablesVector.size(); ++i)
2185
insertThemeTable(theme, tablesVector[i]);
2192
TeDatabase::insertGrouping (int themeId, TeGrouping* grouping)
2194
if((themeId < 1) || (!grouping) )
2197
string ins = " INSERT INTO te_grouping (theme_id, grouping_number, ";
2198
ins += " grouping_attr, grouping_attr_type, grouping_mode, ";
2199
ins += " grouping_norm_attr, grouping_std_dev, grouping_precision, grouping_function )";
2200
ins += " VALUES ( ";
2201
ins += Te2String(themeId);
2202
ins += ", "+ Te2String(grouping->groupNumSlices_);
2204
string attname = grouping->groupAttribute_.name_;
2205
if(attname.empty() || (attname=="NONE") )
2208
string norname = grouping->groupNormAttribute_;
2209
if(norname.empty() || (norname=="NONE"))
2212
map<int, map<string, string> >::iterator it = mapThemeAlias_.find(themeId);
2213
if(it != mapThemeAlias_.end())
2215
map<string, string>::iterator tit = it->second.find(attname);
2216
if(tit != it->second.end())
2218
string alias = tit->second;
2219
attname += "(" + alias + ")";
2221
if(norname.empty() == false)
2223
map<string, string>::iterator tit = it->second.find(norname);
2224
if(tit != it->second.end())
2226
string nalias = tit->second;
2227
norname += "(" + nalias + ")";
2232
ins += ", '"+ attname +"'";
2233
ins += ", "+ Te2String(grouping->groupAttribute_.type_);
2234
ins += ", "+ Te2String(grouping->groupMode_);
2235
ins += ", '"+ norname +"'";
2236
ins += ", "+ Te2String(grouping->groupStdDev_);
2237
ins += ", "+ Te2String(grouping->groupPrecision_);
2238
ins += ", '"+ grouping->groupFunction_ +"'";
2241
return (execute(ins));
2245
TeDatabase::updateGrouping (int themeId, TeGrouping* grouping)
2247
if((themeId < 1) || (!grouping))
2250
string up = " UPDATE te_grouping SET ";
2251
up += " grouping_number = "+ Te2String(grouping->groupNumSlices_);
2253
string attname = grouping->groupAttribute_.name_;
2254
if(attname.empty() || (attname=="NONE"))
2257
string norname = grouping->groupNormAttribute_;
2258
if(norname.empty()|| (norname=="NONE"))
2261
map<int, map<string, string> >::iterator it = mapThemeAlias_.find(themeId);
2262
if(it != mapThemeAlias_.end())
2264
map<string, string>::iterator tit = it->second.find(attname);
2265
if(tit != it->second.end())
2267
string alias = tit->second;
2268
attname += "(" + alias + ")";
2270
if(norname.empty() == false)
2272
map<string, string>::iterator tit = it->second.find(norname);
2273
if(tit != it->second.end())
2275
string nalias = tit->second;
2276
norname += "(" + nalias + ")";
2281
up += ", grouping_attr = '"+ attname +"'";
2282
up += ", grouping_attr_type = "+ Te2String(grouping->groupAttribute_.type_);
2283
up += ", grouping_mode = "+ Te2String(grouping->groupMode_);
2284
up += ", grouping_norm_attr = '"+ norname +"'";
2285
up += ", grouping_std_dev = "+ Te2String(grouping->groupStdDev_);
2286
up += ", grouping_precision = "+ Te2String(grouping->groupPrecision_);
2287
up += ", grouping_function = '"+ grouping->groupFunction_ +"'";
2288
up += " WHERE theme_id = "+ Te2String(themeId);
2290
return (execute(up));
2294
TeDatabase::generateLabelPositions(TeTheme *theme)
2296
string piebar, geomTable, upd;
2297
string collTable = theme->collectionTable();
2299
if((collTable.empty()) || (!tableExist(collTable)))
2302
if (theme->layer()->hasGeometry(TeCELLS) )
2304
geomTable = theme->layer()->tableName(TeCELLS);
2306
piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
2307
piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
2308
piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
2310
upd = " UPDATE (" + piebar + ") SET";
2311
upd += " label_x = lower_x + (upper_x-lower_x)/2,";
2312
upd += " label_y = lower_y + (upper_y-lower_y)/2";
2318
if( theme->layer()->hasGeometry(TePOLYGONS))
2320
geomTable = theme->layer()->tableName(TePOLYGONS);
2322
piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
2323
piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
2324
piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
2325
piebar += " WHERE label_x is null OR label_y is null";
2326
piebar += " ORDER BY c_object_id ASC, ext_max ASC";
2328
upd = " UPDATE (" + piebar + ") SET";
2329
upd += " label_x = lower_x + (upper_x-lower_x)/2,";
2330
upd += " label_y = lower_y + (upper_y-lower_y)/2";
2336
if (theme->layer()->hasGeometry(TePOINTS))
2338
geomTable = theme->layer()->tableName(TePOINTS);
2340
piebar = "SELECT label_x, label_y, x, y";
2341
piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
2342
piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
2343
piebar += " WHERE label_x is null OR label_y is null";
2344
upd = " UPDATE (" + piebar + ") SET";
2345
upd += " label_x = x,";
2346
upd += " label_y = y";
2352
if(theme->layer()->hasGeometry(TeLINES))
2354
geomTable = theme->layer()->tableName(TeLINES);
2356
piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
2357
piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
2358
piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
2359
piebar += " WHERE label_x is null OR label_y is null";
2360
piebar += " ORDER BY c_object_id ASC, ext_max ASC";
2362
upd = " UPDATE (" + piebar + ") SET";
2363
upd += " label_x = lower_x + (upper_x-lower_x)/2,";
2364
upd += " label_y = lower_y + (upper_y-lower_y)/2";
2374
TeDatabase::themeExist(string themeName)
2376
TeDatabasePortal* portal = this->getPortal();
2380
themeName = TeConvertToUpperCase(themeName);
2382
string sql = "SELECT name FROM te_theme";
2383
if (!portal->query(sql))
2388
while (portal->fetchRow())
2390
string name = portal->getData(0);
2391
name = TeConvertToUpperCase(name);
2392
if (themeName == name)
2403
TeDatabase::deleteTheme(int themeId)
2407
// delete the collection table associated to this theme
2408
TeDatabasePortal* portal = this->getPortal();
2412
sql = "SELECT collection_table FROM te_theme WHERE theme_id = " + Te2String(themeId);
2413
if(!portal->query(sql))
2418
if (!portal->fetchRow())
2423
string colTab = portal->getData("collection_table");
2424
//delete collection table
2425
if (this->tableExist(colTab))
2427
sql = "DROP TABLE " + colTab;
2428
if (!this->execute(sql) )
2434
//delete auxiliar collection table
2435
if (this->tableExist(colTab +"_aux"))
2437
sql = "DROP TABLE " +colTab +"_aux";
2438
if (!this->execute(sql) )
2445
portal->freeResult();
2447
//delete the visual associated to this theme
2448
if (existRelation("te_visual","fk_visual_legend_id") != TeRICascadeDeletion)
2450
sql = "SELECT legend_id FROM te_legend WHERE theme_id = " + Te2String(themeId);
2451
if(!portal->query(sql))
2458
while (portal->fetchRow())
2463
wherec += portal->getData(0);
2465
portal->freeResult();
2466
sql = "DELETE FROM te_visual WHERE legend_id IN (" + wherec + ")";
2467
if (!this->execute(sql))
2474
//delete all visuals of raster associated to this theme
2475
if (existRelation("te_visual_raster","fk_visrast_theme_id") != TeRICascadeDeletion)
2477
sql = "DELETE FROM te_visual_raster WHERE theme_id =" + Te2String(themeId);
2478
if (!this->execute (sql))
2485
//delete all legends associated to this theme
2486
if (existRelation("te_legend","fk_legend_theme_id") != TeRICascadeDeletion)
2488
sql = "DELETE FROM te_legend WHERE theme_id =" + Te2String(themeId);
2489
if (!this->execute (sql))
2496
//select the view of this theme
2497
sql = "SELECT view_id FROM te_theme WHERE theme_id = " + Te2String(themeId);
2498
portal->freeResult();
2499
if(!portal->query(sql))
2504
if (!portal->fetchRow())
2510
int viewId = portal->getInt("view_id");
2511
TeView* view = viewMap_[viewId];
2512
TeTheme* tema = (TeTheme*)view->remove(themeId);
2520
TeLegendEntryVector& legendVector = tema->legend();
2521
for (i = 0; i < legendVector.size(); ++i)
2522
legendMap_.erase(legendVector[i].id());
2523
themeMap_.erase(themeId);
2528
//delete the tables associated to this theme
2529
if (existRelation("te_theme_table","fk_thmtable_theme_id") != TeRICascadeDeletion)
2531
sql = "DELETE FROM te_theme_table WHERE theme_id =" + Te2String(themeId);
2532
if (!this->execute (sql))
2536
//delete the grouping
2537
if (existRelation("te_grouping","fk_group_theme_id") != TeRICascadeDeletion)
2539
sql = "DELETE FROM te_grouping WHERE theme_id =" + Te2String(themeId);
2540
if (!this->execute (sql))
2544
// delete raster visual
2545
if (existRelation("te_visual_raster","fk_visrast_theme_id") == TeNoRelation )
2547
sql = "DELETE FROM te_visual_raster WHERE theme_id =" + Te2String(themeId);
2548
if (!this->execute (sql))
2553
sql = "DELETE FROM te_theme WHERE theme_id = " + Te2String(themeId);
2554
if (!this->execute (sql))
2561
TeDatabase::deleteThemeGroup(int themeId)
2565
sql = "DELETE FROM te_theme WHERE theme_id = " + Te2String(themeId);
2566
if (!this->execute (sql))
2572
TeDatabase::deleteLegend(int themeId)
2574
// If there is a collection table update legend of the objects in it
2575
TeDatabasePortal* portal = this->getPortal();
2578
string sel = "SELECT collection_table FROM te_theme WHERE theme_id = " + Te2String(themeId);
2580
if (portal->query(sel) && portal->fetchRow())
2581
TC = portal->getData(0);
2584
if (!TC.empty() && this->tableExist(TC))
2586
string up = "UPDATE " + TC + " SET c_legend_id = 0";
2591
// Delete visual of the legends
2592
string del = "DELETE FROM te_visual WHERE legend_id IN ";
2593
del += "(SELECT legend_id FROM te_legend WHERE theme_id = " + Te2String(themeId);
2594
del += " AND group_id > -1)";
2598
del = "DELETE FROM te_legend WHERE theme_id = " + Te2String(themeId);
2599
del += " AND group_id > -1";
2603
// Delete from memory the legends of the theme
2605
TeTheme *theme = themeMap_[themeId];
2606
TeLegendEntryVector& legendVector = theme->legend();
2607
for (i = 0; i < legendVector.size(); ++i)
2608
legendMap_.erase(legendVector[i].id());
2609
legendVector.clear();
2612
del = "DELETE FROM te_grouping WHERE theme_id =" + Te2String(themeId);
2620
TeDatabase::updateLayer(TeLayer *layer)
2626
sql = "UPDATE te_layer SET ";
2627
sql += "name = '" + layer->name() + "' ";
2628
sql += ", lower_x = " + Te2String(layer->box().x1(),15) + " ";
2629
sql += ", lower_y = " + Te2String(layer->box().y1(),15) + " ";
2630
sql += ", upper_x = " + Te2String(layer->box().x2(),15) + " ";
2631
sql += ", upper_y = " + Te2String(layer->box().y2(),15) + " ";
2632
sql += " WHERE layer_id = " + Te2String(layer->id());
2634
if (layer->projection())
2635
updateProjection(layer->projection());
2636
return (this->execute (sql));
2640
TeDatabase::loadLayerSet()
2642
TeDatabasePortal* portal = this->getPortal();
2646
string get = "SELECT * FROM te_layer";
2647
if (!portal->query(get))
2655
while (portal->fetchRow())
2658
lid = portal->getInt("layer_id");
2660
TeLayerMap::iterator it = layerMap_.find(lid);
2661
// if layer is not in the cache yet load it in a new pointer
2662
if (it == layerMap_.end())
2664
layer = new TeLayer();
2668
// else just refresh the pointer
2671
it->second->id(lid);
2672
loadLayer(it->second);
2680
TeDatabase::getRasterTable(int layerId, const string& objectId)
2685
TeDatabasePortal* portal = this->getPortal();
2690
// get the raster representation
2691
get = "SELECT geom_table FROM te_representation WHERE layer_id = "+Te2String(layerId);
2692
get += " AND geom_type= " + Te2String((int)TeRASTER);
2694
// error executing query or no there is no raster representation
2695
if (!portal->query(get) || !portal->fetchRow())
2701
string tableName = portal->getData(0);
2702
portal->freeResult();
2703
if (tableName.empty())
2709
// check if a specific object is being looked for
2710
get = "SELECT raster_table FROM " + tableName + " WHERE object_id='" + objectId + "'";
2711
if (!portal->query(get) || !portal->fetchRow())
2716
tableName = portal->getData(0);
2723
TeDatabase::loadLayerRaster(int layerId, const string& objectId, const char& mode)
2728
TeDatabasePortal* portal = this->getPortal();
2732
TeRaster* raster = 0;
2734
// get the raster representation
2735
get = "SELECT geom_table FROM te_representation WHERE layer_id = "+Te2String(layerId);
2736
get += " AND geom_type= " + Te2String((int)TeRASTER);
2738
// error executing query or no there is no raster representation
2739
if (!portal->query(get) || !portal->fetchRow())
2745
string tableName = portal->getData(0);
2746
portal->freeResult();
2747
if (tableName.empty())
2753
//--- this check is made for compatibility reasons with older terralib databases
2754
TeAttributeRep attrRep;
2755
attrRep.name_ = "tiling_type";
2756
attrRep.type_ = TeINT;
2759
if(!columnExist(tableName, attrRep.name_,att))
2761
addColumn (tableName, attrRep);
2762
string sql = "UPDATE " + tableName + " SET tiling_type = " + Te2String(static_cast<int>(TeExpansible));
2768
// check if a specific object is being looked for
2769
get = "SELECT * FROM " + tableName;
2770
if (!objectId.empty())
2771
get += " WHERE object_id='" + objectId + "'";
2772
if (!portal->query(get) || !portal->fetchRow())
2778
string oid = portal->getData("object_id");
2779
int geomId = portal->getInt("geom_id"); // get raster representation id
2781
// get raster parameters from te_raster_table table
2782
TeRasterParams params;
2783
params.fileName_ = portal->getData("raster_table");
2784
params.lutName_ = portal->getData("lut_table");
2785
params.nBands(portal->getInt("num_bands"));
2786
params.boundingBoxResolution(portal->getDouble("lower_x"),portal->getDouble("lower_y"),
2787
portal->getDouble("upper_x"),portal->getDouble("upper_y"),
2788
portal->getDouble("res_x"),portal->getDouble("res_y"));
2789
params.blockHeight_ = portal->getInt("block_height");
2790
params.blockWidth_ = portal->getInt("block_width");
2791
params.tiling_type_ = static_cast<TeRasterTilingType>(portal->getInt("tiling_type"));
2793
portal->freeResult();
2795
// get extra information from te_raster_metadata table
2796
string metadatatable = tableName + "_metadata";
2797
unsigned int nb = params.nBands();
2799
for (i=0; i<nb; i++)
2801
get = "SELECT * FROM " + metadatatable + " WHERE geom_id=" + Te2String(geomId);
2802
get += " AND band_id=" + Te2String(i);
2803
if (portal->query(get) && portal->fetchRow())
2805
params.vmax_[i] = portal->getDouble("max_value");
2806
params.vmin_[i] = portal->getDouble("min_value");
2807
params.nbitsperPixel_[i] = portal->getInt("num_bits");
2808
params.dataType_[i] = TeDataType(portal->getInt("data_type"));
2809
params.compression_[i] = TeCompressionMode(portal->getInt("compression_type"));
2810
params.photometric_[i] = portal->getInt("photometric_type");
2812
portal->freeResult();
2815
// if raster is pallete get the associated LUT
2816
if ((params.photometric_[0] == TeRASTERPALETTE) ||
2817
(params.photometric_[0] == TeRASTERKERNEL))
2818
this->loadRasterLUT(¶ms);
2820
// raster has the same projection as its layer
2821
get = "SELECT projection_id FROM te_layer WHERE layer_id = " + Te2String(layerId);
2823
TeProjection* proj=0;
2824
if (portal->query(get) && portal->fetchRow())
2826
projId = portal->getInt("projection_id");
2827
proj = this->loadProjection(projId);
2829
portal->freeResult();
2831
params.projection(proj);
2834
params.nTilesInMemory_ = 0;
2835
params.database_ = this;
2837
bool hasDummy = false;
2839
get = "SELECT band_id, dummy FROM " + metadatatable + " WHERE geom_id=" + Te2String(geomId);
2840
get += " AND NOT (dummy IS NULL)";
2841
if (portal->query(get))
2843
while (portal->fetchRow())
2845
int b = portal->getInt(0);
2846
double d = portal->getDouble("dummy");
2847
params.setDummy(d,b);
2851
params.useDummy_ = hasDummy;
2852
params.mode_ = mode;
2855
// builds a raster from the parameters
2856
TeDecoderDatabase* dec = new TeDecoderDatabase(params);
2858
raster = new TeRaster();
2859
raster->setDecoder(dec);
2860
raster->objectId(oid);
2865
TeDatabase::loadRasterLUT(TeRasterParams* par)
2867
if (par->lutName_.empty())
2870
TeDatabasePortal* portal = this->getPortal();
2874
string get = "SELECT COUNT(index_id) FROM " + par->lutName_;
2875
if (!portal->query(get) || !portal->fetchRow()) // if there is no table, or table is empty
2880
int nentries = atoi(portal->getData(0));
2887
par->setNumberPalleteEntries(nentries);
2888
portal->freeResult();
2890
get = "SELECT * FROM " + par->lutName_ + " ORDER BY index_id ASC ";
2892
if (!portal->query(get) || !portal->fetchRow()) // if there is no table, or table is empty
2899
int index = atoi(portal->getData(0));
2900
par->lutr_[index] = atoi(portal->getData(1));
2901
par->lutg_[index] = atoi(portal->getData(2));
2902
par->lutb_[index] = atoi(portal->getData(3));
2903
}while (portal->fetchRow());
2911
TeDatabase::loadLayer(TeLayer* layer)
2917
if (layer->id() > 0)
2918
get = "SELECT * FROM te_layer WHERE layer_id = "+ Te2String(layer->id());
2919
else if (!layer->name().empty())
2920
get = "SELECT * FROM te_layer WHERE name = '"+ layer->name() + "'";
2923
this->errorMessage_ = "Layer procurado nļæ½o possui nem id nem nome";
2927
TeDatabasePortal* portal = this->getPortal();
2930
this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
2934
if (!portal->query (get))
2939
if (!portal->fetchRow())
2945
layer->id(atoi (portal->getData("layer_id")));
2946
layer->name(string (portal->getData("name")));
2947
layer->setLayerBox(TeBox(portal->getDouble("lower_x"),
2948
portal->getDouble("lower_y"),
2949
portal->getDouble("upper_x"),
2950
portal->getDouble("upper_y")));
2952
int projId = portal->getInt("projection_id");
2953
portal->freeResult();
2955
layer->setDatabase(this);
2957
// Load layer projection
2958
TeProjection* proj = loadProjection (projId);
2960
layer->setProjection (proj);
2962
// Load layer representations
2963
get = "SELECT * FROM te_representation WHERE layer_id = "+Te2String(layer->id());
2964
if (portal->query (get))
2966
while (portal->fetchRow())
2968
TeRepresentation* repp = new TeRepresentation();
2969
repp->id_ = atoi(portal->getData(0));
2970
TeGeomRep g = (TeGeomRep)atoi (portal->getData(2));
2972
repp->tableName_ = portal->getData(3);
2973
repp->description_ = portal->getData(4);
2974
repp->box_ = TeBox(portal->getDouble(5),
2975
portal->getDouble(6),
2976
portal->getDouble(7),
2977
portal->getDouble(8));
2978
repp->resX_ = portal->getDouble(9);
2979
repp->resY_ = portal->getDouble(10);
2980
repp->nCols_ = portal->getInt(11);
2981
repp->nLins_ = portal->getInt(12);
2982
layer->addVectRepres(repp);
2987
if(!loadLayerTable(layer))
2990
layerMap_[layer->id()] = layer;
2995
TeDatabase::loadLayerTable(TeLayer* layer)
2997
TeDatabasePortal* portal = this->getPortal();
3000
this->errorMessage_ = "Nļæ½o foi possļæ½vel abrir portal para o banco";
3005
string get = " SELECT * FROM te_layer_table";
3006
get += " WHERE layer_id = " + Te2String(layer->id());
3007
get += " ORDER BY attr_table_type, table_id";
3009
if (!portal->query (get))
3015
while (portal->fetchRow())
3017
string tableName = portal->getData("attr_table");
3018
int tableId = portal->getInt("table_id");
3019
string indexName = portal->getData("attr_link");
3021
TeAttributeList attrList;
3022
getAttributeList(tableName, attrList);
3024
TeTable attTable(tableName,attrList,
3025
portal->getData("unique_id"), indexName,
3026
TeAttrTableType(portal->getInt("attr_table_type")));
3028
attTable.setId(tableId);
3029
attTable.attInitialTime(portal->getData("attr_initial_time"));
3030
attTable.attFinalTime(portal->getData("attr_final_time"));
3031
attTable.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
3033
layer->addAttributeTable(attTable);
3041
TeDatabase::layerExist(int layerId)
3043
TeDatabasePortal* portal = this->getPortal();
3047
string sql = "SELECT layer_id FROM te_layer WHERE layer_id = " + Te2String(layerId);
3048
if (!portal->query(sql))
3053
if (!portal->fetchRow())
3063
TeDatabase::layerExist(string layerName)
3065
TeDatabasePortal* portal = this->getPortal();
3069
layerName = TeConvertToUpperCase(layerName);
3071
string sql = "SELECT name FROM te_layer";
3072
if (!portal->query(sql))
3077
while (portal->fetchRow())
3079
string name = portal->getData(0);
3080
name = TeConvertToUpperCase(name);
3081
if (layerName == name)
3093
TeDatabase::deleteLayer(int layerId)
3095
//Delete attributes tables
3096
if(!deleteLayerTable(layerId))
3099
TeDatabasePortal* portal = this->getPortal();
3104
string sql = "SELECT projection_id FROM te_layer WHERE layer_id = ";
3105
sql += Te2String(layerId);
3107
if (!portal->query(sql))
3113
if (!portal->fetchRow())
3118
string projId = portal->getData("projection_id");
3119
portal->freeResult();
3121
// Get all representations that are associated to this layer
3122
sql = "SELECT * FROM te_representation WHERE layer_id = "+ Te2String(layerId);
3123
if (!portal->query (sql))
3129
while (portal->fetchRow())
3131
// Save the name of the geometry table
3132
string geomTable = portal->getData("geom_table");
3135
TeGeomRep rep = TeGeomRep(portal->getInt("geom_type"));
3136
if (rep == TeRASTER)
3138
TeDatabasePortal* portal2 = this->getPortal();
3139
sql = "SELECT lut_table, raster_table FROM " + geomTable;
3141
if (!portal2->query (sql))
3147
while (portal2->fetchRow())
3150
tabName = portal2->getData(0);
3151
if (!tabName.empty() && this->tableExist(tabName))
3153
sql = "DROP TABLE " + tabName;
3156
// remove raster table
3157
tabName = portal2->getData(1);
3158
if (!tabName.empty() && this->tableExist(tabName))
3160
sql = "DROP TABLE " + tabName;
3165
// remove raster metadata table
3166
tabName = geomTable + "_metadata";
3167
if (!tabName.empty() && this->tableExist(tabName))
3169
sql = "DROP TABLE " + tabName;
3173
if (this->tableExist(geomTable))
3175
sql = "DROP TABLE " + geomTable;
3176
if (!this->execute(sql) )
3183
portal->freeResult();
3185
if (existRelation("te_representation","fk_rep_layer_id") != TeRICascadeDeletion)
3187
// Delete entries into representations table
3188
sql = "DELETE FROM te_representation WHERE layer_id = " +Te2String(layerId);
3189
if (!this->execute(sql) )
3196
// delete layer themes
3197
sql = "SELECT theme_id FROM te_theme WHERE layer_id=" + Te2String(layerId);
3198
if (!portal->query (sql))
3205
while (portal->fetchRow())
3207
themeId = portal->getInt("theme_id");
3208
this->deleteTheme(themeId);
3211
sql = "DELETE FROM te_layer WHERE layer_id=" + Te2String(layerId);
3212
if (!this->execute(sql))
3218
// delete layer projection
3219
sql = "DELETE FROM te_projection WHERE projection_id = "+ projId;
3220
if (!this->execute(sql))
3226
// remove all the itemsļæ½ themes associated to the layer to be removed
3227
TeThemeMap::iterator it;
3228
for (it = themeMap_.begin(); it != themeMap_.end(); ++it)
3230
TeTheme *theme = it->second;
3231
if (theme && theme->layer() && (theme->layer()->id() == layerId))
3233
themeMap_.erase(theme->id());
3238
// delete layer and its entry in the layer map
3239
TeLayer* layer = layerMap_[layerId];
3240
layerMap_.erase(layerId);
3249
TeDatabase::deleteLayerTable (int layerId, TeAttrTableType ttype)
3251
TeDatabasePortal* portal = this->getPortal();
3255
//tables of the type 1 can be relationed with other layer ??? Conferir
3256
string query = "SELECT attr_table, table_id FROM te_layer_table WHERE layer_id = " + Te2String(layerId);
3257
query += " AND attr_table_type = " + Te2String(static_cast<int>(ttype));
3258
if(!portal->query(query))
3264
vector<int> tableIds;
3268
while (portal->fetchRow())
3270
attrTable = portal->getData(0);
3271
tableId = portal->getData(1);
3272
drop = "DROP TABLE " + attrTable;
3278
tableIds.push_back(atoi(tableId.c_str()));
3280
string del = "DELETE FROM te_address_locator WHERE table_id = "+ tableId;
3286
if (existRelation("te_tables_relation","fk_tabrelation_laytable_id") != TeRICascadeDeletion)
3288
for (unsigned int i=0; i<tableIds.size();i++)
3290
del = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(tableIds[i]);
3295
del = "DELETE FROM te_layer_table WHERE layer_id = " + Te2String(layerId);
3302
TeDatabase::updateRepresentation (int layerId, TeRepresentation& rep)
3308
sql = "UPDATE te_representation SET ";
3309
sql += " lower_x= " + Te2String(rep.box_.x1(),15);
3310
sql += ", lower_y= " + Te2String(rep.box_.y1(),15);
3311
sql += ", upper_x= " + Te2String(rep.box_.x2(),15);
3312
sql += ", upper_y= " + Te2String(rep.box_.y2(),15);
3313
sql += ", description= '" + rep.description_ + "'";
3314
sql += ", res_x= " + Te2String(rep.resX_);
3315
sql += ", res_y= " + Te2String(rep.resY_);
3316
sql += ", num_cols=" + Te2String(rep.nCols_);
3317
sql += ", num_rows=" + Te2String(rep.nLins_);
3319
if (rep.geomRep_ != TeTEXT)
3320
sql += ", geom_table='" + rep.tableName_ + "'";
3322
sql += " WHERE layer_id=" + Te2String(layerId);
3323
sql += " AND geom_type= " + Te2String(rep.geomRep_);
3325
if (rep.geomRep_ == TeTEXT)
3326
sql += " AND geom_table='" + rep.tableName_ + "'";
3328
return this->execute(sql);
3332
TeDatabase::insertRasterGeometry(const string& tableName, TeRasterParams& par, const string& objectId)
3334
if (tableName.empty())
3338
if (objectId.empty())
3343
//------ this check is made for compatibility reasons with old versions of TerraLib databases
3344
TeAttributeRep attrRep;
3345
attrRep.name_ = "tiling_type";
3346
attrRep.type_ = TeINT;
3349
if(!columnExist(tableName, attrRep.name_,att))
3351
addColumn (tableName, attrRep);
3352
string sql = "UPDATE " + tableName + " SET tiling_type = " + Te2String(static_cast<int>(TeExpansible));
3357
// finds the name of the raster geometry table
3358
TeDatabasePortal* portal = this->getPortal();
3362
TeBox box = par.boundingBox();
3364
string ins = "INSERT INTO " + tableName + " (object_id, raster_table, lut_table, ";
3365
ins += "res_x, res_y, num_bands, num_cols, num_rows, block_height, block_width, ";
3366
ins += "lower_x, lower_y, upper_x, upper_y, tiling_type) ";
3367
ins += " VALUES ('" + objId + "', '" + par.fileName_+ "', '" + par.lutName_ + "', ";
3368
ins += Te2String(par.resx_) + ", " + Te2String(par.resy_) + ", ";
3369
ins += Te2String(par.nBands()) + ", " + Te2String(par.ncols_) + ", " + Te2String(par.nlines_) + ", ";
3370
ins += Te2String(par.blockHeight_) + ", " + Te2String(par.blockWidth_) + ", ";
3371
ins += Te2String(box.x1_,15) +", " + Te2String(box.y1_,15) + ", ";
3372
ins += Te2String(box.x2_,15) +", " + Te2String(box.y2_,15) + ", ";
3373
ins += Te2String(par.tiling_type_) + ")";
3374
if (!this->execute(ins))
3380
// save the pallete associated to the raster
3381
// if it doesnļæ½t exist yet
3382
if ((par.photometric_[0] == TeRASTERPALETTE ||
3383
par.photometric_[0] == TeRASTERKERNEL) && !par.lutName_.empty())
3386
if (!this->tableExist(par.lutName_))
3388
if (this->createLUTTable(par.lutName_))
3390
for (unsigned int i=0; i<par.lutb_.size(); i++)
3392
string sql = "INSERT INTO " + par.lutName_ + " VALUES(";
3393
sql += Te2String(i) + ", ";
3394
sql += Te2String(par.lutr_[i]) + ", ";
3395
sql += Te2String(par.lutg_[i]) + ", ";
3396
sql += Te2String(par.lutb_[i]) + ")";
3403
ins = "SELECT geom_id FROM " + tableName + " WHERE object_id='" + objId + "'";
3404
ins += " AND raster_table='" + par.fileName_+ "'";
3405
if(!portal->query(ins) || !portal->fetchRow())
3410
int geomId = atoi(portal->getData(0));
3412
string metadataTableName = tableName+"_metadata";
3413
insertRasterMetadata(metadataTableName, geomId,par);
3418
TeDatabase::updateRasterRepresentation(int layerId, TeRasterParams& par, const string& objectId)
3420
TeDatabasePortal* portal = this->getPortal();
3424
string sql = "SELECT repres_id, lower_x, lower_y, upper_x, upper_y, geom_table ";
3425
sql += " FROM te_representation WHERE layer_id= " + Te2String(layerId);
3426
sql += " AND geom_type= " + Te2String(TeRASTER);
3428
if(!portal->query(sql) || !portal->fetchRow())
3433
TeBox box (portal->getDouble(1),portal->getDouble(2),
3434
portal->getDouble(3),portal->getDouble(4));
3435
int represId = atoi(portal->getData(0));
3436
string rasterrep = portal->getData(5);
3437
portal->freeResult();
3439
updateBox(box,par.boundingBox());
3440
sql = "UPDATE te_representation SET lower_x = " + Te2String(box.x1_,15);
3441
sql += ", lower_y = " + Te2String(box.y1_,15) + ", upper_x = " + Te2String(box.x2_,15);
3442
sql += ", upper_y = " + Te2String(box.y2_,15) + " WHERE repres_id=" + Te2String(represId);
3451
if (objectId.empty())
3456
box = par.boundingBox();
3458
sql = "UPDATE " + rasterrep + " SET lut_table ='" + par.lutName_ + "'";
3459
sql += ", res_x= " + Te2String(par.resx_) + ", res_y=" + Te2String(par.resy_);
3460
sql += ", num_bands=" + Te2String(par.nBands()) + ", num_cols=" + Te2String(par.ncols_);
3461
sql += ", num_rows=" + Te2String(par.nlines_) + ", block_height=" + Te2String(par.blockHeight_);
3462
sql += ", block_width= " + Te2String(par.blockWidth_) + ", lower_x = " + Te2String(box.x1_,15);
3463
sql += ", lower_y = " + Te2String(box.y1_,15) + ", upper_x = " + Te2String(box.x2_,15);
3464
sql += ", upper_y = " + Te2String(box.y2_,15);
3465
sql += " WHERE object_id='" + objId + "' AND raster_table='" + par.fileName_ + "'";
3466
if (!this->execute(sql))
3472
sql = "SELECT geom_id FROM " + rasterrep + " WHERE object_id='" + objId + "'";
3473
sql+= " AND raster_table='" + par.fileName_+ "'";
3474
if(!portal->query(sql) || !portal->fetchRow())
3480
// save the pallete associated to the raster
3481
// if it doesnļæ½t exist yet
3482
if ((par.photometric_[0] == TeRASTERPALETTE ||
3483
par.photometric_[0] == TeRASTERKERNEL) && !par.lutName_.empty())
3486
if (!this->tableExist(par.lutName_))
3488
if (this->createLUTTable(par.lutName_))
3490
for (unsigned int i=0; i<par.lutb_.size(); i++)
3492
string sql = "INSERT INTO " + par.lutName_ + " VALUES(";
3493
sql += Te2String(i) + ", ";
3494
sql += Te2String(par.lutr_[i]) + ", ";
3495
sql += Te2String(par.lutg_[i]) + ", ";
3496
sql += Te2String(par.lutb_[i]) + ")";
3503
int geomId = atoi(portal->getData(0));
3505
string metadatatabel = rasterrep + "_metadata";
3506
return updateRasterMetadata(metadatatabel,geomId,par);
3510
TeDatabase::insertRasterMetadata (const string& tableName, int geomId, TeRasterParams& par)
3518
unsigned int nb = par.nBands();
3519
ins = "INSERT INTO " + tableName + " (geom_id, band_id, min_value, max_value, ";
3520
ins += " num_bits, data_type, photometric_type, compression_type ) VALUES (";
3522
for (i=0; i<nb; i++)
3524
vals = Te2String(geomId) + ", " + Te2String(i) + ", ";
3525
vals += Te2String(par.vmin_[i],15) + ", " + Te2String(par.vmax_[i],15) + ", ";
3526
vals += Te2String(par.nbitsperPixel_[i]) + ", " + Te2String(par.dataType_[i]) + ", " ;
3527
vals += Te2String(par.photometric_[i]) + ", " + Te2String(par.compression_[i]) + " )" ;
3528
string sql = ins + vals;
3529
if (!this->execute(sql))
3533
// update dummy value
3536
ins = "UPDATE " + tableName + " SET dummy = ";
3537
for (i=0; i<nb; i++)
3539
vals = Te2String(par.dummy_[i]) + " WHERE geom_id = " + Te2String(geomId);
3540
vals += " AND band_id=" + Te2String(i);
3541
string sql = ins + vals;
3542
if (!this->execute(sql))
3550
TeDatabase::updateRasterMetadata (const string& tableName, int geomId, TeRasterParams& par)
3555
string sql = "DELETE FROM " + tableName + " WHERE geom_id = " + Te2String(geomId);
3556
if (!this->execute (sql))
3558
return insertRasterMetadata(tableName,geomId,par);
3562
TeDatabase::updateLegend (TeLegendEntry *legend)
3568
if (legend->id() > 0 )
3570
sql = "UPDATE te_legend SET ";
3571
sql += " theme_id=" + Te2String (legend->theme());
3572
sql += ",group_id=" + Te2String (legend->group());
3573
sql += ",num_objs=" + Te2String (legend->count());
3574
sql += ",lower_value='" + escapeSequence(legend->from())+"'";
3575
sql += ",upper_value='" + escapeSequence(legend->to())+"'";
3576
sql += ",label='" + escapeSequence(legend->label())+"'";
3577
sql += " WHERE legend_id=" + Te2String (legend->id());
3579
if (execute(sql) == false)
3584
if (!insertLegend(legend))
3587
legendMap_[legend->id()] = legend;
3589
return updateVisual(legend);
3593
TeDatabase::updateVisual(TeLegendEntry *legend)
3598
TeGeomRepVisualMap mapVis = legend->getVisualMap();
3599
TeGeomRepVisualMap::iterator it = mapVis.begin();
3600
while ( it != mapVis.end())
3603
TeGeomRep rep = it->first;
3604
TeVisual vis = it->second;
3606
TeColor cor = vis.color(); // filling color
3607
TeColor contourCor = vis.contourColor();// contour color
3609
string update = "UPDATE te_visual SET ";
3610
update += " lib_name = '"+ vis.libName() +"', ";
3611
update += "red = "+ Te2String(cor.red_) + ", ";
3612
update += "green =" + Te2String(cor.green_) + ", ";
3613
update += "blue =" + Te2String(cor.blue_) + ", ";
3614
update += "transparency =" + Te2String(vis.transparency()) + ", ";
3616
update += "contour_lib_name='"+ vis.contourLibName() +"', ";
3617
update += "contour_red=" + Te2String(contourCor.red_) + ", ";
3618
update += "contour_green=" + Te2String(contourCor.green_) + ", ";
3619
update += "contour_blue=" + Te2String(contourCor.blue_) + ", ";
3620
update += "contour_transp=" + Te2String(vis.contourTransparency()) + ", ";
3621
update += "contour_width=" + Te2String(vis.contourWidth()) + ", ";
3623
if(rep == TePOLYGONS)
3625
update += "width=" + Te2String(vis.contourWidth()) + ", ";
3626
update += "contour_symb_id=" + Te2String(vis.contourStyle()) + ", ";
3627
update += "symb_id=" + Te2String(vis.style()) + ", ";
3629
else if(rep == TeLINES)
3631
update += "width=" + Te2String(vis.width()) + ", ";
3632
update += "symb_id=" + Te2String(vis.style()) + ", ";
3634
else if(rep == TePOINTS)
3636
update += "size_value=" + Te2String(vis.size()) + ", ";
3637
update += "symb_id=" + Te2String(vis.style ()) + ", ";
3639
else if(rep == TeTEXT)
3641
update += "size_value=" + Te2String(vis.size()) + ", ";
3642
update += "pt_angle=" + Te2String(vis.ptAngle()) + ", ";
3645
update += "family='" + vis.family() + "', ";
3647
update += "bold=1, ";
3649
update += "bold=0, ";
3652
update += "italic=1, ";
3654
update += "italic=0, ";
3656
update += "fixed_size=" + Te2String(vis.fixedSize())+ ", ";
3657
update += "alignment_vert=" + Te2String(vis.alignmentVert())+ ", ";
3658
update += "alignment_horiz=" + Te2String(vis.alignmentHoriz())+ ", ";
3659
update += "tab_size=" + Te2String(vis.tabSize())+ ", ";
3660
update += "line_space=" + Te2String(vis.lineSpace());
3662
update += " WHERE legend_id= " + Te2String(legend->id()) ;
3663
update += " AND geom_type= " + Te2String(rep);
3665
if (!execute(update))
3673
TeDatabase::loadLegend (TeTheme *theme)
3679
int legId, gId, lastLegId;
3682
vector<string> legIdVec;
3683
map<int, TeLegendEntry> legMap;
3684
map<int, TeLegendEntry>::iterator it;
3685
map<int, TeLegendEntry*> ownLegMap;
3687
theme->cleanLegend();
3689
TeDatabasePortal* portal = getPortal();
3691
string q = "SELECT * FROM te_legend WHERE theme_id = " + Te2String(theme->id());
3692
q += " ORDER BY legend_id";
3694
if (!portal->query(q))
3700
while(portal->fetchRow())
3702
legId = portal->getInt("legend_id");
3703
legIdVec.push_back(Te2String(legId));
3705
TeLegendEntry& legEntry = legMap[legId];
3707
legEntry.theme(theme->id());
3708
TeSlice& slice = legEntry.slice();
3710
gId = portal->getInt("group_id");
3711
legEntry.group(gId);
3714
TeLegendEntry* ownLeg = new TeLegendEntry;
3715
ownLegMap[legId] = ownLeg;
3718
string lb = portal->getData("label");
3720
slice.count_ = portal->getInt("num_objs");
3721
slice.from_ = portal->getData("lower_value");
3722
slice.to_ = portal->getData("upper_value");
3726
for(i = 0; i < legIdVec.size(); ++i)
3728
inClause += legIdVec[i];
3729
if (i != legIdVec.size() - 1)
3733
portal->freeResult();
3734
q = "SELECT * FROM te_visual WHERE legend_id IN (";
3735
q += inClause + ") ORDER BY legend_id";
3737
if (!portal->query(q))
3743
while(portal->fetchRow())
3745
legId = portal->getInt("legend_id");
3746
rep = TeGeomRep(portal->getInt("geom_type"));
3747
visual = portal->getVisual();
3749
TeLegendEntry& legEntry = legMap[legId];
3750
gId = legEntry.group();
3751
legEntry.setVisual(visual, rep);
3753
if (gId == -10) // own visual
3755
TeLegendEntry* ownLegend = ownLegMap[legId];
3756
*ownLegend = legEntry;
3758
if (rep == TePOLYGONS)
3759
ownLegend->setVisual(visual, TePOLYGONS);
3760
else if (rep == TeLINES)
3761
ownLegend->setVisual(visual, TeLINES);
3762
else if (rep == TePOINTS)
3763
ownLegend->setVisual(visual, TePOINTS);
3764
else if (rep == TeTEXT)
3765
ownLegend->setVisual(visual, TeTEXT);
3767
legendMap_[legId] = ownLegend;
3771
TeLegendEntry& pointingQueryLegend = theme->queryAndPointingLegend();
3772
pointingQueryLegend = legEntry;
3774
pointingQueryLegend.setVisual(visual, TeLINES);
3775
pointingQueryLegend.setVisual(visual, TePOINTS);
3776
pointingQueryLegend.setVisual(visual, TeCELLS);
3777
pointingQueryLegend.setVisual(visual, TeTEXT);
3779
legendMap_[legId] = &pointingQueryLegend;
3783
TeLegendEntry& queryLegend = theme->queryLegend();
3784
queryLegend = legEntry;
3786
queryLegend.setVisual(visual, TeLINES);
3787
queryLegend.setVisual(visual, TePOINTS);
3788
queryLegend.setVisual(visual, TeCELLS);
3789
queryLegend.setVisual(visual, TeTEXT);
3791
legendMap_[legId] = &queryLegend;
3795
TeLegendEntry& pointingLegend = theme->pointingLegend();
3796
pointingLegend = legEntry;
3798
pointingLegend.setVisual(visual, TeLINES);
3799
pointingLegend.setVisual(visual, TePOINTS);
3800
pointingLegend.setVisual(visual, TeCELLS);
3801
pointingLegend.setVisual(visual, TeTEXT);
3803
legendMap_[legId] = &pointingLegend;
3807
TeLegendEntry& defaultLegend = theme->defaultLegend();
3808
defaultLegend = legEntry;
3809
legendMap_[legId] = &defaultLegend;
3811
// Make the pointing visual equal to the default visual, excluding
3812
// the pointing color
3814
TeLegendEntry& pointingLegend = theme->pointingLegend();
3815
TeVisual& pointingVisual = pointingLegend.visual(rep);
3816
color = pointingVisual.color();
3817
pointingLegend.setVisual(visual, rep);
3818
pointingVisual.color(color);
3820
// Make the query visual equal to the default visual, excluding
3822
TeLegendEntry& queryLegend = theme->queryLegend();
3823
TeVisual& queryVisual = queryLegend.visual(rep);
3824
color = queryVisual.color();
3825
queryLegend.setVisual(visual, rep);
3826
queryVisual.color(color);
3828
// Make the pointingQuery visual equal to the default visual, excluding
3829
// the pointingQuery color
3830
TeLegendEntry& pointingQueryLegend = theme->queryAndPointingLegend();
3831
TeVisual& pointingQueryVisual = pointingQueryLegend.visual(rep);
3832
color = pointingQueryVisual.color();
3833
pointingQueryLegend.setVisual(visual, rep);
3834
pointingQueryVisual.color(color);
3838
TeLegendEntry& withoutDataConnectionLegend = theme->withoutDataConnectionLegend();
3839
withoutDataConnectionLegend = legEntry;
3840
legendMap_[legId] = &withoutDataConnectionLegend;
3844
TeLegendEntry& outOfCollectionLegend = theme->outOfCollectionLegend();
3845
outOfCollectionLegend = legEntry;
3846
legendMap_[legId] = &outOfCollectionLegend;
3850
TeLegendEntryVector& legendEntryVector = theme->legend();
3851
if (legendEntryVector.empty() == true)
3852
legendEntryVector.push_back(legMap[legId]);
3855
if (legId != lastLegId)
3856
legendEntryVector.push_back(legMap[legId]);
3859
legendEntryVector.pop_back();
3860
legendEntryVector.push_back(legMap[legId]);
3867
TeLegendEntryVector& legVector = theme->legend();
3868
for (i = 0; i < legVector.size(); ++i)
3869
legendMap_[legVector[i].id()] = &legVector[i];
3877
TeDatabase::updateProjection (TeProjection *proj)
3879
if (proj->id() <= 0)
3882
sql = "UPDATE te_projection SET ";
3883
sql += "name='" + proj->name() + "',";
3884
sql += " long0=" + Te2String(proj->params().lon0*TeCRD,15)+ ",";
3885
sql += " lat0=" + Te2String(proj->params().lat0*TeCRD,15) + ",";
3886
sql += " offx=" +Te2String(proj->params().offx,15) + ",";
3887
sql += " offy=" +Te2String(proj->params().offy,15) + ",";
3888
sql += " stlat1="+ Te2String(proj->params().stlat1*TeCRD,15) + ",";
3889
sql += " stlat2=" +Te2String(proj->params().stlat2*TeCRD,15) + ",";
3890
sql += " unit='" + proj->params().units + "',";
3891
sql += " scale=" + Te2String(proj->params().scale) + ",";
3892
sql += " hemis=" + Te2String(proj->params().hemisphere) + ",";
3893
sql += " datum='" + proj->datum().name() + "',";
3894
sql += " radius=" + Te2String(proj->datum().radius(),15) + ",";
3895
sql += " flattening=" + Te2String(proj->datum().flattening(),15) + ",";
3896
sql += " dx=" + Te2String(proj->datum().xShift(),15) + ",";
3897
sql += " dy=" + Te2String(proj->datum().yShift(),15) + ",";
3898
sql += " dz=" + Te2String(proj->datum().zShift(),15) ;
3899
sql += " WHERE projection_id = " + Te2String(proj->id());
3900
return this->execute(sql);
3904
TeDatabase::loadProjection (int projId)
3906
TeDatabasePortal* portal = this->getPortal();
3908
string sql ="SELECT * FROM te_projection WHERE projection_id = " + Te2String (projId);
3910
if (!portal->query(sql))
3916
// Look for the projection
3917
if (!portal->fetchRow())
3923
TeDatum datum ( portal->getData("datum"),
3924
portal->getDouble("radius"),
3925
portal->getDouble("flattening"),
3926
portal->getDouble("dx"),
3927
portal->getDouble("dy"),
3928
portal->getDouble("dz"));
3930
TeProjectionParams mProjPars;
3931
mProjPars.datum = datum;
3932
mProjPars.name = portal->getData("name");
3933
mProjPars.lat0 = portal->getDouble("lat0")*TeCDR;
3934
mProjPars.lon0 = portal->getDouble("long0")*TeCDR;
3935
mProjPars.offx = portal->getDouble("offx");
3936
mProjPars.offy = portal->getDouble("offy");
3937
mProjPars.stlat1 = portal->getDouble("stlat1")*TeCDR;
3938
mProjPars.stlat2 = portal->getDouble("stlat2")*TeCDR;
3939
mProjPars.units = portal->getData("unit");
3940
mProjPars.scale = portal->getDouble("scale");
3941
mProjPars.hemisphere = (TeHemisphere)portal->getInt("hemis");
3943
TeProjection* proj = TeProjectionFactory::make(mProjPars);
3950
TeDatabase::insertPolygonSet(const string& table, TePolygonSet &ps)
3952
for (unsigned int i = 0; i < ps.size(); i++ )
3954
TePolygon poly = ps [i];
3955
if (!insertPolygon (table,poly))
3962
TeDatabase::updatePolygonSet (const string& table, TePolygonSet &ps)
3964
for (unsigned int i = 0; i < ps.size(); i++ )
3966
TePolygon poly = ps [i];
3967
if (!updatePolygon (table,poly))
3974
TeDatabase::selectPolygonSet (const string& table, const string& criteria, TePolygonSet &ps)
3976
TeDatabasePortal *portal = this->getPortal();
3977
string sql ="SELECT * FROM " + table;
3978
if (!criteria.empty())
3979
sql += " WHERE " + criteria;
3980
sql += " ORDER BY object_id ASC, parent_id, num_holes DESC, ext_max ASC";
3982
if (!portal->query(sql))
3987
if (!portal->fetchRow())
3996
flag = portal->fetchGeometry(poly);
4006
TeDatabase::loadPointSet(TeTheme* theme, TePointSet &ps)
4008
string collTable = theme->collectionTable();
4009
if (collTable.empty())
4012
TeLayer* themeLayer = theme->layer();
4013
if (!themeLayer->hasGeometry(TePOINTS))
4016
string pointTable = themeLayer->tableName(TePOINTS);
4017
if (pointTable.empty())
4020
string sql = "SELECT * FROM (" + pointTable + " RIGHT JOIN " + collTable;
4021
sql = sql + " ON " + pointTable + ".object_id = " + collTable + ".object_id)";
4023
TeDatabasePortal *portal = this->getPortal();
4027
if (!portal->query(sql) || !portal->fetchRow())
4036
flag = portal->fetchGeometry(pt);
4045
TeDatabase::loadLineSet(TeTheme* theme, TeLineSet &ls)
4047
string collTable = theme->collectionTable();
4048
if (collTable.empty())
4051
TeLayer* themeLayer = theme->layer();
4052
if (!themeLayer->hasGeometry(TeLINES))
4055
string lineTable = themeLayer->tableName(TeLINES);
4056
if (lineTable.empty())
4059
string sql = "SELECT * FROM (" + lineTable + " RIGHT JOIN " + collTable;
4060
sql = sql + " ON " + lineTable + ".object_id = " + collTable + ".object_id)";
4062
TeDatabasePortal *portal = this->getPortal();
4066
if (!portal->query(sql) || !portal->fetchRow())
4076
flag = portal->fetchGeometry(lin);
4084
TeDatabase::loadPolygonSet (const string& table, const string& geoid, TePolygonSet &ps)
4087
TeDatabasePortal *portal = this->getPortal();
4088
string q ="SELECT * FROM " + table;
4091
q += " WHERE object_id = '" + geoid +"'";
4092
q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
4094
if (!portal->query(q))
4100
if (!portal->fetchRow())
4109
flag = portal->fetchGeometry(poly);
4118
TeDatabase::loadPolygonSet (const string& table, TeBox &bb, TePolygonSet &polSet)
4120
TeDatabasePortal *portal = this->getPortal();
4125
q = "SELECT * FROM " + table + " WHERE ";
4126
q += this->getSQLBoxWhere (bb, TePOLYGONS);
4127
q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
4129
if (!portal->query(q) || !portal->fetchRow())
4138
flag = portal->fetchGeometry(poly);
4147
TeDatabase::loadPolygonSet(const string& table, TeBox &box)
4149
TeDatabasePortal *portal = this->getPortal();
4154
q = "SELECT * FROM " + table + " WHERE ";
4155
q += this->getSQLBoxWhere (box, TePOLYGONS);
4156
q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
4158
if (!portal->query(q) || !portal->fetchRow())
4169
TeDatabase::locatePolygon (const string& table, TeCoord2D &pt, TePolygon &polygon, const double& tol)
4171
TeDatabasePortal *portal = this->getPortal();
4175
TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
4178
q = "SELECT * FROM " + table + " WHERE lower_x < " + Te2String(box.x2(),15);
4179
q += " AND upper_x > " + Te2String(box.x1(),15);
4180
q += " AND lower_y < " + Te2String(box.y2(),15);
4181
q += " AND upper_y > " + Te2String(box.y1(),15);
4182
q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
4184
if (!portal->query(q) || !portal->fetchRow())
4194
flag = portal->fetchGeometry(poly);
4195
if (TeWithin (TePoint(pt), poly))
4209
TeDatabase::locatePolygonSet (const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons)
4211
TeDatabasePortal *portal = this->getPortal();
4215
TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
4218
q = "SELECT * FROM " + table + " WHERE lower_x < " + Te2String(box.x2(),6);
4219
q += " AND upper_x > " + Te2String(box.x1(),6);
4220
q += " AND lower_y < " + Te2String(box.y2(),6);
4221
q += " AND upper_y > " + Te2String(box.y1(),6);
4222
q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
4224
if (!portal->query(q) || !portal->fetchRow())
4234
flag = portal->fetchGeometry(poly);
4235
if (TeWithin (TePoint(pt), poly))
4248
TeDatabase::loadPolygonSet(TeTheme* theme, TePolygonSet &ps)
4250
string collTable = theme->collectionTable();
4251
if (collTable.empty())
4254
TeLayer* themeLayer = theme->layer();
4255
if (!themeLayer->hasGeometry(TePOLYGONS))
4258
string polygonTable = themeLayer->tableName(TePOLYGONS);
4259
if (polygonTable.empty())
4262
string sql = "SELECT * FROM (" + polygonTable + " RIGHT JOIN " + collTable;
4263
sql = sql + " ON " + polygonTable + ".object_id = " + collTable + ".object_id)";
4264
sql += " ORDER BY " + polygonTable + ".parent_id, ";
4265
sql += polygonTable + ".num_holes DESC, " + polygonTable + ".ext_max ASC";
4267
TeDatabasePortal *portal = this->getPortal();
4271
if (!portal->query(sql) || !portal->fetchRow())
4281
flag = portal->fetchGeometry(poly);
4290
TeDatabase::insertLineSet (const string& table, TeLineSet &ls)
4292
for (unsigned int i = 0; i < ls.size(); i++ )
4294
TeLine2D line = ls [i];
4295
if (!insertLine (table,line))
4302
TeDatabase::updateLineSet (const string& table, TeLineSet &ls)
4304
for (unsigned int i = 0; i < ls.size(); i++ )
4306
TeLine2D line = ls [i];
4307
if (!updateLine (table,line))
4314
TeDatabase::loadLineSet (const string& table, const string& geoid, TeLineSet &ls)
4316
TeDatabasePortal *portal = this->getPortal();
4318
string q ="SELECT * FROM " + table;
4321
q += " WHERE object_id = '" + geoid +"'";
4323
q += " ORDER BY ext_max DESC";
4325
if (!portal->query(q) || !portal->fetchRow())
4335
flag = portal->fetchGeometry(line);
4344
TeDatabase::loadLineSet (const string& table, TeBox &bb, TeLineSet &linSet)
4346
TeDatabasePortal *portal = this->getPortal();
4351
q = "SELECT * FROM " + table + " WHERE ";
4352
q += this->getSQLBoxWhere (bb, TeLINES);
4353
q += " ORDER BY ext_max DESC";
4355
if (!portal->query(q) || !portal->fetchRow())
4364
flag = portal->fetchGeometry(lin);
4373
TeDatabase::loadLineSet (const string& table, TeBox &box)
4375
TeDatabasePortal *portal = this->getPortal();
4380
q = "SELECT * FROM " + table + " WHERE ";
4381
q += this->getSQLBoxWhere (box, TeLINES);
4382
q += " ORDER BY ext_max DESC";
4384
if (!portal->query(q) || !portal->fetchRow())
4393
TeDatabase::selectLineSet (const string& table, const string& criteria, TeLineSet &ls)
4395
TeDatabasePortal *portal = this->getPortal();
4396
string q ="SELECT * FROM " + table;
4397
if (!criteria.empty())
4398
q += " WHERE " + criteria;
4400
if (!portal->query(q) || !portal->fetchRow())
4410
flag = portal->fetchGeometry(line);
4419
TeDatabase::locateLine (const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol)
4421
TeDatabasePortal* portal = this->getPortal();
4423
TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
4424
string q ="SELECT * FROM " + table;
4426
sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
4427
box.x2(),box.x1(),box.y2(),box.y1());
4429
if (!portal->query(q) || !portal->fetchRow())
4442
flag = portal->fetchGeometry( l );
4450
if (TeNearest (pt, ls, k, paux, tol))
4459
TeDatabase::insertPointSet (const string& table, TePointSet &ps)
4461
for (unsigned int i = 0; i < ps.size(); i++ )
4463
TePoint point = ps [i];
4464
if (!insertPoint (table,point))
4471
TeDatabase::updatePointSet (const string& table, TePointSet &ps)
4473
for (unsigned int i = 0; i < ps.size(); i++ )
4475
TePoint point = ps [i];
4476
if (!updatePoint (table,point))
4483
TeDatabase::loadPointSet (const string& table, const string& geoid, TePointSet &ps)
4485
TeDatabasePortal* portal = this->getPortal();
4486
string q ="SELECT * FROM " + table;
4489
q += " WHERE object_id = '" + geoid +"'";
4491
if (!portal->query(q) || !portal->fetchRow())
4501
flag = portal->fetchGeometry (point);
4510
TeDatabase::loadPointSet (const string& table, TeBox &bb, TePointSet &ps)
4512
TeDatabasePortal *portal = this->getPortal();
4517
q = "SELECT * FROM " + table + " WHERE ";
4518
q += this->getSQLBoxWhere (bb, TePOINTS);
4520
if (!portal->query(q) || !portal->fetchRow())
4529
flag = portal->fetchGeometry(pt);
4538
TeDatabase::loadPointSet(const string& table, TeBox &box)
4540
TeDatabasePortal *portal = this->getPortal();
4545
q = "SELECT * FROM " + table + " WHERE ";
4546
q += this->getSQLBoxWhere (box, TePOINTS);
4548
if (!portal->query(q) || !portal->fetchRow())
4557
TeDatabase::selectPointSet (const string& table, const string& criteria, TePointSet &ps)
4559
TeDatabasePortal* portal = this->getPortal();
4560
string q ="SELECT * FROM " + table;
4561
if (!criteria.empty())
4562
q += " WHERE " + criteria;
4564
if (!portal->query(q) || !portal->fetchRow())
4574
flag = portal->fetchGeometry (point);
4583
TeDatabase::locatePoint (const string& table, TeCoord2D &pt, TePoint &point, const double& tol)
4585
TeDatabasePortal* portal = this->getPortal();
4587
TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
4588
string q ="SELECT * FROM " + table;
4590
sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
4591
box.x2(),box.x1(),box.y2(),box.y1());
4594
if (!portal->query(q) || !portal->fetchRow())
4604
flag = portal->fetchGeometry (point);
4610
if (TeNearest (pt, ps, k, tol))
4619
TeDatabase::insertTextSet (const string& table, TeTextSet &ts)
4621
for (unsigned int i = 0; i < ts.size(); i++ )
4623
TeText text = ts [i];
4624
if (!insertText (table,text))
4631
TeDatabase::updateTextSet (const string& table, TeTextSet &ts)
4633
for ( unsigned int i = 0; i < ts.size(); i++ )
4635
TeText text = ts [i];
4636
if (!updateText (table,text))
4643
TeDatabase::loadTextSet (const string& table, const string& geoid, TeTextSet &ts)
4645
TeDatabasePortal *portal = this->getPortal();
4647
string q ="SELECT * FROM " + table;
4649
q += " WHERE object_id = '" + geoid +"'";
4651
if (!portal->query(q) || !portal->fetchRow())
4656
// Look for all texts
4661
flag = portal->fetchGeometry(p);
4670
TeDatabase::selectTextSet (const string& table, const string& criteria, TeTextSet &ts)
4672
TeDatabasePortal* portal = this->getPortal();
4673
string q ="SELECT * FROM " + table;
4674
if (!criteria.empty())
4675
q += " WHERE " + criteria;
4677
if (!portal->query(q) || !portal->fetchRow())
4682
// Look for all texts
4687
flag = portal->fetchGeometry(p);
4696
TeDatabase::updateText(const string& table, TeText &t)
4699
sql = "UPDATE " + table + " SET ";
4700
sql += "x=" + Te2String(t.location().x(),10) + ", ";
4701
sql += "y=" + Te2String(t.location().y(),10) + ", ";
4702
sql += "text_value='" + t.textValue() + "', ";
4703
sql += "angle=" + Te2String(t.angle(),5) + ", ";
4704
sql += "height=" + Te2String(t.height(),5) + ",";
4705
sql += "alignment_vert=" + Te2String(t.alignmentVert(),5) + ",";
4706
sql += "alignment_horiz=" + Te2String(t.alignmentHoriz(),5);
4707
sql += " WHERE geom_id=" + Te2String(t.geomId());
4708
return (this->execute(sql));
4712
TeDatabase::updateNode(const string& table, TeNode &node)
4715
sql = "UPDATE " + table + " SET ";
4716
sql += "x=" + Te2String(node.location().x(),10) + ", ";
4717
sql += "y=" + Te2String(node.location().y(),10) + ", ";
4718
sql += " WHERE geom_id = " + Te2String(node.geomId());
4719
return (this->execute(sql));
4723
TeDatabase::updatePoint(const string& table, TePoint &p)
4726
sql = "UPDATE " + table + " SET ";
4727
sql += "x=" + Te2String(p.location().x(),10) + ", ";
4728
sql += "y=" + Te2String(p.location().y(),10) + ", ";
4729
sql += " WHERE geom_id = " + Te2String(p.geomId());
4730
return (this->execute(sql));
4733
bool TeDatabase::locateText (const string& table, TeCoord2D &pt, TeText &text, const double& tol)
4735
TeDatabasePortal* portal = this->getPortal();
4737
TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
4738
string q ="SELECT * FROM " + table;
4740
sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
4741
box.x2(),box.x1(),box.y2(),box.y1());
4743
if (!portal->query(q) || !portal->fetchRow())
4748
// Look for all texts
4754
flag = portal->fetchGeometry(p);
4761
if (TeNearest (pt, ts, k, tol))
4770
TeDatabase::insertArcSet (const string& table, TeArcSet &as)
4772
for (unsigned int i = 0; i < as.size(); i++ )
4775
if (!insertArc (table,arc))
4782
TeDatabase::updateArcSet (const string& table, TeArcSet &as)
4784
for ( unsigned int i = 0; i < as.size(); i++ )
4787
if (!updateArc (table,arc))
4794
TeDatabase::loadArcSet (const string& table, const string& geoid, TeArcSet &as)
4797
TeDatabasePortal* portal = this->getPortal();
4798
string q ="SELECT * FROM " + table;
4800
q += " WHERE object_id = " + geoid;
4802
if (!portal->query(q) || !portal->fetchRow())
4808
// Look for all nodes
4813
flag = portal->fetchGeometry(arc);
4821
TeDatabase::updateArc (const string& /*table */, TeArc &arc)
4824
sql = "UPDATE table SET ";
4825
sql += "from_node=" + Te2String(arc.fromNode().geomId()) + ", ";
4826
sql += "to_node=" + Te2String(arc.toNode().geomId()) + ", ";
4827
sql += " WHERE object_id = " + arc.geomId();
4828
return (this->execute(sql));
4832
TeDatabase::insertNodeSet (const string& table, TeNodeSet &ns)
4834
for (unsigned int i = 0; i < ns.size(); i++ )
4837
if (!insertNode (table,no))
4844
TeDatabase::updateNodeSet (const string& table, TeNodeSet &ns)
4846
for (unsigned int i = 0; i < ns.size(); i++ )
4849
if (!updateNode (table,no))
4856
TeDatabase::loadNodeSet (const string& table, const string& geoid, TeNodeSet &ns)
4858
TeDatabasePortal* portal = this->getPortal();
4859
string q ="SELECT * FROM " + table;
4861
q += " WHERE object_id = " + geoid;
4863
if (!portal->query(q) || !portal->fetchRow())
4873
flag = portal->fetchGeometry(n);
4882
TeDatabase::insertCellSet (const string& table, TeCellSet &cs)
4884
for (unsigned int i = 0; i < cs.size(); i++ )
4886
TeCell cell = cs [i];
4887
if (!insertCell (table,cell))
4894
TeDatabase::updateCellSet (const string& table, TeCellSet &cs)
4896
for (unsigned int i = 0; i < cs.size(); i++ )
4898
TeCell cell = cs [i];
4899
if (!updateCell (table,cell))
4906
TeDatabase::loadCellSet (const int& layerId, const string& table, const string& geoid, TeCellSet &cs)
4909
TeDatabasePortal *portal = this->getPortal();
4911
// Get the cell set resolution
4912
string q = "SELECT * FROM te_representation WHERE layer_id = " + Te2String(layerId);
4913
q += " AND geom_type = " + Te2String(TeCELLS);
4915
if (!portal->query(q) || !portal->fetchRow())
4921
cs.resX(portal->getDouble("res_x"));
4922
cs.resY(portal->getDouble("res_y"));
4924
portal->freeResult();
4926
q = "SELECT * FROM " + table;
4928
q += " WHERE object_id = '" + geoid +"'";
4931
if (!portal->query(q) || !portal->fetchRow())
4941
flag = portal->fetchGeometry(cell);
4950
TeDatabase::selectCellSet (const int& layerId, const string& table, const string& criteria, TeCellSet &cs)
4952
TeDatabasePortal* portal = this->getPortal();
4953
string q = "SELECT * FROM te_representation WHERE layer_id = " ;
4954
q += Te2String(layerId) + " AND geom_type = " + Te2String(TeCELLS);
4956
if (!portal->query(q) || !portal->fetchRow())
4962
cs.resX(portal->getDouble("res_x"));
4963
cs.resY(portal->getDouble("res_y"));
4964
portal->freeResult();
4966
q ="SELECT * FROM " + table;
4967
if (!criteria.empty())
4968
q += " WHERE " + criteria;
4970
if (!portal->query(q) || !portal->fetchRow())
4980
flag = portal->fetchGeometry(cell);
4989
TeDatabase::updateCell(const string& /* table */, TeCell &c)
4994
sql = "UPDATE table SET ";
4995
sql += "lower_x=" + Te2String(b.lowerLeft().x(),15) + ", ";
4996
sql += "lower_y=" + Te2String(b.lowerLeft().y(),15) + ", ";
4997
sql += "upper_x=" + Te2String(b.upperRight().x(),15) + ", ";
4998
sql += "upper_y=" + Te2String(b.upperRight().y(),15) + ", ";
4999
sql += "col_number=" + Te2String(c.column()) + ", ";
5000
sql += "row_number=" + Te2String(c.line());
5001
sql += " WHERE geom_id = " + c.geomId();
5002
return (this->execute(sql));
5006
TeDatabase::locateCell (const string& table, TeCoord2D &pt, TeCell &cell, const double& /* tol */)
5008
TeDatabasePortal* portal = this->getPortal();
5009
string q ="SELECT * FROM " + table;
5011
sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
5012
pt.x(),pt.x(),pt.y(),pt.y());
5014
if (!portal->query(q) || !portal->fetchRow())
5019
portal->fetchGeometry(cell);
5025
TeDatabase::inClauseValues(const string& query, const string& /* attribute */, vector<string>& inClauseVector)
5027
inClauseVector.push_back( "(" + query + ")" );
5032
//retornam um portal
5035
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabasePortal *portal, int relate, const string& actCollTable)
5037
return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, portal, relate, actCollTable));
5041
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal, int relate, const string& visCollTable)
5043
return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, portal, relate, visCollTable));
5047
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, TeDatabasePortal *portal, int relate, const string& actCollTable)
5049
return (TeTopologicalRelation(actGeomTable, actRep, geom, portal, relate, actCollTable));
5052
//retornam um vetor de object_ids resultantes da consulta
5054
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, Keys& actIdsOut, int relate, const string& actCollTable)
5056
return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, actIdsOut, this, relate, actCollTable));
5060
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, int relate, const string& visCollTable)
5062
return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, visIdsOut, this, relate, visCollTable));
5066
TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, Keys& actIdsOut, int relate, const string& actCollTable)
5068
return (TeTopologicalRelation(actGeomTable, actRep, geom, actIdsOut, this, relate, actCollTable));
5073
TeDatabase::calculateArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &area)
5075
return (TeGetArea(actGeomTable, actRep, actIdsIn, this, area));
5079
TeDatabase::calculateLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn , double& length )
5081
return (TeGetLength(actGeomTable, actRep, actIdsIn, this, length));
5085
TeDatabase::calculateDistance(const string& actGeomTable, TeGeomRep actRep, Keys& Ids, double& distance)
5087
return (TeGetDistance(actGeomTable, actRep, Ids, this, distance));
5091
TeDatabase::calculateDistance(const string& /* actGeomTable */, TeGeomRep /*actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, double& /* distance */)
5097
TeDatabase::withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& coord, KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable)
5099
return (TeGetWithinDistance(actGeomTable, actRep, coord, IdsDistOut, this, max_distance, actCollTable));
5102
// functions that generate new geometry
5104
TeDatabase::Buffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& bufferSet, double dist)
5106
return (TeGetBuffer(actGeomTable, actRep, actIds, this, bufferSet, dist));
5110
TeDatabase::Centroid(const string& actGeomTable , TeGeomRep actRep, TePointSet& centroidSet, Keys actIds, const string& actCollTable)
5112
return (TeGetCentroid(actGeomTable, actRep, this, centroidSet, actIds, actCollTable));
5116
TeDatabase::ConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& convexHullSet)
5118
return (TeGetConvexHull(actGeomTable, actRep, actIds, this, convexHullSet));
5122
TeDatabase::nearestNeighbors(const string& /* actGeomTable */, const string& /* actCollTable */, TeGeomRep /* actRep */, const string& /* objId1 */, Keys& /* actIdsOut */, int /* numRes */)
5128
TeDatabase::nearestNeighbors(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, const string& /* visCollTable */, TeGeomRep /* visRep */, Keys& /* visIdsOut */, int /* numRes */)
5134
TeDatabase::nearestNeighbors(const string& /* actGeomTable */, const string& /* actCollTable */, TeGeomRep /* actRep */, const string& /* objId1 */, TeDatabasePortal* /* portal */, int /* numRes */)
5140
TeDatabase::nearestNeighbors(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, const string& /* visCollTable */, TeGeomRep /* visRep */, TeDatabasePortal* /* portal */, int /* numRes */)
5146
TeDatabase::geomIntersection(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect)
5148
return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeINTERSECTION));
5152
TeDatabase::geomIntersection(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
5158
TeDatabase::geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& objId2, TeGeometryVect& geomVect)
5161
actIds.push_back(objId1);
5162
actIds.push_back(objId2);
5164
return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeDIFFERENCE));
5169
TeDatabase::geomDifference(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
5175
TeDatabase::geomUnion(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect)
5177
return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeUNION));
5181
TeDatabase::geomUnion(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
5187
TeDatabase::geomXOr(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
5193
TeDatabase::geomXOr(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
5198
// Operation with Image
5201
TeDatabase::Zonal(const string& rasterTable, const string& actGeomTable, Keys& Ids, TeObjectStatistics& result)
5203
TeDatabasePortal* portal=getPortal();
5207
//recuperar o raster!!!
5208
string sql = "SELECT layer_id FROM te_representation";
5209
sql += " WHERE geom_table = '" + rasterTable +"'";
5210
if(!portal->query(sql) || !portal->fetchRow())
5216
int layerId = atoi(portal->getData(0));
5217
TeRaster* raster = loadLayerRaster(layerId);
5219
//recuperar as geometrias
5220
portal->freeResult();
5222
string objIds = getStringIds(Ids);
5223
sql = "SELECT * FROM "+ actGeomTable;
5224
sql+= " WHERE object_id IN ("+ objIds +")";
5226
if(!portal->query(sql) || !portal->fetchRow())
5236
flag = portal->fetchGeometry(poly);
5238
TeStatisticsDimensionVect st;
5240
TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
5241
TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
5243
if(!TeCalculateStatistics (itBegin, itEnd, st))
5249
result[poly.objectId()] = st;
5260
TeDatabase::Zonal(const string& rasterTable, const string& actGeomTable, const string& actCollTable, TeObjectStatistics& result)
5262
TeDatabasePortal* portal=getPortal();
5266
//recuperar o raster
5267
string sql = "SELECT layer_id FROM te_representation";
5268
sql += " WHERE geom_table = '" + rasterTable +"'";
5269
if(!portal->query(sql) || !portal->fetchRow())
5275
int layerId = atoi(portal->getData(0));
5276
TeRaster* raster = loadLayerRaster(layerId);
5278
//recuperar as geometrias
5279
portal->freeResult();
5281
sql = "SELECT * FROM "+ actGeomTable;
5283
if(!actCollTable.empty())
5285
sql += " ,"+ actCollTable;
5286
sql += " WHERE object_id = c_object_id ";
5289
if(!portal->query(sql) || !portal->fetchRow())
5299
flag = portal->fetchGeometry(poly);
5301
TeStatisticsDimensionVect st;
5303
TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
5304
TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
5306
if(!TeCalculateStatistics (itBegin, itEnd, st))
5311
result[poly.objectId()] = st;
5322
TeDatabase::Zonal(const string& rasterTable, TePolygon& poly, TeStatisticsDimensionVect& result)
5324
TeDatabasePortal* portal=getPortal();
5328
//recuperar o raster!!!
5329
string sql = "SELECT layer_id FROM te_representation";
5330
sql += " WHERE geom_table = '" + rasterTable +"'";
5331
if(!portal->query(sql) || !portal->fetchRow())
5337
int layerId = atoi(portal->getData(0));
5338
TeRaster* raster = loadLayerRaster(layerId);
5342
TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
5343
TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
5345
if(!TeCalculateStatistics (itBegin, itEnd, result))
5354
TeDatabase::Mask(const string& rasterTable, const string& actGeomTable, const string& objId, const string& nameLayerOut, TeStrategicIterator st)
5356
TeDatabasePortal* portal=getPortal();
5360
//recuperar o raster!!!
5361
string sql = "SELECT layer_id FROM te_representation";
5362
sql += " WHERE geom_table = '" + rasterTable +"'";
5363
if(!portal->query(sql) || !portal->fetchRow())
5369
int layerId = atoi(portal->getData(0));
5370
TeRaster* raster = loadLayerRaster(layerId);
5372
//recuperar a geometria
5373
portal->freeResult();
5375
sql = "SELECT * FROM "+ actGeomTable;
5376
sql+= " WHERE object_id = '" + objId + "'";
5378
if(!portal->query(sql) || !portal->fetchRow())
5385
portal->fetchGeometry(poly);
5387
TeRaster* rasterOut = TeMask (raster, poly, st);
5388
TeRasterParams param = rasterOut->params();
5390
TeBox b = param.boundingBox();
5391
TeLayer* layer = new TeLayer(nameLayerOut,this, b , rasterOut->projection());
5392
bool status = TeImportRaster(layer,rasterOut, param.blockWidth_, param.blockHeight_, param.compression_[0]);
5403
TeDatabase::Mask(const string& rasterTable, TePolygon& poly, const string& nameLayerOut, TeStrategicIterator st)
5405
TeDatabasePortal* portal=getPortal();
5409
//recuperar o raster!!!
5410
string sql = "SELECT layer_id FROM te_representation";
5411
sql += " WHERE geom_table = '" + rasterTable +"'";
5412
if(!portal->query(sql) || !portal->fetchRow())
5418
int layerId = atoi(portal->getData(0));
5419
TeRaster* raster = loadLayerRaster(layerId);
5423
TeRaster* rasterOut = TeMask (raster, poly, st);
5424
TeRasterParams param = rasterOut->params();
5426
TeBox b = param.boundingBox();
5427
TeLayer* layer = new TeLayer(nameLayerOut,this, b , rasterOut->projection());
5428
bool status = TeImportRaster(layer,rasterOut, param.blockWidth_, param.blockHeight_, param.compression_[0]);
5437
TeDatabase::getSQLBoxWhere (TeBox &box, TeGeomRep rep)
5440
string lowerX, lowerY, upperX, upperY;
5441
if(rep == TePOLYGONS || rep == TeLINES || rep == TeCELLS || rep == TeRASTER)
5448
else if(rep == TePOINTS || rep == TeTEXT)
5456
wherebox = "NOT("+ lowerX +" >= " + Te2String(box.x2_, 12) + " OR ";
5457
wherebox += upperX +" <= " + Te2String(box.x1_, 12) + " OR ";
5458
wherebox += lowerY +" >= " + Te2String(box.y2_, 12) + " OR ";
5459
wherebox += upperY +" <= " + Te2String(box.y1_, 12) + ")";
5466
TeDatabase::getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep /* rep1 */)
5470
if(rep2 == TePOLYGONS || rep2 == TeLINES || rep2 == TeCELLS || rep2 == TeRASTER)
5472
wherebox = " NOT( ";
5473
wherebox += table2 +".lower_x > "+ table1 +".upper_x OR ";
5474
wherebox += table2 +".upper_x < "+ table1 +".lower_x OR ";
5475
wherebox += table2 +".lower_y > "+ table1 +".upper_y OR ";
5476
wherebox += table2 +".upper_y < "+ table1 +".lower_y )";
5478
else if(rep2 == TePOINTS || rep2 == TeTEXT)
5480
wherebox = " NOT( ";
5481
wherebox += table2 +".x > "+ table1 +".upper_x OR ";
5482
wherebox += table2 +".x < "+ table1 +".lower_x OR ";
5483
wherebox += table2 +".y > "+ table1 +".upper_y OR ";
5484
wherebox += table2 +".y < "+ table1 +".lower_y )";
5492
TeDatabase::getSQLBoxSelect (const string& tableName, TeGeomRep /* rep */)
5494
string sql = tableName +".* ";
5500
TeDatabase::getSQLStatistics (TeGroupingAttr& attrs)
5505
TeGroupingAttr::iterator it = attrs.begin();
5507
while(it != attrs.end())
5512
switch ((*it).second)
5515
sql += virg +" SUM( "+ (*it).first.name_ +") AS SUM_"+ Te2String(count);
5516
(*it).second = TeNOSTATISTIC;
5520
sql += virg +" MAX( "+ (*it).first.name_ +") AS MAX_"+ Te2String(count);
5521
(*it).second = TeNOSTATISTIC;
5525
sql += virg +" MIN( "+ (*it).first.name_ +") AS MIN_"+ Te2String(count);
5526
(*it).second = TeNOSTATISTIC;
5530
sql += virg +" COUNT( "+ (*it).first.name_ +") AS COUNT_"+ Te2String(count);
5531
(*it).second = TeNOSTATISTIC;
5535
sql += virg +" AVG( "+ (*it).first.name_ +") AS AVG_"+ Te2String(count);
5536
(*it).second = TeNOSTATISTIC;
5548
TeDatabase::getSQLAutoNumber(const string& /* table */)
5554
TeDatabase::getSQLTemporalWhere (TeTimeInterval& timeInterval, TeTemporalRelation timeOperator, const string& initialTime, const string& finalTime)
5557
string t1 = getSQLTime(timeInterval.getT1());
5558
string t2 = getSQLTime(timeInterval.getT2());
5560
switch(timeOperator)
5563
sql = finalTime +" < "+ t1;
5566
sql = initialTime +" > "+ t2;
5569
sql = "( "+ initialTime +" >= "+ t1;
5570
sql += " AND "+ initialTime +" <= "+ t2 +" )";
5571
if (initialTime != finalTime)
5574
sql += "( "+ finalTime +" >= "+ t1;
5575
sql += " AND "+ finalTime +" <= "+ t2 +" )";
5580
sql = finalTime +" = "+ t1;
5581
sql += " OR "+ initialTime +" = "+ t2;
5585
sql = initialTime +" >= "+ t1;
5586
sql += " AND "+ initialTime +" <= "+ t2;
5587
if (initialTime != finalTime)
5589
sql += " AND "+ finalTime +" >= "+ t1;
5590
sql += " AND "+ finalTime +" <= "+ t2;
5594
case TeTIMEOVERLAPS:
5595
sql = "( "+ initialTime +" < "+ t1;
5596
sql += " AND "+ finalTime +" > "+ t1;
5597
sql += " AND "+ finalTime +" < "+ t2 +" )";
5599
sql += "( "+ initialTime +" > "+ t1;
5600
sql += " AND "+ initialTime +" < "+ t2;
5601
sql += " AND "+ finalTime +" > "+ t2 +" )";
5605
sql = finalTime +" = "+ t2;
5609
sql = initialTime +" = "+ t1;
5620
TeDatabase::getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel,
5621
const string& initialTime, const string& finalTime)
5623
//rever os chronons definidos - alterar o parser para restriļæ½ļæ½o temporal
5627
case TeSECONDOFMINUTE:
5631
case TeMINUTEOFHOUR:
5662
sql = func +"("+ finalTime +") < "+ Te2String(time1);
5666
sql = func +"("+ initialTime +") > "+ Te2String(time2);
5670
sql = func +"("+ initialTime +") = "+ Te2String(time1);
5671
sql += " AND "+ func +"(" + finalTime +") = "+ Te2String(time2);
5675
sql = func +"("+ finalTime +") = "+ Te2String(time1);
5676
sql += " OR "+ func +"(" + initialTime +") = "+ Te2String(time2);
5680
sql = func +"("+ initialTime +") >= "+ Te2String(time1);
5681
sql += " AND "+ func +"("+ initialTime +") <= "+ Te2String(time2);
5682
sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time1);
5683
sql += " AND "+ func +"("+ finalTime +") <= "+ Te2String(time2);
5686
case TeTIMEOVERLAPS:
5687
sql = "("+ func +"("+ initialTime +") <= "+ Te2String(time1);
5688
sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time1);
5689
sql += " AND "+ func +"("+ finalTime +") <= "+ Te2String(time2) +")";
5691
sql += "("+ func +"("+ initialTime +") >= "+ Te2String(time1);
5692
sql += " AND "+ func +"("+ initialTime +") <= "+ Te2String(time2);
5693
sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time2) +")";
5697
sql = func +"("+ finalTime +") = "+ Te2String(time2);
5701
sql = func +"("+ initialTime +") = "+ Te2String(time1);
5711
TeDatabase::getSQLTemporalWhere (const string& temporalRest)
5713
string result, tableName, initialCol, finalCol, time1, time2, mask;
5714
TeTemporalRelation rel;
5717
string temp = temporalRest;
5724
int pos = temp.find (";");
5732
element = temp.substr(0, pos);
5733
temp = temp.substr (pos+1);
5736
if(cont==0) //table name
5737
tableName = element;
5738
else if(cont==1) //column name (initial time)
5739
initialCol = element;
5740
else if(cont==2) //column name (final time)
5742
else if(cont==3) //TeTemporalRelation
5744
if(element=="TeTIMEEQUAL")
5746
else if (element=="TeTIMEBEFORE")
5748
else if (element=="TeTIMEAFTER")
5750
else if (element=="TeTIMEMEETS")
5752
else if (element=="TeTIMEDURING")
5754
else if (element=="TeTIMEOVERLAPS")
5755
rel = TeTIMEOVERLAPS;
5756
else if (element=="TeTIMEENDS")
5758
else if (element=="TeTIMESTARTS")
5761
else if(cont==4) //time 1
5763
else if(cont==5) //time 2
5772
else if(cont==7) //TeChronon
5774
if (element=="TeSECOND")
5776
else if (element=="TeMINUTE")
5778
else if (element=="TeHOUR")
5780
else if (element=="TeDAY")
5782
else if (element=="TeMONTH")
5784
else if (element=="TeYEAR")
5786
else if (element=="TeDAYOFWEEK")
5787
chronon = TeDAYOFWEEK;
5788
else if (element=="TeMONTHOFYEAR")
5789
chronon = TeMONTHOFYEAR;
5790
else if (element=="TeSEASON")
5792
else if (element=="TeWEEKOFYEAR")
5793
chronon = TeWEEKOFYEAR;
5799
int posMask = mask.find ("s");
5802
result = " "+ getSQLTemporalWhere(atoi(time1.c_str()), atoi(time2.c_str()), chronon, rel, (tableName+"."+initialCol), (tableName+"."+finalCol)) +" ";
5806
TeTimeInterval interval(time1, time2, chronon, mask);
5807
result = " "+ getSQLTemporalWhere(interval, rel, (tableName+"."+initialCol), (tableName+"."+finalCol)) + " ";
5815
TeDatabase::getSQLTemporalFunction (TeChronon chr, const string& colName)
5821
func = " year ("+ colName +")";
5824
case TeMONTH: // Fev/2003 != Fev/2004
5825
func = " year ("+ colName +"), month ("+ colName +") ";
5828
case TeMONTHOFYEAR: // Fev/2003 == Fev/2004
5829
func = " month ("+ colName +")";
5832
case TeDAY: // 01/01/2003 != 01/01/2004 != 01/02/2004
5833
func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +") ";
5836
case TeDAYOFMONTH: // 01/01/2003 == 01/01/2004 == 01/02/2004
5837
func = " day("+ colName +") ";
5840
case TeDAYOFYEAR: // 01/01/2003 == 01/01/2004 != 01/02/2004
5841
func = " month ("+ colName +"), day("+ colName +") ";
5844
case TeDAYOFWEEK: // 01/01/2003 != 01/01/2004 != 01/02/2004
5845
func = " weekday ("+ colName +") ";
5848
case TeHOUR: // 01/01/2003 10:00 != 01/01/2004 10:00 != 01/02/2004 10:00
5849
func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +") ";
5852
case TeHOUROFDAY: // 01/01/2003 10:00 == 01/01/2004 10:00 == 01/02/2004 10:00
5853
func = " hour ("+ colName +")";
5856
case TeMINUTE: // 01/01/2003 10:30 != 01/01/2004 10:30 != 01/02/2004 10:30
5857
func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +"), minute("+ colName +") ";
5860
case TeMINUTEOFHOUR: // 01/01/2003 10:30 == 01/01/2004 10:30 == 01/02/2004 10:30 != 01/02/2004 10:31
5861
func = " minute("+ colName +") ";
5864
case TeSECOND: // 01/01/2003 10:30:04 != 01/01/2004 10:30:04 != 01/02/2004 10:30:04
5865
func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +"), minute("+ colName +"), second("+ colName +") ";
5868
case TeSECONDOFMINUTE: // 01/01/2003 10:30:04 == 01/01/2004 10:30:04 == 01/02/2004 10:30:04 != 01/02/2004 10:30:07
5869
func = " second("+ colName +") ";
5881
TeDatabase::getMBRGeom(string tableGeom, string object_id, TeBox& box, string /* colGeom */)
5883
double xmin = TeMAXFLOAT;
5884
double xmax = -TeMAXFLOAT;
5885
double ymin = TeMAXFLOAT;
5886
double ymax = -TeMAXFLOAT;
5888
TeDatabasePortal* portal = getPortal();
5892
string sel = "SELECT lower_x, upper_x, lower_y, upper_y FROM " + tableGeom;
5893
sel += " WHERE object_id = '" + object_id + "'";
5895
if(!portal->query(sel))
5901
bool b = portal->fetchRow();
5910
xmin = MIN(xmin, portal->getDouble(0));
5911
xmax = MAX(xmax, portal->getDouble(1));
5912
ymin = MIN(ymin, portal->getDouble(2));
5913
ymax = MAX(ymax, portal->getDouble(3));
5914
b = portal->fetchRow();
5917
TeBox bb(xmin, ymin, xmax, ymax);
5924
TeDatabase::getMBRSelectedObjects(string /* geomTable */,string /* colGeom */, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType,TeBox &bout, const double& tol)
5928
bool status = false;
5933
TeDatabasePortal* portal = this->getPortal();
5940
fields = "MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y)";
5941
query = " SELECT " + fields;
5942
query += " FROM " + fromClause;
5943
if (!whereClause.empty())
5944
query += " WHERE " + whereClause;
5945
if (!afterWhereClause.empty())
5946
query += afterWhereClause;
5948
if (portal->query (query))
5950
bool b = portal->fetchRow();
5953
string vxmin = portal->getData(0);
5954
string vymin = portal->getData(1);
5955
string vxmax = portal->getData(2);
5956
string vymax = portal->getData(3);
5957
if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
5959
b = portal->fetchRow();
5962
double xmin = atof(vxmin.c_str());
5963
double ymin = atof(vymin.c_str());
5964
double xmax = atof(vxmax.c_str());
5965
double ymax = atof(vymax.c_str());
5966
TeBox ibox(xmin, ymin, xmax, ymax);
5967
updateBox (bout, ibox);
5968
b = portal->fetchRow();
5976
fields = "MIN(x), MIN(y), MAX(x), MAX(y)";
5977
query = " SELECT " + fields;
5978
query += " FROM " + fromClause;
5979
if (!whereClause.empty())
5980
query += " WHERE " + whereClause;
5981
if (!afterWhereClause.empty())
5982
query += afterWhereClause;
5984
if (portal->query (query))
5986
bool b = portal->fetchRow();
5989
string vxmin = portal->getData(0);
5990
string vymin = portal->getData(1);
5991
string vxmax = portal->getData(2);
5992
string vymax = portal->getData(3);
5993
if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
5995
b = portal->fetchRow();
5998
double xmin = atof(vxmin.c_str());
5999
double ymin = atof(vymin.c_str());
6000
double xmax = atof(vxmax.c_str());
6001
double ymax = atof(vymax.c_str());
6005
ibox.x1_ = xmin - tol;
6006
ibox.x2_ = xmax + tol;
6013
ibox.y1_ = ymin - tol;
6014
ibox.y2_ = ymax + tol;
6020
updateBox (bout, ibox);
6021
b = portal->fetchRow();
6040
TeDatabase::getAttributeList(const string& tableName,TeAttributeList& attList)
6042
TeDatabasePortal* portal = this->getPortal();
6046
string sql = "SELECT * FROM " + tableName + " WHERE 1=2";
6047
if (!portal->query(sql))
6053
attList = portal->AttributeList();
6059
TeDatabase::getThemeBox(TeTheme* theme)
6065
string colTabName = theme->collectionTable();
6066
if (colTabName.empty())
6070
TeLayer* layer = theme->layer();
6072
if (layer->hasGeometry(TePOINTS))
6074
geomTable = layer->tableName(TePOINTS);
6075
sqlfrom = colTabName + " LEFT JOIN " + geomTable;
6076
sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
6078
if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TePOINTS,bpt))
6081
if (layer->hasGeometry(TeLINES))
6083
geomTable = layer->tableName(TeLINES);
6084
sqlfrom = colTabName + " LEFT JOIN " + geomTable;
6085
sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
6087
if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TeLINES,bln))
6090
if (layer->hasGeometry(TePOLYGONS))
6092
geomTable = layer->tableName(TePOLYGONS);
6093
sqlfrom = colTabName + " LEFT JOIN " + geomTable;
6094
sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
6096
if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TePOLYGONS,bpol))
6100
if (layer->hasGeometry(TeCELLS))
6102
geomTable = layer->tableName(TeCELLS);
6103
sqlfrom = colTabName + " LEFT JOIN " + geomTable;
6104
sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
6106
if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TeCELLS,bpol))
6112
bool TeDatabase::insertRasterVisual (int themeId , TeRasterVisual* vis)
6114
TeRasterTransform::TeRasterTransfFunctions tf = vis->getTransfFunction();
6116
if (tf == TeRasterTransform::TeNoTransf)
6119
string sql = "DELETE FROM te_visual_raster WHERE theme_id = " + Te2String(themeId);
6120
if (!this->execute(sql))
6123
if (tf == TeRasterTransform::TeMono2Three ||
6124
tf == TeRasterTransform::TePall2Three ||
6125
tf == TeRasterTransform::TeLUT2Three)
6127
sql = "INSERT INTO te_visual_raster (theme_id, band_in, transf_type) VALUES (";
6128
sql += Te2String(themeId) + "," + Te2String(vis->getSrcBand()) + ",";
6129
sql += Te2String(static_cast<short>(tf)) + ")";
6130
if (!this->execute(sql))
6135
if (tf == TeRasterTransform::TeExtractBand)
6137
sql = "INSERT INTO te_visual_raster (theme_id, band_in, band_out, transf_type) VALUES (";
6138
sql += Te2String(themeId) + "," + Te2String(vis->getSrcBand()) + ",";
6139
sql += Te2String(vis->getDestBand()) + "," + Te2String(static_cast<short>(tf))+ ")";
6140
if (!this->execute(sql))
6145
if (tf == TeRasterTransform::TeExtractBands || tf == TeRasterTransform::TeExtractRGB)
6147
map<TeRasterTransform::TeRGBChannels,short>& RGBmap = vis->getRGBMap();
6148
map<TeRasterTransform::TeRGBChannels,short>::iterator it = RGBmap.begin();
6149
while (it != RGBmap.end())
6151
sql = "INSERT INTO te_visual_raster (theme_id, band_in, band_out, transf_type) VALUES (";
6152
sql += Te2String(themeId) + "," + Te2String(static_cast<short>(it->second)) + ",";
6153
sql += Te2String(static_cast<short>(it->first)) + "," + Te2String(static_cast<short>(tf))+ ")";
6154
if (!this->execute(sql))
6165
TeDatabase::locateLineSet (const string& table, TeCoord2D &pt, TeLineSet &ls, const double& tol)
6168
TeDatabasePortal* portal = this->getPortal();
6170
TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
6171
string q ="SELECT * FROM " + table;
6173
sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
6174
box.x2(),box.x1(),box.y2(),box.y1());
6176
if (!portal->query(q) || !portal->fetchRow())
6192
flag = portal->fetchGeometry( l );
6194
if(TeNearest(pt,tmp,index,pout,dist,tol))
6207
TeDatabase::locatePointSet (const string& table, TeCoord2D &pt, TePointSet &pointSet, const double& tol)
6211
TeDatabasePortal* portal = this->getPortal();
6213
TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
6214
string q ="SELECT * FROM " + table;
6216
sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
6217
box.x2(),box.x1(),box.y2(),box.y1());
6220
if (!portal->query(q) || !portal->fetchRow())
6230
flag = portal->fetchGeometry (point);
6231
pointSet.add ( point );
6241
TeDatabase::locateTextSet (const string& table, TeCoord2D &pt, TeTextSet& textSet, const double& tol)
6245
TeDatabasePortal* portal = this->getPortal();
6247
TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
6248
string q ="SELECT * FROM " + table;
6250
sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
6251
box.x2(),box.x1(),box.y2(),box.y1());
6253
if (!portal->query(q) || !portal->fetchRow())
6258
// Look for all texts
6264
flag = portal->fetchGeometry(p);
6274
// End TeDatabase Methods
6276
// Begin TeDatabasePortal Methods
6278
TeDatabasePortal::TeDatabasePortal():
6286
TeDatabasePortal::~TeDatabasePortal ()
6291
TeDatabasePortal::getDouble (int i)
6293
char* val = getData(i);
6298
TeDatabasePortal::getDouble (const string& s)
6300
char* val = getData(s);
6305
TeDatabasePortal::getInt (int i)
6307
char* val = getData(i);
6312
TeDatabasePortal::getInt (const string& s)
6314
char* val = getData(s);
6319
TeDatabasePortal::fetchGeometry (TeCell& cell)
6321
int index = atoi(getData("geom_id"));
6322
string object_id = getData("object_id");
6323
TeBox b (atof(getData("lower_x")),atof(getData("lower_y")),atof(getData("upper_x")),atof(getData("upper_y")));
6325
cell.objectId(object_id);
6327
cell.column(atoi(getData("col_number")));
6328
cell.line(atoi(getData("row_number")));
6329
return (fetchRow());
6332
TeAttribute TeDatabasePortal::getAttribute (int i)
6334
TeAttributeList::iterator it = attList_.begin();
6336
while ( it != attList_.end() )
6343
return TeAttribute();
6346
TeAttribute TeDatabasePortal::getAttribute (const string& s)
6348
TeAttributeList::iterator it = attList_.begin();
6349
while ( it != attList_.end() )
6351
if (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_))
6355
return TeAttribute();
6359
TeDatabasePortal::getColumnIndex (const string& s)
6361
TeAttributeList::iterator it = attList_.begin();
6363
while ( it != attList_.end() )
6365
if (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_))
6374
TeDatabasePortal::getColumnName (int i)
6376
TeAttributeList::iterator it = attList_.begin();
6378
while ( it != attList_.end() )
6381
return (*it).rep_.name_;
6390
TeDatabasePortal::getViewTree ()
6392
TeViewTree *tree = new TeViewTree();
6393
tree->id (atoi(getData("theme_id")));
6394
tree->name (getData("name"));
6395
tree->priority(atoi(getData("priority")));
6400
TeDatabasePortal::getLegend ()
6403
leg.id (atoi(getData("legend_id")));
6404
leg.theme (atoi(getData("theme_id")));
6405
leg.group (atoi(getData("group_id")));
6408
data = getData("num_objs");
6409
leg.count(atoi(data.c_str()));
6410
data = getData("lower_value");
6412
data = getData("upper_value");
6414
data = getData("label");
6420
TeDatabasePortal::getVisual()
6423
TeGeomRep rep = (TeGeomRep)atoi (getData("geom_type"));
6425
TeColor cor(atoi(getData("red")),atoi(getData("green")),atoi(getData("blue")));
6427
vis.libName (string(getData("lib_name")));
6428
vis.transparency(atoi(getData("transparency")));
6430
TeColor ccor(atoi(getData("contour_red")),atoi(getData("contour_green")),atoi(getData("contour_blue")));
6431
vis.contourColor(ccor);
6432
vis.contourLibName(string(getData("contour_lib_name")));
6433
vis.contourWidth(atoi(getData("contour_width")));
6434
vis.contourTransparency(atoi(getData("contour_transp")));
6436
if(rep == TePOLYGONS || rep == TeCELLS)
6438
vis.contourWidth(atoi(getData("width")));
6439
vis.contourStyle(atoi(getData("contour_symb_id")));
6440
vis.style(atoi(getData("symb_id")));
6442
else if(rep == TeLINES)
6444
vis.width(atoi(getData("width")));
6445
vis.style(atoi(getData("symb_id")));
6447
else if(rep == TePOINTS)
6449
vis.size(atoi(getData("size_value")));
6450
vis.style(atoi(getData("symb_id")));
6452
else if(rep == TeTEXT)
6453
vis.size(atoi(getData("size_value")));
6455
vis.family(getData("family"));
6456
vis.bold (getBool("bold"));
6457
vis.italic (getBool("italic"));
6458
vis.fixedSize (getBool("fixed_size"));
6460
vis.alignmentVert(getDouble("alignment_vert"));
6461
vis.alignmentHoriz(getDouble("alignment_horiz"));
6463
vis.tabSize(atoi(getData("tab_size")));
6464
vis.lineSpace(atoi(getData("line_space")));
6469
TeDatabasePortal::fetchGeometry (TeText& t)
6471
TeCoord2D c(getDouble("x"), getDouble("y"));
6472
string txt = getData ("text_value");
6474
t2.geomId(atoi(getData("geom_id")));
6475
t2.objectId(string(getData("object_id")));
6476
t2.setAngle (getDouble("angle"));
6477
t2.setHeight (getDouble("height"));
6478
t2.setAlignmentVert(getDouble("alignment_vert"));
6479
t2.setAlignmentHoriz(getDouble("alignment_horiz"));
6481
return (fetchRow());
6485
TeDatabasePortal::getColor ()
6487
TeColor c(atoi(getData("red")), atoi(getData("green")), atoi(getData("blue")));
6492
TeDatabasePortal::fetchGeometry (TeArc& arc)
6494
arc.fromId(atoi(getData(2)));
6495
arc.toId(atoi(getData(3)));
6496
arc.geomId(atol(getData(0)));
6497
arc.objectId(string(getData(1)));
6503
// End TeDatabasePortal Methods