Commit bfdf8cd8e3875879a4dc953d96ea7809127960d0

Authored by Edmar Moretti
1 parent 881a50da

--no commit message

Showing 1 changed file with 943 additions and 943 deletions   Show diff stats
pacotes/tme/TME_Engine.php
@@ -21,672 +21,672 @@ @@ -21,672 +21,672 @@
21 21
22 class ThematicMap 22 class ThematicMap
23 { 23 {
24 - public $dataStore;  
25 - public $coordDecimals = 2;  
26 - public $engine = "";  
27 - public $logoline = "files/balloonlogo.png";  
28 - public $logo = 'files/logo.png';  
29 -  
30 - // Parameters  
31 - public $mapType = 'choropleth'; // choropleth / prism / symbol  
32 - public $symbolType; // image / polygon // collada  
33 - public $symbolShape;  
34 - public $mapTitle;  
35 - public $mapDescription;  
36 - public $mapSource;  
37 - public $showTitle = true;  
38 - public $showLegend = true;  
39 - public $showValues = false;  
40 - public $showNames = false;  
41 - public $timeType = 'year'; // year / series / slider  
42 - public $maxHeight = 2000000; // Prism / Bar 24 + public $dataStore;
  25 + public $coordDecimals = 2;
  26 + public $engine = "";
  27 + public $logoline = "files/balloonlogo.png";
  28 + public $logo = 'files/logo.png';
  29 +
  30 + // Parameters
  31 + public $mapType = 'choropleth'; // choropleth / prism / symbol
  32 + public $symbolType; // image / polygon // collada
  33 + public $symbolShape;
  34 + public $mapTitle;
  35 + public $mapDescription;
  36 + public $mapSource;
  37 + public $showTitle = true;
  38 + public $showLegend = true;
  39 + public $showValues = false;
  40 + public $showNames = false;
  41 + public $timeType = 'year'; // year / series / slider
  42 + public $maxHeight = 2000000; // Prism / Bar
43 public $symbolMaxSize; // Symbol$imgBrand 43 public $symbolMaxSize; // Symbol$imgBrand
44 - public $barSize = 50000;  
45 - public $maxValue;  
46 - public $minValue;  
47 -  
48 - public $indicatorID;  
49 - public $indicator;  
50 - public $year;  
51 - private $yearArray;  
52 -  
53 - // Colour parameters  
54 - public $colourType = 'scale'; // scale / single  
55 - public $startColour = 'FFFF99';  
56 - public $endColour = 'FF6600';  
57 - public $noDataColour = 'CCCCCC';  
58 - public $colour = 'FF6600';  
59 - public $opacity = 90;  
60 -  
61 - public $classification = 'unclassed'; // unclassed / equal / quantile  
62 - public $numClasses = 5;  
63 -  
64 - private $myColourScale; // Only choropleth/prism  
65 - private $startColourRGB; // Array  
66 - private $endColourRGB; // Array  
67 - private $deltaColour; // Array  
68 - private $kmlAlphaColour = 220;  
69 - private $colourLegendHeight = 350;  
70 - private $colourLegendWidth = 30;  
71 -  
72 - private $symbolVertices = 30; // Circle  
73 - private $showLabel = false;  
74 -  
75 - private $classBreaks; // Array  
76 - private $classColours; // Array  
77 -  
78 -  
79 - private $precision = 0; // Number of decimals  
80 -  
81 - //  
82 - // Constructor  
83 - // @access protected  
84 - //  
85 - function __construct($dataStore, $paramArray)  
86 - {  
87 - $this->dataStore = $dataStore;  
88 -  
89 - // Mandatory parameters 44 + public $barSize = 50000;
  45 + public $maxValue;
  46 + public $minValue;
  47 +
  48 + public $indicatorID;
  49 + public $indicator;
  50 + public $year;
  51 + private $yearArray;
  52 +
  53 + // Colour parameters
  54 + public $colourType = 'scale'; // scale / single
  55 + public $startColour = 'FFFF99';
  56 + public $endColour = 'FF6600';
  57 + public $noDataColour = 'CCCCCC';
  58 + public $colour = 'FF6600';
  59 + public $opacity = 90;
  60 +
  61 + public $classification = 'unclassed'; // unclassed / equal / quantile
  62 + public $numClasses = 5;
  63 +
  64 + private $myColourScale; // Only choropleth/prism
  65 + private $startColourRGB; // Array
  66 + private $endColourRGB; // Array
  67 + private $deltaColour; // Array
  68 + private $kmlAlphaColour = 220;
  69 + private $colourLegendHeight = 350;
  70 + private $colourLegendWidth = 30;
  71 +
  72 + private $symbolVertices = 30; // Circle
  73 + private $showLabel = false;
  74 +
  75 + private $classBreaks; // Array
  76 + private $classColours; // Array
  77 +
  78 +
  79 + private $precision = 0; // Number of decimals
  80 +
  81 + //
  82 + // Constructor
  83 + // @access protected
  84 + //
  85 + function __construct($dataStore, $paramArray)
  86 + {
  87 + $this->dataStore = $dataStore;
  88 +
  89 + // Mandatory parameters
90 $this->mapType = $paramArray['mapType']; // Mapping technique 90 $this->mapType = $paramArray['mapType']; // Mapping technique
91 $this->indicatorID = $paramArray['indicator']; // Main indicator 91 $this->indicatorID = $paramArray['indicator']; // Main indicator
92 $this->year = $paramArray['year']; // Year 92 $this->year = $paramArray['year']; // Year
93 $this->dirtmp = $paramArray['dirtmp']; 93 $this->dirtmp = $paramArray['dirtmp'];
94 - // Extract indicator metadata and values from dataStore  
95 - $this->indicator = $this->dataStore['indicators'][$this->indicatorID];  
96 - $this->minValue = $this->indicator['min'];  
97 - $this->maxValue = $this->indicator['max'];  
98 - $this->precision = $this->indicator['decimals'];  
99 -  
100 - // Optional parameters: mapTitle, mapDescription and source  
101 - if (isset($paramArray['mapTitle'])) $this->mapTitle = $paramArray['mapTitle'];  
102 - else $this->mapTitle = $this->indicator['name']; // Use default from indicator  
103 -  
104 - if (isset($paramArray['mapDescription'])) $this->mapDescription = $paramArray['mapDescription'];  
105 - else $this->mapDescription = $this->indicator['description']; // Use default from indicator  
106 -  
107 - if (isset($paramArray['mapSource'])) $this->mapSource = $paramArray['mapSource'];  
108 - else {  
109 - //$this->mapSource = 'Statistics from ' . $this->indicator['source']; // Use default from indicator  
110 - }  
111 -  
112 - // Other optional parameters  
113 - if (isset($paramArray['timeType'])) $this->timeType = $paramArray['timeType'];  
114 - if (isset($paramArray['showTitle'])) $this->showTitle = $paramArray['showTitle'];  
115 - if (isset($paramArray['showLegend'])) $this->showLegend = $paramArray['showLegend'];  
116 - if (isset($paramArray['colourType'])) $this->colourType = $paramArray['colourType'];  
117 - if (isset($paramArray['colour'])) $this->colour = $paramArray['colour'];  
118 - if (isset($paramArray['startColour'])) $this->startColour = $paramArray['startColour'];  
119 - if (isset($paramArray['endColour'])) $this->endColour = $paramArray['endColour'];  
120 - if (isset($paramArray['noDataColour'])) $this->noDataColour = $paramArray['noDataColour'];  
121 - if (isset($paramArray['showValues'])) $this->showValues = $paramArray['showValues'];  
122 - if (isset($paramArray['showNames'])) $this->showNames = $paramArray['showNames'];  
123 - if (isset($paramArray['symbolType'])) $this->symbolType = $paramArray['symbolType'];  
124 - if (isset($paramArray['symbolShape'])) $this->symbolShape = $paramArray['symbolShape'];  
125 - if (isset($paramArray['symbolMaxSize'])) $this->symbolMaxSize = $paramArray['symbolMaxSize'];  
126 - if (isset($paramArray['maxHeight'])) $this->maxHeight = $paramArray['maxHeight'];  
127 - if (isset($paramArray['barSize'])) $this->barSize = $paramArray['barSize'];  
128 - if (isset($paramArray['classification'])) $this->classification = $paramArray['classification'];  
129 - if (isset($paramArray['numClasses'])) $this->numClasses = $paramArray['numClasses'];  
130 -  
131 - if ($this->showValues || $this->showNames) {  
132 - $this->showLabel = true;  
133 - }  
134 -  
135 - if (isset($paramArray['opacity'])) {  
136 - $this->opacity = $paramArray['opacity'];  
137 - $this->kmlAlphaColour = 255 * $this->opacity / 100;  
138 - }  
139 -  
140 - // Make an array of available years  
141 - if ($this->timeType != 'year') $this->yearArray = $this->indicator['years'];  
142 - else $this->yearArray = array($this->year); // Only one year  
143 -  
144 -  
145 - }  
146 -  
147 -  
148 - //  
149 - // Constructor  
150 - // @access protected  
151 - //  
152 - function __deconstruct()  
153 - {  
154 - // What goes here?  
155 - }  
156 -  
157 -  
158 - //  
159 - // Function  
160 - // @access protected  
161 - //  
162 - public function getKML($url,$download = false)  
163 - {  
164 -  
165 - // Create KMZ archieve  
166 - $file = $this->dirtmp."/tme". time(). ".kmz";  
167 -  
168 - /*  
169 - $zip = new ZipArchive();  
170 - if ($zip->open($file, ZIPARCHIVE::CREATE)!==TRUE) {  
171 - exit("cannot open <$file>\n");  
172 - } 94 + // Extract indicator metadata and values from dataStore
  95 + $this->indicator = $this->dataStore['indicators'][$this->indicatorID];
  96 + $this->minValue = $this->indicator['min'];
  97 + $this->maxValue = $this->indicator['max'];
  98 + $this->precision = $this->indicator['decimals'];
  99 +
  100 + // Optional parameters: mapTitle, mapDescription and source
  101 + if (isset($paramArray['mapTitle'])) $this->mapTitle = $paramArray['mapTitle'];
  102 + else $this->mapTitle = $this->indicator['name']; // Use default from indicator
  103 +
  104 + if (isset($paramArray['mapDescription'])) $this->mapDescription = $paramArray['mapDescription'];
  105 + else $this->mapDescription = $this->indicator['description']; // Use default from indicator
  106 +
  107 + if (isset($paramArray['mapSource'])) $this->mapSource = $paramArray['mapSource'];
  108 + else {
  109 + //$this->mapSource = 'Statistics from ' . $this->indicator['source']; // Use default from indicator
  110 + }
  111 +
  112 + // Other optional parameters
  113 + if (isset($paramArray['timeType'])) $this->timeType = $paramArray['timeType'];
  114 + if (isset($paramArray['showTitle'])) $this->showTitle = $paramArray['showTitle'];
  115 + if (isset($paramArray['showLegend'])) $this->showLegend = $paramArray['showLegend'];
  116 + if (isset($paramArray['colourType'])) $this->colourType = $paramArray['colourType'];
  117 + if (isset($paramArray['colour'])) $this->colour = $paramArray['colour'];
  118 + if (isset($paramArray['startColour'])) $this->startColour = $paramArray['startColour'];
  119 + if (isset($paramArray['endColour'])) $this->endColour = $paramArray['endColour'];
  120 + if (isset($paramArray['noDataColour'])) $this->noDataColour = $paramArray['noDataColour'];
  121 + if (isset($paramArray['showValues'])) $this->showValues = $paramArray['showValues'];
  122 + if (isset($paramArray['showNames'])) $this->showNames = $paramArray['showNames'];
  123 + if (isset($paramArray['symbolType'])) $this->symbolType = $paramArray['symbolType'];
  124 + if (isset($paramArray['symbolShape'])) $this->symbolShape = $paramArray['symbolShape'];
  125 + if (isset($paramArray['symbolMaxSize'])) $this->symbolMaxSize = $paramArray['symbolMaxSize'];
  126 + if (isset($paramArray['maxHeight'])) $this->maxHeight = $paramArray['maxHeight'];
  127 + if (isset($paramArray['barSize'])) $this->barSize = $paramArray['barSize'];
  128 + if (isset($paramArray['classification'])) $this->classification = $paramArray['classification'];
  129 + if (isset($paramArray['numClasses'])) $this->numClasses = $paramArray['numClasses'];
  130 +
  131 + if ($this->showValues || $this->showNames) {
  132 + $this->showLabel = true;
  133 + }
  134 +
  135 + if (isset($paramArray['opacity'])) {
  136 + $this->opacity = $paramArray['opacity'];
  137 + $this->kmlAlphaColour = 255 * $this->opacity / 100;
  138 + }
  139 +
  140 + // Make an array of available years
  141 + if ($this->timeType != 'year') $this->yearArray = $this->indicator['years'];
  142 + else $this->yearArray = array($this->year); // Only one year
  143 +
  144 +
  145 + }
  146 +
  147 +
  148 + //
  149 + // Constructor
  150 + // @access protected
  151 + //
  152 + function __deconstruct()
  153 + {
  154 + // What goes here?
  155 + }
  156 +
  157 +
  158 + //
  159 + // Function
  160 + // @access protected
  161 + //
  162 + public function getKML($url,$download = false)
  163 + {
  164 +
  165 + // Create KMZ archieve
  166 + $file = $this->dirtmp."/tme". time(). ".kmz";
  167 +
  168 + /*
  169 + $zip = new ZipArchive();
  170 + if ($zip->open($file, ZIPARCHIVE::CREATE)!==TRUE) {
  171 + exit("cannot open <$file>\n");
  172 + }
173 */ 173 */
174 - include(__DIR__."/../kmlmapserver/classes/zip.class.php");  
175 - $zip = new zipfile();  
176 - // Add balloon logo to archieve (300 x 30 px)  
177 - $zip->addFile($this->logoline, 'files/balloonlogo.png');  
178 -  
179 - // KML header  
180 - $kml = "<?xml version='1.0' encoding='UTF-8'?>" . PHP_EOL  
181 - . "<kml xmlns='http://www.opengis.net/kml/2.2' xmlns:atom='http://www.w3.org/2005/Atom'>" . PHP_EOL  
182 - . " <Document>" . PHP_EOL  
183 - . " <atom:author>" . PHP_EOL  
184 - . " <atom:name>Thematic Mapping Engine</atom:name>" . PHP_EOL  
185 - . " </atom:author>" . PHP_EOL  
186 - . " <atom:link href='http://thematicmapping.org' rel='related' />" . PHP_EOL  
187 - . " <name>$this->mapTitle</name>" . PHP_EOL  
188 - . " <open>1</open>" . PHP_EOL  
189 - . " <Snippet maxLines='1'>$this->mapSource</Snippet>" . PHP_EOL  
190 - . " <description><![CDATA[ $this->mapDescription <p>$this->mapSource</p>$this->engine ]]></description>" . PHP_EOL;  
191 - // Add style for indicator balloon  
192 - $kmlStyles = " <Style id='balloonStyle'>" . PHP_EOL  
193 - . " <BalloonStyle>" . PHP_EOL  
194 - . " <text><![CDATA[" . PHP_EOL  
195 - . " <a href='http://thematicmapping.org'><img src='http://thematicmapping.org/engine/files/balloonlogo.png'></a>" . PHP_EOL  
196 - . " <p><b><font size='+2'>$[name]</font></b></p>" . PHP_EOL  
197 - . " <p>$[description]</p>" . PHP_EOL  
198 - . " ]]></text>" . PHP_EOL  
199 - . " </BalloonStyle>" . PHP_EOL  
200 - . " </Style>" . PHP_EOL  
201 - . " <styleUrl>#balloonStyle</styleUrl>" . PHP_EOL;  
202 -  
203 -  
204 - if ($this->colourType == 'scale') {  
205 - // Need to run before getColourValue / getColourLegend / makeClasses  
206 - self::makeColourScale();  
207 -  
208 - if ($this->classification != 'unclassed') {  
209 - self::makeClasses($this->classification, $this->numClasses);  
210 - }  
211 -  
212 - // Add colour legend to KMZ archieve  
213 - if ($this->showLegend) {  
214 - $imgLegenda = self::getColourLegend();  
215 - $zip->addFile($imgLegenda,'files/legend.png');  
216 - }  
217 - $kmlSingleColour = ''; // Colours needs to be defined for each feature  
218 - //$kmlColour = self::rgb2bgr($this->noDataColour); // Not in use, only so the variable has a value  
219 - }  
220 - else {  
221 - $kmlSingleColour = '<color>' . self::rgb2bgr($this->colour) . '</color>';  
222 - //$kmlColour = self::rgb2bgr($this->colour);  
223 - }  
224 -  
225 -  
226 - // Add style for value placemarks  
227 - if ($this->showLabel) {  
228 - $kmlStyles .= " <Style id='labelPlacemark'>" . PHP_EOL  
229 - . " <IconStyle>" . PHP_EOL  
230 - . " <scale>0.0</scale>" . PHP_EOL  
231 - . " </IconStyle>" . PHP_EOL  
232 - . " <LabelStyle>" . PHP_EOL  
233 - . " <scale>1</scale>" . PHP_EOL  
234 - . " </LabelStyle>" . PHP_EOL  
235 - . " </Style>" . PHP_EOL;  
236 - }  
237 -  
238 - // Define shared styles and legend  
239 - $kmlStyles .= " <Style id='sharedStyle'>" . PHP_EOL;  
240 - switch ($this->mapType) {  
241 -  
242 - case "choropleth":  
243 - case "prism":  
244 -  
245 - $kmlStyles .= " <PolyStyle>" . PHP_EOL  
246 - . " <fill>1</fill>" . PHP_EOL  
247 - . " <outline>1</outline>" . PHP_EOL  
248 - . " $kmlSingleColour" . PHP_EOL  
249 - . " </PolyStyle>" . PHP_EOL  
250 - . " <LineStyle>" . PHP_EOL  
251 - . " <color>cc000000</color>" . PHP_EOL  
252 - . " </LineStyle>" . PHP_EOL;  
253 - break;  
254 -  
255 - case "bar":  
256 -  
257 - $kmlStyles .= " <PolyStyle>" . PHP_EOL  
258 - . " <fill>1</fill>" . PHP_EOL  
259 - . " <outline>0</outline>" . PHP_EOL  
260 - . " $kmlSingleColour" . PHP_EOL  
261 - . " </PolyStyle>" . PHP_EOL;  
262 - break;  
263 -  
264 -  
265 -  
266 - // Proportional symbol  
267 - case "symbol":  
268 -  
269 - switch($this->symbolType){  
270 -  
271 - case 'image':  
272 - $zip->addFile("files/$this->symbolShape.png", 'files/symbol.png');  
273 - $kmlStyles .= " <IconStyle>" . PHP_EOL  
274 - . " $kmlSingleColour" . PHP_EOL  
275 - . " <Icon>" . PHP_EOL  
276 - . " <href>".$url."/symbol.png</href>" . PHP_EOL  
277 - . " </Icon>" . PHP_EOL  
278 - . " </IconStyle>" . PHP_EOL;  
279 - break;  
280 -  
281 - case 'polygon':  
282 - if ($this->symbolShape == 'square') {  
283 - $this->symbolVertices = 4;  
284 - }  
285 - $kmlStyles .= " <PolyStyle>" . PHP_EOL  
286 - . " $kmlSingleColour" . PHP_EOL  
287 - . " <fill>1</fill>" . PHP_EOL  
288 - . " <outline>1</outline>" . PHP_EOL  
289 - . " </PolyStyle>" . PHP_EOL  
290 - . " <LineStyle>" . PHP_EOL  
291 - . " <color>cc000000</color>" . PHP_EOL  
292 - . " </LineStyle>" . PHP_EOL;  
293 - break;  
294 -  
295 - case 'collada':  
296 - if ($this->colourType == 'scale') {  
297 - // Limit number of collada objects (one for each colour)  
298 - if ($this->classification == 'unclassed') {  
299 - self::makeClasses('equal', 12);  
300 - }  
301 -  
302 - foreach($this->classColours as $class => $classColour){  
303 - $colladaColour = self::rgb2collada($classColour);  
304 -  
305 - // Read collada model  
306 - $filename = "files/$this->symbolShape.dae";  
307 - $handle = fopen($filename, "r");  
308 - $collada = fread($handle, filesize($filename));  
309 - fclose($handle);  
310 -  
311 - // Search and replace colour  
312 - $pos = strpos($collada, '<effect id="material0-effect" name="material0-effect">');  
313 - $pos = strpos($collada, "<diffuse>", $pos);  
314 - $pos = strpos($collada, "<color>", $pos);  
315 - $collada = substr_replace($collada, $colladaColour, $pos+7, 28);  
316 -  
317 - // Add collada object to kmz archieve  
318 - $zip->addFromString("files/object$class.dae", $collada);  
319 - }  
320 - }  
321 -  
322 - // Single colour  
323 - else {  
324 - $colladaColour = self::rgb2collada($this->colour);  
325 -  
326 - // Read collada model  
327 - $filename = "files/$this->symbolShape.dae";  
328 - $handle = fopen($filename, "r");  
329 - $collada = fread($handle, filesize($filename));  
330 - fclose($handle);  
331 -  
332 - // Search and replace colour  
333 - $pos = strpos($collada, '<effect id="material0-effect" name="material0-effect">');  
334 - $pos = strpos($collada, "<diffuse>", $pos);  
335 - $pos = strpos($collada, "<color>", $pos);  
336 - $collada = substr_replace($collada, $colladaColour, $pos+7, 28);  
337 -  
338 - // Add collada object to kmz archieve  
339 - $zip->addFromString("files/object.dae", $collada);  
340 - }  
341 -  
342 - $kmlstyle = ''; // Not possible to define style for collada objects  
343 -  
344 - } // switch symbol  
345 - } // switch type  
346 -  
347 - $kmlStyles .= " <BalloonStyle>" . PHP_EOL  
348 - . " <text><![CDATA[" . PHP_EOL  
349 - . " <a href='http://thematicmapping.org'><img src='http://thematicmapping.org/engine/files/balloonlogo.png'></a>" . PHP_EOL  
350 - . " <p><b><font size='+2'>$[name]</font></b></p>" . PHP_EOL  
351 - . " <p>$this->mapTitle: $[Snippet]</p>" . PHP_EOL  
352 - . " <p>$this->mapDescription</p>" . PHP_EOL  
353 - . " <p>$this->mapSource</p>" . PHP_EOL  
354 - . " <p>$this->engine</p>" . PHP_EOL  
355 - . " ]]></text>" . PHP_EOL  
356 - . " </BalloonStyle>" . PHP_EOL  
357 - . " </Style>" . PHP_EOL; // End of shared style  
358 -  
359 - $kmlFolder = " <Folder>" . PHP_EOL  
360 - . " <name>Colunas</name>" . PHP_EOL  
361 - . " <open>1</open>" . PHP_EOL;  
362 -  
363 - if ($this->timeType == 'series') {  
364 - $kmlFolder .= " <Style>" . PHP_EOL  
365 - . " <ListStyle>" . PHP_EOL  
366 - . " <listItemType>radioFolder</listItemType>" . PHP_EOL  
367 - . " </ListStyle>" . PHP_EOL  
368 - . " </Style>" . PHP_EOL;  
369 - }  
370 -  
371 - // Loop thorough all years  
372 - foreach ($this->yearArray as $key => $year) {  
373 -  
374 - $kmlFeatures = '';  
375 -  
376 - if (($this->timeType == 'slider') OR ($year == $this->year)) $visibility = 1;  
377 - else $visibility = 0;  
378 -  
379 - $kmlFolder .= " <Folder>" . PHP_EOL  
380 - . " <name>$year</name>" . PHP_EOL  
381 - . " <visibility>$visibility</visibility>" . PHP_EOL;  
382 -  
383 - if ($this->showLabel) {  
384 - $kmlLabels = " <Folder>" . PHP_EOL  
385 - . " <name>Show/hide labels</name>" . PHP_EOL  
386 - . " <visibility>$visibility</visibility>" . PHP_EOL  
387 - . " <Style>" . PHP_EOL  
388 - . " <ListStyle>" . PHP_EOL  
389 - . " <listItemType>checkHideChildren</listItemType>" . PHP_EOL  
390 - . " </ListStyle>" . PHP_EOL  
391 - . " </Style>" . PHP_EOL;  
392 - }  
393 -  
394 - // Add timespan if time animation  
395 - if ($this->timeType == 'slider') { 174 + include(__DIR__."/../kmlmapserver/classes/zip.class.php");
  175 + $zip = new zipfile();
  176 + // Add balloon logo to archieve (300 x 30 px)
  177 + $zip->addFile($this->logoline, 'files/balloonlogo.png');
  178 +
  179 + // KML header
  180 + $kml = "<?xml version='1.0' encoding='UTF-8'?>" . PHP_EOL
  181 + . "<kml xmlns='http://www.opengis.net/kml/2.2' xmlns:atom='http://www.w3.org/2005/Atom'>" . PHP_EOL
  182 + . " <Document>" . PHP_EOL
  183 + . " <atom:author>" . PHP_EOL
  184 + . " <atom:name>Thematic Mapping Engine</atom:name>" . PHP_EOL
  185 + . " </atom:author>" . PHP_EOL
  186 + . " <atom:link href='http://thematicmapping.org' rel='related' />" . PHP_EOL
  187 + . " <name>$this->mapTitle</name>" . PHP_EOL
  188 + . " <open>1</open>" . PHP_EOL
  189 + . " <Snippet maxLines='1'>$this->mapSource</Snippet>" . PHP_EOL
  190 + . " <description><![CDATA[ $this->mapDescription <p>$this->mapSource</p>$this->engine ]]></description>" . PHP_EOL;
  191 + // Add style for indicator balloon
  192 + $kmlStyles = " <Style id='balloonStyle'>" . PHP_EOL
  193 + . " <BalloonStyle>" . PHP_EOL
  194 + . " <text><![CDATA[" . PHP_EOL
  195 + . " <a href='http://thematicmapping.org'><img src='http://thematicmapping.org/engine/files/balloonlogo.png'></a>" . PHP_EOL
  196 + . " <p><b><font size='+2'>$[name]</font></b></p>" . PHP_EOL
  197 + . " <p>$[description]</p>" . PHP_EOL
  198 + . " ]]></text>" . PHP_EOL
  199 + . " </BalloonStyle>" . PHP_EOL
  200 + . " </Style>" . PHP_EOL
  201 + . " <styleUrl>#balloonStyle</styleUrl>" . PHP_EOL;
  202 +
  203 +
  204 + if ($this->colourType == 'scale') {
  205 + // Need to run before getColourValue / getColourLegend / makeClasses
  206 + self::makeColourScale();
  207 +
  208 + if ($this->classification != 'unclassed') {
  209 + self::makeClasses($this->classification, $this->numClasses);
  210 + }
  211 +
  212 + // Add colour legend to KMZ archieve
  213 + if ($this->showLegend) {
  214 + $imgLegenda = self::getColourLegend();
  215 + $zip->addFile($imgLegenda,'files/legend.png');
  216 + }
  217 + $kmlSingleColour = ''; // Colours needs to be defined for each feature
  218 + //$kmlColour = self::rgb2bgr($this->noDataColour); // Not in use, only so the variable has a value
  219 + }
  220 + else {
  221 + $kmlSingleColour = '<color>' . self::rgb2bgr($this->colour) . '</color>';
  222 + //$kmlColour = self::rgb2bgr($this->colour);
  223 + }
  224 +
  225 +
  226 + // Add style for value placemarks
  227 + if ($this->showLabel) {
  228 + $kmlStyles .= " <Style id='labelPlacemark'>" . PHP_EOL
  229 + . " <IconStyle>" . PHP_EOL
  230 + . " <scale>0.0</scale>" . PHP_EOL
  231 + . " </IconStyle>" . PHP_EOL
  232 + . " <LabelStyle>" . PHP_EOL
  233 + . " <scale>1</scale>" . PHP_EOL
  234 + . " </LabelStyle>" . PHP_EOL
  235 + . " </Style>" . PHP_EOL;
  236 + }
  237 +
  238 + // Define shared styles and legend
  239 + $kmlStyles .= " <Style id='sharedStyle'>" . PHP_EOL;
  240 + switch ($this->mapType) {
  241 +
  242 + case "choropleth":
  243 + case "prism":
  244 +
  245 + $kmlStyles .= " <PolyStyle>" . PHP_EOL
  246 + . " <fill>1</fill>" . PHP_EOL
  247 + . " <outline>1</outline>" . PHP_EOL
  248 + . " $kmlSingleColour" . PHP_EOL
  249 + . " </PolyStyle>" . PHP_EOL
  250 + . " <LineStyle>" . PHP_EOL
  251 + . " <color>cc000000</color>" . PHP_EOL
  252 + . " </LineStyle>" . PHP_EOL;
  253 + break;
  254 +
  255 + case "bar":
  256 +
  257 + $kmlStyles .= " <PolyStyle>" . PHP_EOL
  258 + . " <fill>1</fill>" . PHP_EOL
  259 + . " <outline>0</outline>" . PHP_EOL
  260 + . " $kmlSingleColour" . PHP_EOL
  261 + . " </PolyStyle>" . PHP_EOL;
  262 + break;
  263 +
  264 +
  265 +
  266 + // Proportional symbol
  267 + case "symbol":
  268 +
  269 + switch($this->symbolType){
  270 +
  271 + case 'image':
  272 + $zip->addFile("files/$this->symbolShape.png", 'files/symbol.png');
  273 + $kmlStyles .= " <IconStyle>" . PHP_EOL
  274 + . " $kmlSingleColour" . PHP_EOL
  275 + . " <Icon>" . PHP_EOL
  276 + . " <href>".$url."/symbol.png</href>" . PHP_EOL
  277 + . " </Icon>" . PHP_EOL
  278 + . " </IconStyle>" . PHP_EOL;
  279 + break;
  280 +
  281 + case 'polygon':
  282 + if ($this->symbolShape == 'square') {
  283 + $this->symbolVertices = 4;
  284 + }
  285 + $kmlStyles .= " <PolyStyle>" . PHP_EOL
  286 + . " $kmlSingleColour" . PHP_EOL
  287 + . " <fill>1</fill>" . PHP_EOL
  288 + . " <outline>1</outline>" . PHP_EOL
  289 + . " </PolyStyle>" . PHP_EOL
  290 + . " <LineStyle>" . PHP_EOL
  291 + . " <color>cc000000</color>" . PHP_EOL
  292 + . " </LineStyle>" . PHP_EOL;
  293 + break;
  294 +
  295 + case 'collada':
  296 + if ($this->colourType == 'scale') {
  297 + // Limit number of collada objects (one for each colour)
  298 + if ($this->classification == 'unclassed') {
  299 + self::makeClasses('equal', 12);
  300 + }
  301 +
  302 + foreach($this->classColours as $class => $classColour){
  303 + $colladaColour = self::rgb2collada($classColour);
  304 +
  305 + // Read collada model
  306 + $filename = "files/$this->symbolShape.dae";
  307 + $handle = fopen($filename, "r");
  308 + $collada = fread($handle, filesize($filename));
  309 + fclose($handle);
  310 +
  311 + // Search and replace colour
  312 + $pos = strpos($collada, '<effect id="material0-effect" name="material0-effect">');
  313 + $pos = strpos($collada, "<diffuse>", $pos);
  314 + $pos = strpos($collada, "<color>", $pos);
  315 + $collada = substr_replace($collada, $colladaColour, $pos+7, 28);
  316 +
  317 + // Add collada object to kmz archieve
  318 + $zip->addFromString("files/object$class.dae", $collada);
  319 + }
  320 + }
  321 +
  322 + // Single colour
  323 + else {
  324 + $colladaColour = self::rgb2collada($this->colour);
  325 +
  326 + // Read collada model
  327 + $filename = "files/$this->symbolShape.dae";
  328 + $handle = fopen($filename, "r");
  329 + $collada = fread($handle, filesize($filename));
  330 + fclose($handle);
  331 +
  332 + // Search and replace colour
  333 + $pos = strpos($collada, '<effect id="material0-effect" name="material0-effect">');
  334 + $pos = strpos($collada, "<diffuse>", $pos);
  335 + $pos = strpos($collada, "<color>", $pos);
  336 + $collada = substr_replace($collada, $colladaColour, $pos+7, 28);
  337 +
  338 + // Add collada object to kmz archieve
  339 + $zip->addFromString("files/object.dae", $collada);
  340 + }
  341 +
  342 + $kmlstyle = ''; // Not possible to define style for collada objects
  343 +
  344 + } // switch symbol
  345 + } // switch type
  346 +
  347 + $kmlStyles .= " <BalloonStyle>" . PHP_EOL
  348 + . " <text><![CDATA[" . PHP_EOL
  349 + . " <a href='http://thematicmapping.org'><img src='http://thematicmapping.org/engine/files/balloonlogo.png'></a>" . PHP_EOL
  350 + . " <p><b><font size='+2'>$[name]</font></b></p>" . PHP_EOL
  351 + . " <p>$this->mapTitle: $[Snippet]</p>" . PHP_EOL
  352 + . " <p>$this->mapDescription</p>" . PHP_EOL
  353 + . " <p>$this->mapSource</p>" . PHP_EOL
  354 + . " <p>$this->engine</p>" . PHP_EOL
  355 + . " ]]></text>" . PHP_EOL
  356 + . " </BalloonStyle>" . PHP_EOL
  357 + . " </Style>" . PHP_EOL; // End of shared style
  358 +
  359 + $kmlFolder = " <Folder>" . PHP_EOL
  360 + . " <name>Colunas</name>" . PHP_EOL
  361 + . " <open>1</open>" . PHP_EOL;
  362 +
  363 + if ($this->timeType == 'series') {
  364 + $kmlFolder .= " <Style>" . PHP_EOL
  365 + . " <ListStyle>" . PHP_EOL
  366 + . " <listItemType>radioFolder</listItemType>" . PHP_EOL
  367 + . " </ListStyle>" . PHP_EOL
  368 + . " </Style>" . PHP_EOL;
  369 + }
  370 +
  371 + // Loop thorough all years
  372 + foreach ($this->yearArray as $key => $year) {
  373 +
  374 + $kmlFeatures = '';
  375 +
  376 + if (($this->timeType == 'slider') OR ($year == $this->year)) $visibility = 1;
  377 + else $visibility = 0;
  378 +
  379 + $kmlFolder .= " <Folder>" . PHP_EOL
  380 + . " <name>$year</name>" . PHP_EOL
  381 + . " <visibility>$visibility</visibility>" . PHP_EOL;
  382 +
  383 + if ($this->showLabel) {
  384 + $kmlLabels = " <Folder>" . PHP_EOL
  385 + . " <name>Show/hide labels</name>" . PHP_EOL
  386 + . " <visibility>$visibility</visibility>" . PHP_EOL
  387 + . " <Style>" . PHP_EOL
  388 + . " <ListStyle>" . PHP_EOL
  389 + . " <listItemType>checkHideChildren</listItemType>" . PHP_EOL
  390 + . " </ListStyle>" . PHP_EOL
  391 + . " </Style>" . PHP_EOL;
  392 + }
  393 +
  394 + // Add timespan if time animation
  395 + if ($this->timeType == 'slider') {
396 396
397 $end = ''; 397 $end = '';
398 - // Check if there is more years  
399 - if (array_key_exists($key+1, $this->yearArray)) {  
400 - $end = '<end>' . intval($this->yearArray[$key+1]-1) . '-12-31</end>';  
401 - }  
402 - $kmlFolder .= " <TimeSpan>" . PHP_EOL  
403 - . " <begin>$year-01-01</begin>$end" . PHP_EOL  
404 - . " </TimeSpan>" . PHP_EOL;  
405 -  
406 - }  
407 -  
408 - // Loop thorough all features (values without features will not be shown)  
409 - foreach ($this->dataStore['features'] as $featureID => $feature)  
410 - {  
411 - $name = $feature['name']; 398 + // Check if there is more years
  399 + if (array_key_exists($key+1, $this->yearArray)) {
  400 + $end = '<end>' . intval($this->yearArray[$key+1]-1) . '-12-31</end>';
  401 + }
  402 + $kmlFolder .= " <TimeSpan>" . PHP_EOL
  403 + . " <begin>$year-01-01</begin>$end" . PHP_EOL
  404 + . " </TimeSpan>" . PHP_EOL;
  405 +
  406 + }
  407 +
  408 + // Loop thorough all features (values without features will not be shown)
  409 + foreach ($this->dataStore['features'] as $featureID => $feature)
  410 + {
  411 + $name = $feature['name'];
412 //if (!mb_detect_encoding($name,"UTF-8",true)) 412 //if (!mb_detect_encoding($name,"UTF-8",true))
413 //{$name = mb_convert_encoding($name,"UTF-8","ISO-8859-1");} 413 //{$name = mb_convert_encoding($name,"UTF-8","ISO-8859-1");}
414 $name = "<![CDATA[ ".$name." ]]>"; 414 $name = "<![CDATA[ ".$name." ]]>";
415 - $value = ''; // use null?  
416 - $valueText = 'no data';  
417 - $valueLabel = '';  
418 - $kmlFeature = '';  
419 - $altitude = 0;  
420 - $symbolSize = 0;  
421 - $colladaCount = 0;  
422 - //$kmlColour = self::rgb2bgr($this->noDataColour);  
423 - $kmlColour = '';  
424 -  
425 - $longitude = $feature['lon'];  
426 - $latitude = $feature['lat'];  
427 -  
428 - // Check if value exists for this feature  
429 - if (isset($this->indicator['values'][$year][$featureID])) {  
430 - // Extract value from dataStore  
431 - $value = $this->indicator['values'][$year][$featureID];  
432 - $valueText = $valueLabel = number_format($value, 2, ',', '.');  
433 - // Colour scale  
434 - if ($this->colourType == 'scale') {  
435 - if ($this->classification != 'unclassed') {  
436 - $class = self::getClass($value);  
437 - $kmlColour = self::rgb2bgr($this->classColours[$class]);  
438 - }  
439 - else {  
440 - $kmlColour = self::getColourValue($value, 'kml');  
441 - }  
442 - }  
443 - // Single colour  
444 - //else {  
445 - // $kmlColour = self::rgb2bgr($this->colour);  
446 - //}  
447 - }  
448 - else {  
449 - $kmlColour = self::rgb2bgr($this->noDataColour);  
450 - }  
451 -  
452 -  
453 - switch ($this->mapType) {  
454 -  
455 - case "choropleth":  
456 -  
457 - $kmlFeature = " <Style>" . PHP_EOL  
458 - . " <PolyStyle>" . PHP_EOL  
459 - . " <color>$kmlColour</color>" . PHP_EOL  
460 - . " </PolyStyle>" . PHP_EOL  
461 - . " </Style>" . PHP_EOL;  
462 -  
463 - $kmlFeature .= self::wkt2kml($feature['wkt'], 0);  
464 - break;  
465 -  
466 - case "prism":  
467 - $altitude = intval($value * ($this->maxHeight / $this->maxValue));  
468 -  
469 - if ($this->colourType == 'scale') {  
470 - $kmlFeature = " <Style>" . PHP_EOL  
471 - . " <PolyStyle>" . PHP_EOL  
472 - . " <color>$kmlColour</color>" . PHP_EOL  
473 - . " </PolyStyle>" . PHP_EOL  
474 - . " </Style>" . PHP_EOL;  
475 - }  
476 -  
477 - $kmlFeature .= self::wkt2kml($feature['wkt'], $altitude) . PHP_EOL;  
478 - break;  
479 -  
480 - case "bar":  
481 - if ($value != null) {  
482 - $altitude = intval($value * ($this->maxHeight / $this->maxValue));  
483 -  
484 - if ($this->colourType == 'scale') {  
485 - $kmlFeature = " <Style>" . PHP_EOL  
486 - . " <PolyStyle>" . PHP_EOL  
487 - . " <color>$kmlColour</color>" . PHP_EOL  
488 - . " </PolyStyle>" . PHP_EOL  
489 - . " </Style>" . PHP_EOL;  
490 - }  
491 -  
492 - $kmlFeature .= self::kmlSymbolCalculator($longitude, $latitude, $this->barSize, 15, $altitude);  
493 - }  
494 - break;  
495 -  
496 - case "symbol":  
497 - if ($value != null) {  
498 -  
499 - switch($this->symbolType){  
500 -  
501 - case 'im$z = new ZipArchive(); 415 + $value = ''; // use null?
  416 + $valueText = 'no data';
  417 + $valueLabel = '';
  418 + $kmlFeature = '';
  419 + $altitude = 0;
  420 + $symbolSize = 0;
  421 + $colladaCount = 0;
  422 + //$kmlColour = self::rgb2bgr($this->noDataColour);
  423 + $kmlColour = '';
  424 +
  425 + $longitude = $feature['lon'];
  426 + $latitude = $feature['lat'];
  427 +
  428 + // Check if value exists for this feature
  429 + if (isset($this->indicator['values'][$year][$featureID])) {
  430 + // Extract value from dataStore
  431 + $value = $this->indicator['values'][$year][$featureID];
  432 + $valueText = $valueLabel = number_format($value, 2, ',', '.');
  433 + // Colour scale
  434 + if ($this->colourType == 'scale') {
  435 + if ($this->classification != 'unclassed') {
  436 + $class = self::getClass($value);
  437 + $kmlColour = self::rgb2bgr($this->classColours[$class]);
  438 + }
  439 + else {
  440 + $kmlColour = self::getColourValue($value, 'kml');
  441 + }
  442 + }
  443 + // Single colour
  444 + //else {
  445 + // $kmlColour = self::rgb2bgr($this->colour);
  446 + //}
  447 + }
  448 + else {
  449 + $kmlColour = self::rgb2bgr($this->noDataColour);
  450 + }
  451 +
  452 +
  453 + switch ($this->mapType) {
  454 +
  455 + case "choropleth":
  456 +
  457 + $kmlFeature = " <Style>" . PHP_EOL
  458 + . " <PolyStyle>" . PHP_EOL
  459 + . " <color>$kmlColour</color>" . PHP_EOL
  460 + . " </PolyStyle>" . PHP_EOL
  461 + . " </Style>" . PHP_EOL;
  462 +
  463 + $kmlFeature .= self::wkt2kml($feature['wkt'], 0);
  464 + break;
  465 +
  466 + case "prism":
  467 + $altitude = intval($value * ($this->maxHeight / $this->maxValue));
  468 +
  469 + if ($this->colourType == 'scale') {
  470 + $kmlFeature = " <Style>" . PHP_EOL
  471 + . " <PolyStyle>" . PHP_EOL
  472 + . " <color>$kmlColour</color>" . PHP_EOL
  473 + . " </PolyStyle>" . PHP_EOL
  474 + . " </Style>" . PHP_EOL;
  475 + }
  476 +
  477 + $kmlFeature .= self::wkt2kml($feature['wkt'], $altitude) . PHP_EOL;
  478 + break;
  479 +
  480 + case "bar":
  481 + if ($value != null) {
  482 + $altitude = intval($value * ($this->maxHeight / $this->maxValue));
  483 +
  484 + if ($this->colourType == 'scale') {
  485 + $kmlFeature = " <Style>" . PHP_EOL
  486 + . " <PolyStyle>" . PHP_EOL
  487 + . " <color>$kmlColour</color>" . PHP_EOL
  488 + . " </PolyStyle>" . PHP_EOL
  489 + . " </Style>" . PHP_EOL;
  490 + }
  491 +
  492 + $kmlFeature .= self::kmlSymbolCalculator($longitude, $latitude, $this->barSize, 15, $altitude);
  493 + }
  494 + break;
  495 +
  496 + case "symbol":
  497 + if ($value != null) {
  498 +
  499 + switch($this->symbolType){
  500 +
  501 + case 'im$z = new ZipArchive();
502 $z->open("test.zip", ZIPARCHIVE::CREATE); 502 $z->open("test.zip", ZIPARCHIVE::CREATE);
503 folderToZip("storeThisFolder", $z); 503 folderToZip("storeThisFolder", $z);
504 $z->close();age': 504 $z->close();age':
505 - //$symbolSize = round(self::getSymbolSize($value, $this->symbolShape),2);  
506 - $symbolSize = round($this->symbolMaxSize * sqrt($value/$this->maxValue), 2);  
507 -  
508 - $kmlFeature = " <Style>" . PHP_EOL  
509 - . " <IconStyle>" . PHP_EOL  
510 - . " <scale>$symbolSize</scale>" . PHP_EOL  
511 - . " <color>$kmlColour</color>" . PHP_EOL  
512 - . " </IconStyle>" . PHP_EOL  
513 - . " </Style>" . PHP_EOL;  
514 -  
515 - $kmlFeature .= " <LookAt>" . PHP_EOL  
516 - . " <longitude>$longitude</longitude>" . PHP_EOL  
517 - . " <latitude>$latitude</latitude>" . PHP_EOL  
518 - . " <altitude>0</altitude>" . PHP_EOL  
519 - . " <range>3200000</range>" . PHP_EOL  
520 - . " <altitudeMode>clampToGround</altitudeMode>" . PHP_EOL  
521 - . " </LookAt>" . PHP_EOL  
522 - . " <Point>" . PHP_EOL  
523 - . " <coordinates>$longitude,$latitude,0</coordinates>" . PHP_EOL  
524 - . " </Point>" . PHP_EOL;  
525 - break;  
526 -  
527 - case 'polygon':  
528 - //$symbolSize = intval(self::getSymbolSize($value, $this->symbolShape));  
529 - $symbolSize = intval($this->symbolMaxSize * sqrt($value/$this->maxValue) * 70000);  
530 - if ($this->colourType == 'scale') {  
531 - $kmlFeature = " <Style>" . PHP_EOL  
532 - . " <PolyStyle>" . PHP_EOL  
533 - . " <color>$kmlColour</color>" . PHP_EOL  
534 - . " </PolyStyle>" . PHP_EOL  
535 - . " </Style>" . PHP_EOL;  
536 - }  
537 - $kmlFeature .= self::kmlSymbolCalculator($longitude, $latitude, $symbolSize, $this->symbolVertices, 0);  
538 - break;  
539 -  
540 - case 'collada':  
541 -  
542 - //$symbolSize = intval(self::getSymbolSize($value, $this->symbolShape));  
543 - $symbolSize = intval($this->symbolMaxSize * pow($value/$this->maxValue, 1/3) * 20000);  
544 -  
545 - $class = ''; // Single colour  
546 - if ($this->colourType == 'scale') $class = self::getClass($value);  
547 -  
548 - $altitude = $symbolSize; // Used for label placement  
549 - $kmlFeature = " <Model>" . PHP_EOL  
550 - . " <altitudeMode>absolute</altitudeMode>" . PHP_EOL  
551 - . " <Location>" . PHP_EOL  
552 - . " <longitude>$longitude</longitude>" . PHP_EOL  
553 - . " <latitude>$latitude</latitude>" . PHP_EOL  
554 - . " <altitude>0</altitude>" . PHP_EOL  
555 - . " </Location>" . PHP_EOL  
556 - . " <Scale>" . PHP_EOL  
557 - . " <x>$symbolSize</x>" . PHP_EOL  
558 - . " <y>$symbolSize</y>" . PHP_EOL  
559 - . " <z>$symbolSize</z>" . PHP_EOL  
560 - . " </Scale>" . PHP_EOL  
561 - . " <Link>" . PHP_EOL  
562 - . " <href>files/object$class.dae</href>" . PHP_EOL  
563 - . " </Link>" . PHP_EOL  
564 - . " </Model>" . PHP_EOL;  
565 - } // switch  
566 - } // if  
567 - } // switch  
568 -  
569 -  
570 - $kmlFeatures .= " <Placemark>" . PHP_EOL  
571 - . " <name>$name</name>" . PHP_EOL  
572 - . " <visibility>$visibility</visibility>" . PHP_EOL  
573 - . " <Snippet>$valueText ($year)</Snippet>" . PHP_EOL  
574 - . " <styleUrl>#sharedStyle</styleUrl>" . PHP_EOL  
575 - . $kmlFeature  
576 - . " </Placemark>" . PHP_EOL;  
577 -  
578 - if ($this->showLabel) {  
579 - $label = '';  
580 - if ($this->showNames) $label = $name;  
581 - if ($this->showValues) $label .= ' ' . $valueLabel;  
582 - $kmlLabels .= " <Placemark>" . PHP_EOL  
583 - . " <name>$label</name>" . PHP_EOL  
584 - . " <visibility>$visibility</visibility>" . PHP_EOL  
585 - . " <styleUrl>#labelPlacemark</styleUrl>" . PHP_EOL  
586 - . " <Point>" . PHP_EOL  
587 - . " <altitudeMode>absolute</altitudeMode>" . PHP_EOL  
588 - . " <coordinates>$longitude, $latitude, $altitude</coordinates>" . PHP_EOL  
589 - . " </Point>" . PHP_EOL  
590 - . " </Placemark>" . PHP_EOL;  
591 - }  
592 -  
593 - } // foreach features  
594 -  
595 - if ($this->showLabel) {  
596 - $kmlLabels .= " </Folder>";  
597 - $kmlFolder .= $kmlLabels;  
598 - }  
599 -  
600 - $kmlFolder .= $kmlFeatures;  
601 -  
602 - $kmlFolder .= " </Folder>" . PHP_EOL;  
603 - } // foreach years  
604 -  
605 -  
606 -  
607 - // Close Years folder  
608 - $kmlFolder .= " </Folder>" . PHP_EOL;  
609 -  
610 - // Create logo with title and source and add to archieve  
611 - if ($this->showTitle) {  
612 - $imgBrand = self::mapTitleImage();  
613 - $zip->addFile($imgBrand, 'files/brand.png');  
614 - }  
615 - else {  
616 - $zip->addFile($this->logo, 'files/brand.png');  
617 - }  
618 - // Add title  
619 - $kml .= " <ScreenOverlay>" . PHP_EOL  
620 - . " <name>Título</name>" . PHP_EOL  
621 - . " <Icon>" . PHP_EOL  
622 - . " <href>http://localhost/ms_tmp/".basename($imgBrand)."</href>" . PHP_EOL  
623 - . " </Icon>" . PHP_EOL  
624 - . " <overlayXY x='0.01' y='0.99' xunits='fraction' yunits='fraction'/>" . PHP_EOL  
625 - . " <screenXY x='0.01' y='0.99' xunits='fraction' yunits='fraction'/>" . PHP_EOL  
626 - . " <size x='-1' y='-1' xunits='pixels' yunits='pixels'/>" . PHP_EOL  
627 - . " </ScreenOverlay>" . PHP_EOL;  
628 -  
629 - // Add legend  
630 - if ($this->showLegend && $this->colourType == 'scale') {  
631 - $kml .= " <ScreenOverlay>" . PHP_EOL  
632 - . " <name>Legenda</name>" . PHP_EOL  
633 - . " <Icon>" . PHP_EOL  
634 - . " <href>http://localhost/ms_tmp/".basename($imgLegenda)."</href>" . PHP_EOL  
635 - . " </Icon>" . PHP_EOL  
636 - . " <overlayXY x='0.01' y='0.14' xunits='fraction' yunits='fraction'/>" . PHP_EOL  
637 - . " <screenXY x='0.01' y='0.14' xunits='fraction' yunits='fraction'/>" . PHP_EOL  
638 - . " <size x='-1' y='-1' xunits='pixels' yunits='pixels'/>" . PHP_EOL  
639 - . " </ScreenOverlay>" . PHP_EOL;  
640 - }  
641 -  
642 - $kml .= $kmlStyles . $kmlFolder;  
643 -  
644 - // Add basemap  
645 - //if (isset($paramArray['basemap'])) {  
646 - // $kml .= "<NetworkLink>  
647 - // <name>Basemap</name>  
648 - // <Link><href>$basemap</href></Link>  
649 - // </NetworkLink>" . PHP_EOL;  
650 - //}  
651 -  
652 - $kml .= " </Document>" . PHP_EOL  
653 - . "</kml>" . PHP_EOL; 505 + //$symbolSize = round(self::getSymbolSize($value, $this->symbolShape),2);
  506 + $symbolSize = round($this->symbolMaxSize * sqrt($value/$this->maxValue), 2);
  507 +
  508 + $kmlFeature = " <Style>" . PHP_EOL
  509 + . " <IconStyle>" . PHP_EOL
  510 + . " <scale>$symbolSize</scale>" . PHP_EOL
  511 + . " <color>$kmlColour</color>" . PHP_EOL
  512 + . " </IconStyle>" . PHP_EOL
  513 + . " </Style>" . PHP_EOL;
  514 +
  515 + $kmlFeature .= " <LookAt>" . PHP_EOL
  516 + . " <longitude>$longitude</longitude>" . PHP_EOL
  517 + . " <latitude>$latitude</latitude>" . PHP_EOL
  518 + . " <altitude>0</altitude>" . PHP_EOL
  519 + . " <range>3200000</range>" . PHP_EOL
  520 + . " <altitudeMode>clampToGround</altitudeMode>" . PHP_EOL
  521 + . " </LookAt>" . PHP_EOL
  522 + . " <Point>" . PHP_EOL
  523 + . " <coordinates>$longitude,$latitude,0</coordinates>" . PHP_EOL
  524 + . " </Point>" . PHP_EOL;
  525 + break;
  526 +
  527 + case 'polygon':
  528 + //$symbolSize = intval(self::getSymbolSize($value, $this->symbolShape));
  529 + $symbolSize = intval($this->symbolMaxSize * sqrt($value/$this->maxValue) * 70000);
  530 + if ($this->colourType == 'scale') {
  531 + $kmlFeature = " <Style>" . PHP_EOL
  532 + . " <PolyStyle>" . PHP_EOL
  533 + . " <color>$kmlColour</color>" . PHP_EOL
  534 + . " </PolyStyle>" . PHP_EOL
  535 + . " </Style>" . PHP_EOL;
  536 + }
  537 + $kmlFeature .= self::kmlSymbolCalculator($longitude, $latitude, $symbolSize, $this->symbolVertices, 0);
  538 + break;
  539 +
  540 + case 'collada':
  541 +
  542 + //$symbolSize = intval(self::getSymbolSize($value, $this->symbolShape));
  543 + $symbolSize = intval($this->symbolMaxSize * pow($value/$this->maxValue, 1/3) * 20000);
  544 +
  545 + $class = ''; // Single colour
  546 + if ($this->colourType == 'scale') $class = self::getClass($value);
  547 +
  548 + $altitude = $symbolSize; // Used for label placement
  549 + $kmlFeature = " <Model>" . PHP_EOL
  550 + . " <altitudeMode>absolute</altitudeMode>" . PHP_EOL
  551 + . " <Location>" . PHP_EOL
  552 + . " <longitude>$longitude</longitude>" . PHP_EOL
  553 + . " <latitude>$latitude</latitude>" . PHP_EOL
  554 + . " <altitude>0</altitude>" . PHP_EOL
  555 + . " </Location>" . PHP_EOL
  556 + . " <Scale>" . PHP_EOL
  557 + . " <x>$symbolSize</x>" . PHP_EOL
  558 + . " <y>$symbolSize</y>" . PHP_EOL
  559 + . " <z>$symbolSize</z>" . PHP_EOL
  560 + . " </Scale>" . PHP_EOL
  561 + . " <Link>" . PHP_EOL
  562 + . " <href>files/object$class.dae</href>" . PHP_EOL
  563 + . " </Link>" . PHP_EOL
  564 + . " </Model>" . PHP_EOL;
  565 + } // switch
  566 + } // if
  567 + } // switch
  568 +
  569 +
  570 + $kmlFeatures .= " <Placemark>" . PHP_EOL
  571 + . " <name>$name</name>" . PHP_EOL
  572 + . " <visibility>$visibility</visibility>" . PHP_EOL
  573 + . " <Snippet>$valueText ($year)</Snippet>" . PHP_EOL
  574 + . " <styleUrl>#sharedStyle</styleUrl>" . PHP_EOL
  575 + . $kmlFeature
  576 + . " </Placemark>" . PHP_EOL;
  577 +
  578 + if ($this->showLabel) {
  579 + $label = '';
  580 + if ($this->showNames) $label = $name;
  581 + if ($this->showValues) $label .= ' ' . $valueLabel;
  582 + $kmlLabels .= " <Placemark>" . PHP_EOL
  583 + . " <name>$label</name>" . PHP_EOL
  584 + . " <visibility>$visibility</visibility>" . PHP_EOL
  585 + . " <styleUrl>#labelPlacemark</styleUrl>" . PHP_EOL
  586 + . " <Point>" . PHP_EOL
  587 + . " <altitudeMode>absolute</altitudeMode>" . PHP_EOL
  588 + . " <coordinates>$longitude, $latitude, $altitude</coordinates>" . PHP_EOL
  589 + . " </Point>" . PHP_EOL
  590 + . " </Placemark>" . PHP_EOL;
  591 + }
  592 +
  593 + } // foreach features
  594 +
  595 + if ($this->showLabel) {
  596 + $kmlLabels .= " </Folder>";
  597 + $kmlFolder .= $kmlLabels;
  598 + }
  599 +
  600 + $kmlFolder .= $kmlFeatures;
  601 +
  602 + $kmlFolder .= " </Folder>" . PHP_EOL;
  603 + } // foreach years
  604 +
  605 +
  606 +
  607 + // Close Years folder
  608 + $kmlFolder .= " </Folder>" . PHP_EOL;
  609 +
  610 + // Create logo with title and source and add to archieve
  611 + if ($this->showTitle) {
  612 + $imgBrand = self::mapTitleImage();
  613 + $zip->addFile($imgBrand, 'files/brand.png');
  614 + }
  615 + else {
  616 + $zip->addFile($this->logo, 'files/brand.png');
  617 + }
  618 + // Add title
  619 + $kml .= " <ScreenOverlay>" . PHP_EOL
  620 + . " <name>Titulo</name>" . PHP_EOL
  621 + . " <Icon>" . PHP_EOL
  622 + . " <href>".$url."/".basename($imgBrand)."</href>" . PHP_EOL
  623 + . " </Icon>" . PHP_EOL
  624 + . " <overlayXY x='0.01' y='0.99' xunits='fraction' yunits='fraction'/>" . PHP_EOL
  625 + . " <screenXY x='0.01' y='0.99' xunits='fraction' yunits='fraction'/>" . PHP_EOL
  626 + . " <size x='-1' y='-1' xunits='pixels' yunits='pixels'/>" . PHP_EOL
  627 + . " </ScreenOverlay>" . PHP_EOL;
  628 +
  629 + // Add legend
  630 + if ($this->showLegend && $this->colourType == 'scale') {
  631 + $kml .= " <ScreenOverlay>" . PHP_EOL
  632 + . " <name>Legenda</name>" . PHP_EOL
  633 + . " <Icon>" . PHP_EOL
  634 + . " <href>".$url."/".basename($imgLegenda)."</href>" . PHP_EOL
  635 + . " </Icon>" . PHP_EOL
  636 + . " <overlayXY x='0.01' y='0.14' xunits='fraction' yunits='fraction'/>" . PHP_EOL
  637 + . " <screenXY x='0.01' y='0.14' xunits='fraction' yunits='fraction'/>" . PHP_EOL
  638 + . " <size x='-1' y='-1' xunits='pixels' yunits='pixels'/>" . PHP_EOL
  639 + . " </ScreenOverlay>" . PHP_EOL;
  640 + }
  641 +
  642 + $kml .= $kmlStyles . $kmlFolder;
  643 +
  644 + // Add basemap
  645 + //if (isset($paramArray['basemap'])) {
  646 + // $kml .= "<NetworkLink>
  647 + // <name>Basemap</name>
  648 + // <Link><href>$basemap</href></Link>
  649 + // </NetworkLink>" . PHP_EOL;
  650 + //}
  651 +
  652 + $kml .= " </Document>" . PHP_EOL
  653 + . "</kml>" . PHP_EOL;
654 654
655 655
656 // Open archive if collada 656 // Open archive if collada
657 657
658 658
659 - // Add kml to archieve  
660 - //$zip->addFromString("doc.kml", $kml);  
661 - $zip->addFile($kml, 'doc.kml');//edmar 659 + // Add kml to archieve
  660 + //$zip->addFromString("doc.kml", $kml);
  661 + $zip->addFile($kml, 'doc.kml');//edmar
662 662
663 663
664 - //$zip->close();  
665 - $zip->output($file);//edmar  
666 - if($download){  
667 - ob_end_clean();  
668 - //header('Content-Type: application/vnd.google-earth.kml+xml');  
669 - header('Content-Disposition: attachment; filename='.basename($file)); 664 + //$zip->close();
  665 + $zip->output($file);//edmar
  666 + if($download){
  667 + ob_end_clean();
  668 + //header('Content-Type: application/vnd.google-earth.kml+xml');
  669 + header('Content-Disposition: attachment; filename='.basename($file));
670 print $file; 670 print $file;
671 exit; 671 exit;
672 - }  
673 - else{  
674 - return $url.basename($file);  
675 - }  
676 - } 672 + }
  673 + else{
  674 + return $url.basename($file);
  675 + }
  676 + }
677 677
678 678
679 679
680 680
681 - //  
682 - // Function  
683 - // @access protected  
684 - //  
685 - // This function is based on code developed by "TJ":  
686 - // http://bbs.keyhole.com/ubb/showflat.php?Cat=&Board=SupportKML&Number=166379&Searchpage=1&Main=166379&Words=calculate+TJ1&topic=&Search=true  
687 - //  
688 - function kmlSymbolCalculator( $longitude, $latitude, $distance, $points, $altitude )  
689 - { 681 + //
  682 + // Function
  683 + // @access protected
  684 + //
  685 + // This function is based on code developed by "TJ":
  686 + // http://bbs.keyhole.com/ubb/showflat.php?Cat=&Board=SupportKML&Number=166379&Searchpage=1&Main=166379&Words=calculate+TJ1&topic=&Search=true
  687 + //
  688 + function kmlSymbolCalculator( $longitude, $latitude, $distance, $points, $altitude )
  689 + {
690 $EARTH_RADIUS_EQUATOR = 6378140.0; 690 $EARTH_RADIUS_EQUATOR = 6378140.0;
691 $RADIAN = 180 / pi(); 691 $RADIAN = 180 / pi();
692 692
@@ -698,14 +698,14 @@ $z-&gt;close();age&#39;: @@ -698,14 +698,14 @@ $z-&gt;close();age&#39;:
698 $f = 1/298.257; 698 $f = 1/298.257;
699 $e = 0.08181922; 699 $e = 0.08181922;
700 700
701 - $kml = ' <Polygon>' . PHP_EOL  
702 - . ' <outerBoundaryIs>' . PHP_EOL  
703 - . ' <LinearRing>' . PHP_EOL  
704 - . ' <coordinates>'; 701 + $kml = ' <Polygon>' . PHP_EOL
  702 + . ' <outerBoundaryIs>' . PHP_EOL
  703 + . ' <LinearRing>' . PHP_EOL
  704 + . ' <coordinates>';
705 705
706 //for ( $bearing = 0; $bearing <= 360; $bearing += 360/$points) { 706 //for ( $bearing = 0; $bearing <= 360; $bearing += 360/$points) {
707 // Changed start bearing beacuse of square orientation 707 // Changed start bearing beacuse of square orientation
708 - for ( $bearing = 45; $bearing <= 405; $bearing += 360/$points) { 708 + for ( $bearing = 45; $bearing <= 405; $bearing += 360/$points) {
709 709
710 $b = $bearing / $RADIAN; 710 $b = $bearing / $RADIAN;
711 711
@@ -720,313 +720,313 @@ $z-&gt;close();age&#39;: @@ -720,313 +720,313 @@ $z-&gt;close();age&#39;:
720 720
721 $kml .= " ".round($longA,$this->coordDecimals).",".round($latA,$this->coordDecimals); 721 $kml .= " ".round($longA,$this->coordDecimals).",".round($latA,$this->coordDecimals);
722 if ($altitude) $kml .= ",".$altitude; 722 if ($altitude) $kml .= ",".$altitude;
723 - } 723 + }
724 724
725 - $kml .= ' </coordinates>' . PHP_EOL  
726 - . ' </LinearRing>' . PHP_EOL  
727 - . ' </outerBoundaryIs>' . PHP_EOL; 725 + $kml .= ' </coordinates>' . PHP_EOL
  726 + . ' </LinearRing>' . PHP_EOL
  727 + . ' </outerBoundaryIs>' . PHP_EOL;
728 728
729 - if ($altitude)  
730 - {  
731 - $kml .= ' <extrude>1</extrude>' . PHP_EOL  
732 - . ' <altitudeMode>absolute</altitudeMode>' . PHP_EOL;  
733 - } 729 + if ($altitude)
  730 + {
  731 + $kml .= ' <extrude>1</extrude>' . PHP_EOL
  732 + . ' <altitudeMode>absolute</altitudeMode>' . PHP_EOL;
  733 + }
734 734
735 - $kml .= ' </Polygon>' . PHP_EOL; 735 + $kml .= ' </Polygon>' . PHP_EOL;
736 736
737 return $kml; 737 return $kml;
738 - }  
739 -  
740 -  
741 - //  
742 - // Function  
743 - // @access protected  
744 - //  
745 - public function wkt2kml($wkt, $altitude)  
746 - {  
747 -  
748 - // Change coordinate format  
749 - $wkt = preg_replace("/([0-9\.\-]+) ([0-9\.\-]+),*/e", "round('$1',2).','.round('$2',2).',$altitude '", $wkt);  
750 -  
751 - $wkt = substr($wkt, 15); // Remove 'MULTIPOLYGON(((' at the beginning  
752 - $wkt = substr($wkt, 0, -3); // Remove ')))' at the end  
753 - $polygons = explode(')),((', $wkt); // Find all polygons  
754 - $kml = ' <MultiGeometry>' . PHP_EOL;  
755 -  
756 - foreach ($polygons as $polygon) {  
757 - $kml .= ' <Polygon>' . PHP_EOL;  
758 - $boundary = explode('),(', $polygon); // Find all polygon boundaries  
759 - $kml .= ' <outerBoundaryIs>' . PHP_EOL  
760 - . ' <LinearRing>' . PHP_EOL  
761 - . ' <coordinates>' . self::kmlReverseCoordinates($boundary[0]) . ' </coordinates>' . PHP_EOL  
762 - . ' </LinearRing>' . PHP_EOL  
763 - . ' </outerBoundaryIs>' . PHP_EOL;  
764 -  
765 - for ($i=1; $i < count($boundary); $i++) { // If inner boundaries  
766 - $kml .= ' <innerBoundaryIs>' . PHP_EOL  
767 - . ' <LinearRing>' . PHP_EOL  
768 - . ' <coordinates>' . self::kmlReverseCoordinates($boundary[$i]) . ' </coordinates>' . PHP_EOL  
769 - . ' </LinearRing>' . PHP_EOL  
770 - . ' </innerBoundaryIs>' . PHP_EOL;  
771 - }  
772 - $kml .= ' </Polygon>' . PHP_EOL;  
773 - }  
774 - $kml .= ' </MultiGeometry>' . PHP_EOL;  
775 -  
776 - if ($altitude)  
777 - {  
778 - $kml = str_replace('<Polygon>', '<Polygon><extrude>1</extrude><tessellate>1</tessellate><altitudeMode>absolute</altitudeMode>', $kml);  
779 - }  
780 -  
781 - return $kml;  
782 - }  
783 -  
784 - //  
785 - // Function  
786 - // @access protected  
787 - //  
788 - function kmlReverseCoordinates($coordinates)  
789 - {  
790 - $coordinates = explode(" ", $coordinates);  
791 - $coordinates = array_reverse($coordinates);  
792 - $coordinates = implode(" ", $coordinates);  
793 - return $coordinates;  
794 - }  
795 -  
796 - // Generates KML colour  
797 - function rgb2bgr($rgb)  
798 - {  
799 - $colour = dechex($this->kmlAlphaColour) . substr($rgb, -2) . substr($rgb, 2, 2) . substr($rgb, 0, 2);  
800 - return $colour;  
801 - }  
802 -  
803 - // Generates COLLADA colour  
804 - function rgb2collada($rgb)  
805 - {  
806 - $red = number_format(hexdec(substr($rgb, 0, 2)) / 255, 6);  
807 - $green = number_format(hexdec(substr($rgb, 2, 2)) / 255, 6);  
808 - $blue = number_format(hexdec(substr($rgb, -2)) / 255, 6);  
809 -  
810 - $colour = "$red $green $blue 1"; // Transparency not supported in GE?  
811 - return $colour;  
812 - }  
813 -  
814 -  
815 - // Generates a colour scale  
816 - function makeColourScale(){  
817 -  
818 - // Extract red/green/blue decimal values from hexadecimal colours  
819 - $this->startColourRGB = array(hexdec(substr($this->startColour, 0, 2)),  
820 - hexdec(substr($this->startColour, 2, 2)),  
821 - hexdec(substr($this->startColour, 4, 2)));  
822 -  
823 - $this->endColourRGB = array(hexdec(substr($this->endColour, 0, 2)),  
824 - hexdec(substr($this->endColour, 2, 2)),  
825 - hexdec(substr($this->endColour, 4, 2)));  
826 -  
827 - // Calculate the change value for red/green/blue  
828 - $this->deltaColourRGB = array($this->endColourRGB[0] - $this->startColourRGB[0],  
829 - $this->endColourRGB[1] - $this->startColourRGB[1],  
830 - $this->endColourRGB[2] - $this->startColourRGB[2]);  
831 - }  
832 -  
833 - function getColourValue($value, $format){  
834 - $red = $this->startColourRGB[0] + ($this->deltaColourRGB[0] / ($this->maxValue - $this->minValue)) * ($value - $this->minValue);  
835 - $green = $this->startColourRGB[1] + ($this->deltaColourRGB[1] / ($this->maxValue - $this->minValue)) * ($value - $this->minValue);  
836 - $blue = $this->startColourRGB[2] + ($this->deltaColourRGB[2] / ($this->maxValue - $this->minValue)) * ($value - $this->minValue);  
837 -  
838 - if ($format == 'kml') {  
839 - $colour = sprintf('%02X%02X%02X%02X', $this->kmlAlphaColour, $blue, $green, $red);  
840 - }  
841 - else { // Hex colour  
842 - $colour = sprintf('%02X%02X%02X', $red, $green, $blue);  
843 - }  
844 -  
845 - return $colour;  
846 - }  
847 -  
848 - function getColourLegend(){  
849 - $height = $this->colourLegendHeight;  
850 - $width = $this->colourLegendWidth;  
851 -  
852 - // Create colour scale canvas  
853 - $legend = imagecreatetruecolor(150, $height+6);  
854 -  
855 - // Allocate colours  
856 - $bgColour = imagecolorallocatealpha($legend, 255, 255, 255, 127);  
857 - $white = $fontColour = imagecolorallocate($legend, 255, 255, 255);  
858 - imageSaveAlpha($legend, true);  
859 -  
860 - // Set background colour  
861 - imagefill($legend, 0, 0, $bgColour);  
862 -  
863 - switch ($this->classification) {  
864 -  
865 - case 'unclassed':  
866 - for ($i = 0; $i <= $height; $i++) {  
867 - $red = intval($this->endColourRGB[0] - (($this->deltaColourRGB[0] / $height) * $i));  
868 - $green = intval($this->endColourRGB[1] - (($this->deltaColourRGB[1] / $height) * $i));  
869 - $blue = intval($this->endColourRGB[2] - (($this->deltaColourRGB[2] / $height) * $i));  
870 - $myColourScale[] = imagecolorallocate($legend, $red, $green, $blue);  
871 - }  
872 - // Draw colour scale  
873 - imagesetstyle($legend, $myColourScale);  
874 -  
875 - for ($i = 0; $i < $width; $i++) {  
876 - imageline($legend, 21+$i, 2, 21+$i, $height+2, IMG_COLOR_STYLED);  
877 - }  
878 -  
879 - // print min and max values  
880 - //number_format(($s / $ocorrencias),2,",",".")  
881 - //imagestring($legend, 3, $width+29, $height-6, number_format($this->minValue, $this->precision), $fontColour);  
882 - //imagestring($legend, 3, $width+29, -3, number_format($this->maxValue, $this->precision), $fontColour);  
883 - imagestring($legend, 3, $width+29, $height-6, number_format($this->minValue, 2,",","."), $fontColour);  
884 - imagestring($legend, 3, $width+29, -3, number_format($this->maxValue, 2,",","."), $fontColour);  
885 -  
886 - break;  
887 -  
888 - // classed (equal intervals / quantiles)  
889 - default:  
890 - $ypos = 0;  
891 - $interval = $height / $this->numClasses;  
892 - $v = $this->classColours;  
893 - foreach($v as $key => $colour){  
894 - $red = hexdec(substr($colour, 0, 2));  
895 - $green = hexdec(substr($colour, 2, 2));  
896 - $blue = hexdec(substr($colour, 4, 2));  
897 -  
898 - $classColour = imagecolorallocate($legend, $red, $green, $blue);  
899 - imagefilledrectangle($legend, 21, $height-$ypos+2, $width+20, $height-$ypos-$interval, $classColour);  
900 -  
901 - //imagestring($legend, 3, $width+29, $height-$ypos-5, number_format($this->classBreaks[$key], $this->precision), $fontColour);  
902 - imagestring($legend, 3, $width+29, $height-$ypos-5, number_format($this->classBreaks[$key], 2,",","."), $fontColour);  
903 -  
904 - $ypos += $interval;  
905 - }  
906 - //imagestring($legend, 3, $width+29, -3, number_format($this->classBreaks[$key+1], $this->precision), $fontColour);  
907 - imagestring($legend, 3, $width+29, -3, number_format($this->classBreaks[$key+1], 2,",","."), $fontColour);  
908 -  
909 - }  
910 -  
911 - // Border around colour scale  
912 - imagerectangle($legend, 19, 0, $width+22, $height+4, $white);  
913 - imagerectangle($legend, 20, 1, $width+21, $height+3, $white);  
914 -  
915 - // Legend title  
916 - //imagestringup($legend, 3, 0, ($height/2)+(strlen($this->mapTitle)/2)*7, $this->mapTitle, $white);  
917 -  
918 - // Save legend  
919 - $file = $this->dirtmp.'/legend'. time() .'.png';  
920 - imagepng($legend, $file);  
921 -  
922 - return $file;  
923 - }  
924 -  
925 -  
926 - function getSymbolSize($value, $geometry)  
927 - {  
928 - switch ($geometry) {  
929 - case 'circle': // Returns radius of the circle  
930 - case 'square': // Returns length of a side  
931 - return sqrt($value/$this->maxValue)*$this->symbolMaxSize;  
932 - case 'column': // Returns height of the column  
933 - return ($value/$this->maxValue)*$this->symbolMaxSize;  
934 - case 'sphere': // Returns radius of the sphere  
935 - case 'cube': // Returns length of a side  
936 - return pow($value/$this->maxValue, 1/3)*$this->symbolMaxSize;  
937 } 738 }
938 - }  
939 -  
940 - function makeClasses($classification, $numClasses){  
941 - $this->classBreaks = array();  
942 -  
943 - switch ($classification) {  
944 -  
945 - case 'equal':  
946 - $interval = ($this->maxValue - $this->minValue) / $numClasses;  
947 - for ($i = 0; $i < $numClasses; $i++) {  
948 - $position = $this->minValue + ($interval * $i);  
949 - $this->classBreaks[] = round($position, $this->precision);  
950 - }  
951 - $this->classBreaks[] = $this->maxValue; // Last class break = biggest value  
952 - break;  
953 -  
954 - case 'quantile':  
955 - $values = array_values($this->indicator['values'][$this->year]);  
956 - sort($values);  
957 - $numValues = count($values);  
958 - $classNum = $numValues / $numClasses; // Number in each class  
959 - for ($i = 0; $i < $numClasses; $i++) {  
960 - $position = (int)($classNum * $i);  
961 - $this->classBreaks[] = $values[$position];  
962 - }  
963 - $this->classBreaks[] = $values[$numValues-1]; // Last class break = biggest value 739 +
  740 +
  741 + //
  742 + // Function
  743 + // @access protected
  744 + //
  745 + public function wkt2kml($wkt, $altitude)
  746 + {
  747 +
  748 + // Change coordinate format
  749 + $wkt = preg_replace("/([0-9\.\-]+) ([0-9\.\-]+),*/e", "round('$1',2).','.round('$2',2).',$altitude '", $wkt);
  750 +
  751 + $wkt = substr($wkt, 15); // Remove 'MULTIPOLYGON(((' at the beginning
  752 + $wkt = substr($wkt, 0, -3); // Remove ')))' at the end
  753 + $polygons = explode(')),((', $wkt); // Find all polygons
  754 + $kml = ' <MultiGeometry>' . PHP_EOL;
  755 +
  756 + foreach ($polygons as $polygon) {
  757 + $kml .= ' <Polygon>' . PHP_EOL;
  758 + $boundary = explode('),(', $polygon); // Find all polygon boundaries
  759 + $kml .= ' <outerBoundaryIs>' . PHP_EOL
  760 + . ' <LinearRing>' . PHP_EOL
  761 + . ' <coordinates>' . self::kmlReverseCoordinates($boundary[0]) . ' </coordinates>' . PHP_EOL
  762 + . ' </LinearRing>' . PHP_EOL
  763 + . ' </outerBoundaryIs>' . PHP_EOL;
  764 +
  765 + for ($i=1; $i < count($boundary); $i++) { // If inner boundaries
  766 + $kml .= ' <innerBoundaryIs>' . PHP_EOL
  767 + . ' <LinearRing>' . PHP_EOL
  768 + . ' <coordinates>' . self::kmlReverseCoordinates($boundary[$i]) . ' </coordinates>' . PHP_EOL
  769 + . ' </LinearRing>' . PHP_EOL
  770 + . ' </innerBoundaryIs>' . PHP_EOL;
  771 + }
  772 + $kml .= ' </Polygon>' . PHP_EOL;
  773 + }
  774 + $kml .= ' </MultiGeometry>' . PHP_EOL;
  775 +
  776 + if ($altitude)
  777 + {
  778 + $kml = str_replace('<Polygon>', '<Polygon><extrude>1</extrude><tessellate>1</tessellate><altitudeMode>absolute</altitudeMode>', $kml);
  779 + }
  780 +
  781 + return $kml;
  782 + }
  783 +
  784 + //
  785 + // Function
  786 + // @access protected
  787 + //
  788 + function kmlReverseCoordinates($coordinates)
  789 + {
  790 + $coordinates = explode(" ", $coordinates);
  791 + $coordinates = array_reverse($coordinates);
  792 + $coordinates = implode(" ", $coordinates);
  793 + return $coordinates;
  794 + }
  795 +
  796 + // Generates KML colour
  797 + function rgb2bgr($rgb)
  798 + {
  799 + $colour = dechex($this->kmlAlphaColour) . substr($rgb, -2) . substr($rgb, 2, 2) . substr($rgb, 0, 2);
  800 + return $colour;
  801 + }
  802 +
  803 + // Generates COLLADA colour
  804 + function rgb2collada($rgb)
  805 + {
  806 + $red = number_format(hexdec(substr($rgb, 0, 2)) / 255, 6);
  807 + $green = number_format(hexdec(substr($rgb, 2, 2)) / 255, 6);
  808 + $blue = number_format(hexdec(substr($rgb, -2)) / 255, 6);
  809 +
  810 + $colour = "$red $green $blue 1"; // Transparency not supported in GE?
  811 + return $colour;
  812 + }
  813 +
  814 +
  815 + // Generates a colour scale
  816 + function makeColourScale(){
  817 +
  818 + // Extract red/green/blue decimal values from hexadecimal colours
  819 + $this->startColourRGB = array(hexdec(substr($this->startColour, 0, 2)),
  820 + hexdec(substr($this->startColour, 2, 2)),
  821 + hexdec(substr($this->startColour, 4, 2)));
  822 +
  823 + $this->endColourRGB = array(hexdec(substr($this->endColour, 0, 2)),
  824 + hexdec(substr($this->endColour, 2, 2)),
  825 + hexdec(substr($this->endColour, 4, 2)));
  826 +
  827 + // Calculate the change value for red/green/blue
  828 + $this->deltaColourRGB = array($this->endColourRGB[0] - $this->startColourRGB[0],
  829 + $this->endColourRGB[1] - $this->startColourRGB[1],
  830 + $this->endColourRGB[2] - $this->startColourRGB[2]);
  831 + }
  832 +
  833 + function getColourValue($value, $format){
  834 + $red = $this->startColourRGB[0] + ($this->deltaColourRGB[0] / ($this->maxValue - $this->minValue)) * ($value - $this->minValue);
  835 + $green = $this->startColourRGB[1] + ($this->deltaColourRGB[1] / ($this->maxValue - $this->minValue)) * ($value - $this->minValue);
  836 + $blue = $this->startColourRGB[2] + ($this->deltaColourRGB[2] / ($this->maxValue - $this->minValue)) * ($value - $this->minValue);
  837 +
  838 + if ($format == 'kml') {
  839 + $colour = sprintf('%02X%02X%02X%02X', $this->kmlAlphaColour, $blue, $green, $red);
  840 + }
  841 + else { // Hex colour
  842 + $colour = sprintf('%02X%02X%02X', $red, $green, $blue);
  843 + }
  844 +
  845 + return $colour;
  846 + }
  847 +
  848 + function getColourLegend(){
  849 + $height = $this->colourLegendHeight;
  850 + $width = $this->colourLegendWidth;
  851 +
  852 + // Create colour scale canvas
  853 + $legend = imagecreatetruecolor(150, $height+6);
  854 +
  855 + // Allocate colours
  856 + $bgColour = imagecolorallocatealpha($legend, 255, 255, 255, 127);
  857 + $white = $fontColour = imagecolorallocate($legend, 255, 255, 255);
  858 + imageSaveAlpha($legend, true);
  859 +
  860 + // Set background colour
  861 + imagefill($legend, 0, 0, $bgColour);
  862 +
  863 + switch ($this->classification) {
  864 +
  865 + case 'unclassed':
  866 + for ($i = 0; $i <= $height; $i++) {
  867 + $red = intval($this->endColourRGB[0] - (($this->deltaColourRGB[0] / $height) * $i));
  868 + $green = intval($this->endColourRGB[1] - (($this->deltaColourRGB[1] / $height) * $i));
  869 + $blue = intval($this->endColourRGB[2] - (($this->deltaColourRGB[2] / $height) * $i));
  870 + $myColourScale[] = imagecolorallocate($legend, $red, $green, $blue);
  871 + }
  872 + // Draw colour scale
  873 + imagesetstyle($legend, $myColourScale);
  874 +
  875 + for ($i = 0; $i < $width; $i++) {
  876 + imageline($legend, 21+$i, 2, 21+$i, $height+2, IMG_COLOR_STYLED);
  877 + }
  878 +
  879 + // print min and max values
  880 + //number_format(($s / $ocorrencias),2,",",".")
  881 + //imagestring($legend, 3, $width+29, $height-6, number_format($this->minValue, $this->precision), $fontColour);
  882 + //imagestring($legend, 3, $width+29, -3, number_format($this->maxValue, $this->precision), $fontColour);
  883 + imagestring($legend, 3, $width+29, $height-6, number_format($this->minValue, 2,",","."), $fontColour);
  884 + imagestring($legend, 3, $width+29, -3, number_format($this->maxValue, 2,",","."), $fontColour);
  885 +
  886 + break;
  887 +
  888 + // classed (equal intervals / quantiles)
  889 + default:
  890 + $ypos = 0;
  891 + $interval = $height / $this->numClasses;
  892 + $v = $this->classColours;
  893 + foreach($v as $key => $colour){
  894 + $red = hexdec(substr($colour, 0, 2));
  895 + $green = hexdec(substr($colour, 2, 2));
  896 + $blue = hexdec(substr($colour, 4, 2));
  897 +
  898 + $classColour = imagecolorallocate($legend, $red, $green, $blue);
  899 + imagefilledrectangle($legend, 21, $height-$ypos+2, $width+20, $height-$ypos-$interval, $classColour);
  900 +
  901 + //imagestring($legend, 3, $width+29, $height-$ypos-5, number_format($this->classBreaks[$key], $this->precision), $fontColour);
  902 + imagestring($legend, 3, $width+29, $height-$ypos-5, number_format($this->classBreaks[$key], 2,",","."), $fontColour);
  903 +
  904 + $ypos += $interval;
  905 + }
  906 + //imagestring($legend, 3, $width+29, -3, number_format($this->classBreaks[$key+1], $this->precision), $fontColour);
  907 + imagestring($legend, 3, $width+29, -3, number_format($this->classBreaks[$key+1], 2,",","."), $fontColour);
  908 +
  909 + }
  910 +
  911 + // Border around colour scale
  912 + imagerectangle($legend, 19, 0, $width+22, $height+4, $white);
  913 + imagerectangle($legend, 20, 1, $width+21, $height+3, $white);
  914 +
  915 + // Legend title
  916 + //imagestringup($legend, 3, 0, ($height/2)+(strlen($this->mapTitle)/2)*7, $this->mapTitle, $white);
  917 +
  918 + // Save legend
  919 + $file = $this->dirtmp.'/legend'. time() .'.png';
  920 + imagepng($legend, $file);
  921 +
  922 + return $file;
  923 + }
  924 +
  925 +
  926 + function getSymbolSize($value, $geometry)
  927 + {
  928 + switch ($geometry) {
  929 + case 'circle': // Returns radius of the circle
  930 + case 'square': // Returns length of a side
  931 + return sqrt($value/$this->maxValue)*$this->symbolMaxSize;
  932 + case 'column': // Returns height of the column
  933 + return ($value/$this->maxValue)*$this->symbolMaxSize;
  934 + case 'sphere': // Returns radius of the sphere
  935 + case 'cube': // Returns length of a side
  936 + return pow($value/$this->maxValue, 1/3)*$this->symbolMaxSize;
  937 + }
  938 + }
  939 +
  940 + function makeClasses($classification, $numClasses){
  941 + $this->classBreaks = array();
  942 +
  943 + switch ($classification) {
  944 +
  945 + case 'equal':
  946 + $interval = ($this->maxValue - $this->minValue) / $numClasses;
  947 + for ($i = 0; $i < $numClasses; $i++) {
  948 + $position = $this->minValue + ($interval * $i);
  949 + $this->classBreaks[] = round($position, $this->precision);
  950 + }
  951 + $this->classBreaks[] = $this->maxValue; // Last class break = biggest value
  952 + break;
  953 +
  954 + case 'quantile':
  955 + $values = array_values($this->indicator['values'][$this->year]);
  956 + sort($values);
  957 + $numValues = count($values);
  958 + $classNum = $numValues / $numClasses; // Number in each class
  959 + for ($i = 0; $i < $numClasses; $i++) {
  960 + $position = (int)($classNum * $i);
  961 + $this->classBreaks[] = $values[$position];
  962 + }
  963 + $this->classBreaks[] = $values[$numValues-1]; // Last class break = biggest value
  964 + }
  965 +
  966 + // Make class colours (could be separate function)
  967 + for ($i = 0; $i < $numClasses; $i++) {
  968 + $red = (int)($this->startColourRGB[0] + ($this->deltaColourRGB[0] / ($numClasses - 1)) * $i);
  969 + $green = (int)($this->startColourRGB[1] + ($this->deltaColourRGB[1] / ($numClasses - 1)) * $i);
  970 + $blue = (int)($this->startColourRGB[2] + ($this->deltaColourRGB[2] / ($numClasses - 1)) * $i);
  971 +
  972 + $this->classColours[$i] = sprintf('%02X%02X%02X', $red, $green, $blue);
  973 + }
964 } 974 }
965 975
966 - // Make class colours (could be separate function)  
967 - for ($i = 0; $i < $numClasses; $i++) {  
968 - $red = (int)($this->startColourRGB[0] + ($this->deltaColourRGB[0] / ($numClasses - 1)) * $i);  
969 - $green = (int)($this->startColourRGB[1] + ($this->deltaColourRGB[1] / ($numClasses - 1)) * $i);  
970 - $blue = (int)($this->startColourRGB[2] + ($this->deltaColourRGB[2] / ($numClasses - 1)) * $i);  
971 -  
972 - $this->classColours[$i] = sprintf('%02X%02X%02X', $red, $green, $blue);  
973 - }  
974 - }  
975 -  
976 -  
977 - function getClass($value){  
978 - $class = 0;  
979 - //var_dump($this->classBreaks);exit;  
980 - for ($i = 1; $i < count($this->classBreaks); $i++) {  
981 - if ($value > $this->classBreaks[$i] && $value <= $this->classBreaks[$i+1]) {  
982 - $class = $i;  
983 - }  
984 - }  
985 - return $class;  
986 - }  
987 -  
988 - function mapTitleImage(){  
989 - $title = explode('|', wordwrap($this->mapTitle, 25, "|", true));  
990 - $source = explode('|', wordwrap($this->mapSource, 25, "|", true));  
991 -  
992 - // Calculate text height (15px for each text line)  
993 - $textSize = (count($title) + count($source)) * 15;  
994 -  
995 - // Create new legend canvas  
996 - $legend = imagecreatetruecolor(200, 56 + $textSize);  
997 -  
998 - // Allocate colours  
999 - $bgColour = imagecolorallocatealpha($legend, 255, 255, 255, 10);  
1000 - $black = $fontColour = imagecolorallocate($legend, 0, 0, 0);  
1001 - imageSaveAlpha($legend, true);  
1002 -  
1003 - // Set background colour  
1004 - imagefill($legend, 0, 0, $bgColour);  
1005 -  
1006 - // Add logo  
1007 - $legendTop = imagecreatefrompng($this->logo);  
1008 - imagecopy($legend, $legendTop, 0, 0, 0, 0, 200, 30);  
1009 -  
1010 - // Print title  
1011 - $ypos = 37;  
1012 - foreach($title as $line){  
1013 -  
1014 - imagestring($legend, 3, 100-(strlen($line)*7)/2, $ypos, $line, $fontColour);  
1015 - $ypos += 15;  
1016 - }  
1017 -  
1018 - // Print source  
1019 - foreach($source as $line){  
1020 - $ypos += 15;  
1021 - imagestring($legend, 2, 192-(strlen($line)*6), $ypos, $line, $fontColour);  
1022 - }  
1023 -  
1024 - // Save legend  
1025 - $file = $this->dirtmp.'/logo'. time() .'.png';  
1026 - imagepng($legend, $file);  
1027 -  
1028 - return $file;  
1029 - } 976 +
  977 + function getClass($value){
  978 + $class = 0;
  979 + //var_dump($this->classBreaks);exit;
  980 + for ($i = 1; $i < count($this->classBreaks); $i++) {
  981 + if ($value > $this->classBreaks[$i] && $value <= $this->classBreaks[$i+1]) {
  982 + $class = $i;
  983 + }
  984 + }
  985 + return $class;
  986 + }
  987 +
  988 + function mapTitleImage(){
  989 + $title = explode('|', wordwrap($this->mapTitle, 25, "|", true));
  990 + $source = explode('|', wordwrap($this->mapSource, 25, "|", true));
  991 +
  992 + // Calculate text height (15px for each text line)
  993 + $textSize = (count($title) + count($source)) * 15;
  994 +
  995 + // Create new legend canvas
  996 + $legend = imagecreatetruecolor(200, 56 + $textSize);
  997 +
  998 + // Allocate colours
  999 + $bgColour = imagecolorallocatealpha($legend, 255, 255, 255, 10);
  1000 + $black = $fontColour = imagecolorallocate($legend, 0, 0, 0);
  1001 + imageSaveAlpha($legend, true);
  1002 +
  1003 + // Set background colour
  1004 + imagefill($legend, 0, 0, $bgColour);
  1005 +
  1006 + // Add logo
  1007 + $legendTop = imagecreatefrompng($this->logo);
  1008 + imagecopy($legend, $legendTop, 0, 0, 0, 0, 200, 30);
  1009 +
  1010 + // Print title
  1011 + $ypos = 37;
  1012 + foreach($title as $line){
  1013 +
  1014 + imagestring($legend, 3, 100-(strlen($line)*7)/2, $ypos, $line, $fontColour);
  1015 + $ypos += 15;
  1016 + }
  1017 +
  1018 + // Print source
  1019 + foreach($source as $line){
  1020 + $ypos += 15;
  1021 + imagestring($legend, 2, 192-(strlen($line)*6), $ypos, $line, $fontColour);
  1022 + }
  1023 +
  1024 + // Save legend
  1025 + $file = $this->dirtmp.'/logo'. time() .'.png';
  1026 + imagepng($legend, $file);
  1027 +
  1028 + return $file;
  1029 + }
1030 } // class ThematicMap 1030 } // class ThematicMap
1031 1031
1032 1032