gis_visualization.lib.php
6.61 KB
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
<?php
/**
* Functions used to generate GIS visualizations.
*
* @package PhpMyAdmin
*/
/**
* Returns a modified sql query with only the label column
* and spatial column(wrapped with 'ASTEXT()' function).
*
* @param string $sql_query original sql query
* @param array $visualizationSettings settings for the visualization
*
* @return the modified sql query.
*/
function PMA_GIS_modifyQuery($sql_query, $visualizationSettings)
{
$modified_query = 'SELECT ';
$analyzed_query = PMA_SQP_analyze(PMA_SQP_parse($sql_query));
// If select clause is not *
if (trim($analyzed_query[0]['select_expr_clause']) != '*') {
// If label column is chosen add it to the query
if (isset($visualizationSettings['labelColumn'])
&& $visualizationSettings['labelColumn'] != ''
) {
// Check to see whether an alias has been used on the label column
$is_label_alias = false;
foreach ($analyzed_query[0]['select_expr'] as $select) {
if ($select['alias'] == $visualizationSettings['labelColumn']) {
$modified_query .= sanitize($select) . ' AS `'
. $select['alias'] . '`, ';
$is_label_alias = true;
break;
}
}
// If no alias have been used on the label column
if (! $is_label_alias) {
foreach ($analyzed_query[0]['select_expr'] as $select) {
if ($select['column'] == $visualizationSettings['labelColumn']) {
$modified_query .= sanitize($select) . ', ';
}
}
}
}
// Check to see whether an alias has been used on the spatial column
$is_spatial_alias = false;
foreach ($analyzed_query[0]['select_expr'] as $select) {
if ($select['alias'] == $visualizationSettings['spatialColumn']) {
$sanitized = sanitize($select);
$modified_query .= 'ASTEXT(' . $sanitized . ') AS `'
. $select['alias'] . '`, ';
// Get the SRID
$modified_query .= 'SRID(' . $sanitized . ') AS `srid` ';
$is_spatial_alias = true;
break;
}
}
// If no alias have been used on the spatial column
if (! $is_spatial_alias) {
foreach ($analyzed_query[0]['select_expr'] as $select) {
if ($select['column'] == $visualizationSettings['spatialColumn']) {
$sanitized = sanitize($select);
$modified_query .= 'ASTEXT(' . $sanitized
. ') AS `' . $select['column'] . '`, ';
// Get the SRID
$modified_query .= 'SRID(' . $sanitized . ') AS `srid` ';
}
}
}
// If select cluase is *
} else {
// If label column is chosen add it to the query
if (isset($visualizationSettings['labelColumn'])
&& $visualizationSettings['labelColumn'] != ''
) {
$modified_query .= '`' . $visualizationSettings['labelColumn'] .'`, ';
}
// Wrap the spatial column with 'ASTEXT()' function and add it
$modified_query .= 'ASTEXT(`' . $visualizationSettings['spatialColumn']
. '`) AS `' . $visualizationSettings['spatialColumn'] . '`, ';
// Get the SRID
$modified_query .= 'SRID(`' . $visualizationSettings['spatialColumn']
. '`) AS `srid` ';
}
// Append the rest of the query
$from_pos = stripos($sql_query, 'FROM');
$modified_query .= substr($sql_query, $from_pos);
return $modified_query;
}
// Local function to sanitize the expression taken
// from the results of PMA_SQP_analyze function.
function sanitize($select)
{
$table_col = $select['table_name'] . "." . $select['column'];
$db_table_col = $select['db'] . "." . $select['table_name']
. "." . $select['column'];
if ($select['expr'] == $select['column']) {
return "`" . $select['column'] . "`";
} elseif ($select['expr'] == $table_col) {
return "`" . $select['table_name'] . "`.`" . $select['column'] . "`";
} elseif ($select['expr'] == $db_table_col) {
return "`" . $select['db'] . "`.`" . $select['table_name']
. "`.`" . $select['column'] . "`";
}
return $select['expr'];
}
/**
* Formats a visualization for the GIS query results.
*
* @param array $data Data for the status chart
* @param array &$visualizationSettings Settings used to generate the chart
* @param string $format Format of the visulaization
*
* @return string HTML and JS code for the GIS visualization
*/
function PMA_GIS_visualizationResults($data, &$visualizationSettings, $format)
{
include_once './libraries/gis/pma_gis_visualization.php';
include_once './libraries/gis/pma_gis_factory.php';
if (! isset($data[0])) {
// empty data
return __('No data found for GIS visualization.');
} else {
$visualization = new PMA_GIS_Visualization($data, $visualizationSettings);
if ($visualizationSettings != null) {
foreach ($visualization->getSettings() as $setting => $val) {
if (! isset($visualizationSettings[$setting])) {
$visualizationSettings[$setting] = $val;
}
}
}
if ($format == 'svg') {
return $visualization->asSvg();
} elseif ($format == 'png') {
return $visualization->asPng();
} elseif ($format == 'ol') {
return $visualization->asOl();
}
}
}
/**
* Generate visualization for the GIS query results and save it to a file.
*
* @param array $data data for the status chart
* @param array $visualizationSettings settings used to generate the chart
* @param string $format format of the visulaization
* @param string $fileName file name
*
* @return file File containing the visualization
*/
function PMA_GIS_saveToFile($data, $visualizationSettings, $format, $fileName)
{
include_once './libraries/gis/pma_gis_visualization.php';
include_once './libraries/gis/pma_gis_factory.php';
if (isset($data[0])) {
$visualization = new PMA_GIS_Visualization($data, $visualizationSettings);
if ($format == 'svg') {
$visualization->toFileAsSvg($fileName);
} elseif ($format == 'png') {
$visualization->toFileAsPng($fileName);
} elseif ($format == 'pdf') {
$visualization->toFileAsPdf($fileName);
}
}
}
?>