File: createTheme.cpp

package info (click to toggle)
libterralib 4.3.0%2Bdfsg.2-14
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 61,564 kB
  • sloc: cpp: 225,052; ansic: 31,562; makefile: 807; sh: 80; xml: 37
file content (198 lines) | stat: -rw-r--r-- 6,388 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/************************************************************************************
TerraLib - a library for developing GIS applications.
Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.

This code is part of the TerraLib library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

You should have received a copy of the GNU Lesser General Public
License along with this library.

The authors reassure the license terms regarding the warranties.
They specifically disclaim any warranties, including, but not limited to,
the implied warranties of merchantability and fitness for a particular purpose.
The library provided hereunder is on an "as is" basis, and the authors have no
obligation to provide maintenance, support, updates, enhancements, or modifications.
In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
indirect, special, incidental, or consequential damages arising out of the use
of this library and its documentation.
*************************************************************************************/

/* 
	This file illustrates how to create themes in a TerraLib database

	Authors: Karine Reis Ferreira and Lubia Vinhas  
*/

#include <TeLegendEntry.h>
#include <TeMySQL.h>


int main()
{
 	// Datatabase server parameters
	string host = "localhost";
	string dbname = "DB320RC1";
	string user = "root";
	string password = "vinhas";

	// Open a connection to the DB320RC1 MySQL database 
	TeDatabase* db = new TeMySQL();
	if (!db->connect(host, user, password, dbname))
	{
		cout << "Error: " << db->errorMessage() << endl;
		cout << endl << "Press Enter\n";
		getchar();
		return 1;
	}
	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;

	// Load the layer "Distritos" which contains data of the districts of the Sao Paulo city
	TeLayer* dist = new TeLayer("Distritos");
	if (!db->loadLayer(dist))
	{
		cout << "Fail to load the layer \"Distritos\": " << db->errorMessage() << endl;
		db->close();
		delete db;
		cout << endl << "Press Enter\n";
		getchar();
		return 1;
	}

	TeProjection* proj = TeProjectionFactory::make(dist->projection()->params()); 

	// Create a view with the same projection of the layer
	string viewName = "SaoPaulo";

	// Check whether there is a view with this name in the datatabase
	if (db->viewExist(viewName) == true)
	{
		cout << "There is already a view named \"SaoPaulo\" in the database\n";
		db->close();
		delete db;
		cout << endl << "Press Enter\n";
		getchar();
		return 1;
	}

	TeView* view = new TeView(viewName, user); 
	view->projection(proj);
	if (!db->insertView(view))		// save the view in the database
	{
		cout << "Fail to insert the view \"SaoPaulo\" into the database: " << db->errorMessage() << endl;
		db->close();
		delete db;
		cout << endl << "Press Enter\n";
		getchar();
		return 1;
	}

	// Create a theme that will contain all of the objects of the layer (no restrictions applied)
	TeTheme* theme = new TeTheme("DistritosSaoPaulo", dist);
	view->add(theme);
		
	// Set a default visual for the geometries of the objects of the layer 
	// Polygons will be set with the blue color
	TeColor color;
	color.init(0,0,255);
	TeVisual* polygonVisual = TeVisualFactory::make("tevisual");
	polygonVisual->color(color); 

	// Points will be set with the red color
	color.init(255,0,0);
	TeVisual* pointVisual = TeVisualFactory::make("tevisual");
	pointVisual->color(color);
   	pointVisual->style(TePtTypeX);

    theme->setVisualDefault(polygonVisual, TePOLYGONS);
    theme->setVisualDefault(pointVisual, TePOINTS);

	// Set all of the geometrical representations to be visible
	int allRep = dist->geomRep();
	theme->visibleRep(allRep);

	// Set the attribute tables of the theme equal the tables of the layer 
	theme->setAttTables(dist->attrTables());

	// Save the theme in the database
    if (!theme->save())	
    {
		cout << "Fail to save the theme \"DistritosSaoPaulo\" in the database: " << db->errorMessage() << endl;
		db->close();
		delete db;
		cout << endl << "Press Enter\n";
		getchar();
		return 1;
	}

	// Build the collection of objects associated to the theme
	if (!theme->buildCollection())
	{
		cout << "Fail to build the theme \"DistritosSaoPaulo\": " << db->errorMessage() << endl;
		db->close();
		delete db;
		cout << endl << "Press Enter\n";
		getchar();
		return 1;
	}
	cout << "The theme \"DistritosSaoPaulo\" was created without restrictions!\n";

	// Create a theme with the following attribute restriction:
	// Districts with population higher than 100,000 people
	TeTheme* themeRest = new TeTheme("Pop91GT100000", dist);
	themeRest->setAttTables (dist->attrTables());
	
	// Set the attribute restriction
	string restAttr = " Pop91 > 100000 ";
	themeRest->attributeRest(restAttr);

	// Set all of the geometrical representations to be visible
	themeRest->visibleRep(allRep);

	TeVisual* polygonVisual2 = TeVisualFactory::make("tevisual");
	polygonVisual2->color(color); 

   	TeVisual* pointVisual2 = TeVisualFactory::make("tevisual");
	pointVisual2->color(color);
   	pointVisual2->style(TePtTypeX);

	// Set the visual
	themeRest->setVisualDefault(polygonVisual2, TePOLYGONS);
	themeRest->setVisualDefault(pointVisual2, TePOINTS);

	// Insert the theme into the view
	view->add(themeRest);

	// Save the theme in the database
	if (!themeRest->save())
    {
		cout << "Fail to save the theme \"Pop91GT100000\" in the database: " << db->errorMessage() << endl;
		db->close();
		delete db;
		cout << endl << "Press Enter\n";
		getchar();
		return 1;
	}

	// Build the collection of objects associated to the theme
	if (!themeRest->buildCollection())
	{
		cout << "Fail to build the theme \"Pop91GT100000\": " << db->errorMessage() << endl;
		db->close();
		delete db;
		cout << endl << "Press Enter\n";
		getchar();
		return 1;
	}

	cout << "The theme  \"Pop91GT100000\" was created with attribute restrictions!\n\n";
	delete db;
	cout << endl << "Press Enter\n";
   	getchar();
	return 0;
}