gis_visualization.lib.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * Functions used to generate GIS visualizations.
  5. *
  6. * @package PhpMyAdmin
  7. */
  8. /**
  9. * Returns a modified sql query with only the label column
  10. * and spatial column(wrapped with 'ASTEXT()' function).
  11. *
  12. * @param string $sql_query original sql query
  13. * @param array $visualizationSettings settings for the visualization
  14. *
  15. * @return the modified sql query.
  16. */
  17. function PMA_GIS_modifyQuery($sql_query, $visualizationSettings)
  18. {
  19. $modified_query = 'SELECT ';
  20. $analyzed_query = PMA_SQP_analyze(PMA_SQP_parse($sql_query));
  21. // If select clause is not *
  22. if (trim($analyzed_query[0]['select_expr_clause']) != '*') {
  23. // If label column is chosen add it to the query
  24. if (isset($visualizationSettings['labelColumn'])
  25. && $visualizationSettings['labelColumn'] != ''
  26. ) {
  27. // Check to see whether an alias has been used on the label column
  28. $is_label_alias = false;
  29. foreach ($analyzed_query[0]['select_expr'] as $select) {
  30. if ($select['alias'] == $visualizationSettings['labelColumn']) {
  31. $modified_query .= sanitize($select) . ' AS `'
  32. . $select['alias'] . '`, ';
  33. $is_label_alias = true;
  34. break;
  35. }
  36. }
  37. // If no alias have been used on the label column
  38. if (! $is_label_alias) {
  39. foreach ($analyzed_query[0]['select_expr'] as $select) {
  40. if ($select['column'] == $visualizationSettings['labelColumn']) {
  41. $modified_query .= sanitize($select) . ', ';
  42. }
  43. }
  44. }
  45. }
  46. // Check to see whether an alias has been used on the spatial column
  47. $is_spatial_alias = false;
  48. foreach ($analyzed_query[0]['select_expr'] as $select) {
  49. if ($select['alias'] == $visualizationSettings['spatialColumn']) {
  50. $sanitized = sanitize($select);
  51. $modified_query .= 'ASTEXT(' . $sanitized . ') AS `'
  52. . $select['alias'] . '`, ';
  53. // Get the SRID
  54. $modified_query .= 'SRID(' . $sanitized . ') AS `srid` ';
  55. $is_spatial_alias = true;
  56. break;
  57. }
  58. }
  59. // If no alias have been used on the spatial column
  60. if (! $is_spatial_alias) {
  61. foreach ($analyzed_query[0]['select_expr'] as $select) {
  62. if ($select['column'] == $visualizationSettings['spatialColumn']) {
  63. $sanitized = sanitize($select);
  64. $modified_query .= 'ASTEXT(' . $sanitized
  65. . ') AS `' . $select['column'] . '`, ';
  66. // Get the SRID
  67. $modified_query .= 'SRID(' . $sanitized . ') AS `srid` ';
  68. }
  69. }
  70. }
  71. // If select clause is *
  72. } else {
  73. // If label column is chosen add it to the query
  74. if (isset($visualizationSettings['labelColumn'])
  75. && $visualizationSettings['labelColumn'] != ''
  76. ) {
  77. $modified_query .= '`' . $visualizationSettings['labelColumn'] .'`, ';
  78. }
  79. // Wrap the spatial column with 'ASTEXT()' function and add it
  80. $modified_query .= 'ASTEXT(`' . $visualizationSettings['spatialColumn']
  81. . '`) AS `' . $visualizationSettings['spatialColumn'] . '`, ';
  82. // Get the SRID
  83. $modified_query .= 'SRID(`' . $visualizationSettings['spatialColumn']
  84. . '`) AS `srid` ';
  85. }
  86. // Append the rest of the query
  87. $from_pos = stripos($sql_query, 'FROM');
  88. $modified_query .= substr($sql_query, $from_pos);
  89. return $modified_query;
  90. }
  91. // Local function to sanitize the expression taken
  92. // from the results of PMA_SQP_analyze function.
  93. function sanitize($select)
  94. {
  95. $table_col = $select['table_name'] . "." . $select['column'];
  96. $db_table_col = $select['db'] . "." . $select['table_name']
  97. . "." . $select['column'];
  98. if ($select['expr'] == $select['column']) {
  99. return "`" . $select['column'] . "`";
  100. } elseif ($select['expr'] == $table_col) {
  101. return "`" . $select['table_name'] . "`.`" . $select['column'] . "`";
  102. } elseif ($select['expr'] == $db_table_col) {
  103. return "`" . $select['db'] . "`.`" . $select['table_name']
  104. . "`.`" . $select['column'] . "`";
  105. }
  106. return $select['expr'];
  107. }
  108. /**
  109. * Formats a visualization for the GIS query results.
  110. *
  111. * @param array $data Data for the status chart
  112. * @param array &$visualizationSettings Settings used to generate the chart
  113. * @param string $format Format of the visulaization
  114. *
  115. * @return string HTML and JS code for the GIS visualization
  116. */
  117. function PMA_GIS_visualizationResults($data, &$visualizationSettings, $format)
  118. {
  119. include_once './libraries/gis/pma_gis_visualization.php';
  120. include_once './libraries/gis/pma_gis_factory.php';
  121. if (! isset($data[0])) {
  122. // empty data
  123. return __('No data found for GIS visualization.');
  124. } else {
  125. $visualization = new PMA_GIS_Visualization($data, $visualizationSettings);
  126. if ($visualizationSettings != null) {
  127. foreach ($visualization->getSettings() as $setting => $val) {
  128. if (! isset($visualizationSettings[$setting])) {
  129. $visualizationSettings[$setting] = $val;
  130. }
  131. }
  132. }
  133. if ($format == 'svg') {
  134. return $visualization->asSvg();
  135. } elseif ($format == 'png') {
  136. return $visualization->asPng();
  137. } elseif ($format == 'ol') {
  138. return $visualization->asOl();
  139. }
  140. }
  141. }
  142. /**
  143. * Generate visualization for the GIS query results and save it to a file.
  144. *
  145. * @param array $data data for the status chart
  146. * @param array $visualizationSettings settings used to generate the chart
  147. * @param string $format format of the visulaization
  148. * @param string $fileName file name
  149. *
  150. * @return file File containing the visualization
  151. */
  152. function PMA_GIS_saveToFile($data, $visualizationSettings, $format, $fileName)
  153. {
  154. include_once './libraries/gis/pma_gis_visualization.php';
  155. include_once './libraries/gis/pma_gis_factory.php';
  156. if (isset($data[0])) {
  157. $visualization = new PMA_GIS_Visualization($data, $visualizationSettings);
  158. if ($format == 'svg') {
  159. $visualization->toFileAsSvg($fileName);
  160. } elseif ($format == 'png') {
  161. $visualization->toFileAsPng($fileName);
  162. } elseif ($format == 'pdf') {
  163. $visualization->toFileAsPdf($fileName);
  164. }
  165. }
  166. }
  167. ?>