TableGisVisualizationController.class.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <?php
  2. /* vim: set expandtab sw=4 ts=4 sts=4: */
  3. /**
  4. * Holds the PMA\TableIndexesController
  5. *
  6. * @package PMA
  7. */
  8. namespace PMA\Controllers\Table;
  9. use PMA\Template;
  10. use PMA_GIS_Visualization;
  11. use PMA_Message;
  12. use PMA\Controllers\TableController;
  13. require_once 'libraries/common.inc.php';
  14. require_once 'libraries/db_common.inc.php';
  15. require_once 'libraries/controllers/TableController.class.php';
  16. require_once 'libraries/gis/GIS_Visualization.class.php';
  17. require_once 'libraries/gis/GIS_Factory.class.php';
  18. require_once 'libraries/Message.class.php';
  19. /**
  20. * Class TableGisVisualizationController
  21. *
  22. * @package PMA\Controllers\Table
  23. */
  24. class TableGisVisualizationController extends TableController
  25. {
  26. /**
  27. * @var array $url_params
  28. */
  29. protected $url_params;
  30. /**
  31. * @var string $sql_query
  32. */
  33. protected $sql_query;
  34. /**
  35. * @var array $visualizationSettings
  36. */
  37. protected $visualizationSettings;
  38. /**
  39. * @var PMA_GIS_Visualization $visualization
  40. */
  41. protected $visualization;
  42. /**
  43. * Constructor
  44. *
  45. * @param string $sql_query SQL query for retrieving GIS data
  46. * @param array $url_params array of URL parameters
  47. * @param string $goto goto script
  48. * @param string $back back script
  49. * @param array $visualizationSettings visualization settings
  50. */
  51. public function __construct(
  52. $sql_query,
  53. $url_params,
  54. $goto,
  55. $back,
  56. $visualizationSettings
  57. ) {
  58. parent::__construct();
  59. $this->sql_query = $sql_query;
  60. $this->url_params = $url_params;
  61. $this->url_params['goto'] = $goto;
  62. $this->url_params['back'] = $back;
  63. $this->visualizationSettings = $visualizationSettings;
  64. }
  65. /**
  66. * Save to file
  67. *
  68. * @return void
  69. */
  70. public function saveToFileAction()
  71. {
  72. $this->response->disable();
  73. $file_name = $this->visualizationSettings['spatialColumn'];
  74. $save_format = $_REQUEST['fileFormat'];
  75. $this->visualization->toFile($file_name, $save_format);
  76. }
  77. /**
  78. * Index
  79. *
  80. * @return void
  81. */
  82. public function indexAction()
  83. {
  84. // Throw error if no sql query is set
  85. if (! isset($this->sql_query) || $this->sql_query == '') {
  86. $this->response->isSuccess(false);
  87. $this->response->addHTML(
  88. PMA_Message::error(__('No SQL query was set to fetch data.'))
  89. );
  90. return;
  91. }
  92. // Execute the query and return the result
  93. $result = $this->dbi->tryQuery($this->sql_query);
  94. // Get the meta data of results
  95. $meta = $this->dbi->getFieldsMeta($result);
  96. // Find the candidate fields for label column and spatial column
  97. $labelCandidates = array();
  98. $spatialCandidates = array();
  99. foreach ($meta as $column_meta) {
  100. if ($column_meta->type == 'geometry') {
  101. $spatialCandidates[] = $column_meta->name;
  102. } else {
  103. $labelCandidates[] = $column_meta->name;
  104. }
  105. }
  106. // Get settings if any posted
  107. if (PMA_isValid($_REQUEST['visualizationSettings'], 'array')) {
  108. $this->visualizationSettings = $_REQUEST['visualizationSettings'];
  109. }
  110. if (!isset($this->visualizationSettings['labelColumn'])
  111. && isset($labelCandidates[0])
  112. ) {
  113. $this->visualizationSettings['labelColumn'] = '';
  114. }
  115. // If spatial column is not set, use first geometric column as spatial column
  116. if (! isset($this->visualizationSettings['spatialColumn'])) {
  117. $this->visualizationSettings['spatialColumn'] = $spatialCandidates[0];
  118. }
  119. // Convert geometric columns from bytes to text.
  120. $pos = isset($_REQUEST['pos']) ? $_REQUEST['pos']
  121. : $_SESSION['tmpval']['pos'];
  122. if (isset($_REQUEST['session_max_rows'])) {
  123. $rows = $_REQUEST['session_max_rows'];
  124. } else {
  125. if ($_SESSION['tmpval']['max_rows'] != 'all') {
  126. $rows = $_SESSION['tmpval']['max_rows'];
  127. } else {
  128. $rows = $GLOBALS['cfg']['MaxRows'];
  129. }
  130. }
  131. $this->visualization = PMA_GIS_Visualization::get(
  132. $this->sql_query,
  133. $this->visualizationSettings,
  134. $rows,
  135. $pos
  136. );
  137. if (isset($_REQUEST['saveToFile'])) {
  138. $this->saveToFileAction();
  139. return;
  140. }
  141. $this->response->getHeader()->getScripts()->addFiles(
  142. array(
  143. 'openlayers/OpenLayers.js',
  144. 'jquery/jquery.svg.js',
  145. 'tbl_gis_visualization.js',
  146. 'OpenStreetMap.js'
  147. )
  148. );
  149. // If all the rows contain SRID, use OpenStreetMaps on the initial loading.
  150. if (! isset($_REQUEST['displayVisualization'])) {
  151. if ($this->visualization->hasSrid()) {
  152. $this->visualizationSettings['choice'] = 'useBaseLayer';
  153. } else {
  154. unset($this->visualizationSettings['choice']);
  155. }
  156. }
  157. $this->visualization->setUserSpecifiedSettings($this->visualizationSettings);
  158. if ($this->visualizationSettings != null) {
  159. foreach ($this->visualization->getSettings() as $setting => $val) {
  160. if (! isset($this->visualizationSettings[$setting])) {
  161. $this->visualizationSettings[$setting] = $val;
  162. }
  163. }
  164. }
  165. /**
  166. * Displays the page
  167. */
  168. $this->url_params['sql_query'] = $this->sql_query;
  169. $downloadUrl = 'tbl_gis_visualization.php' . PMA_URL_getCommon(
  170. array_merge(
  171. $this->url_params,
  172. array(
  173. 'saveToFile' => true,
  174. 'session_max_rows' => $rows,
  175. 'pos' => $pos
  176. )
  177. )
  178. );
  179. $svgSupport = (PMA_USR_BROWSER_AGENT == 'IE' && PMA_USR_BROWSER_VER <= 8)
  180. ? false : true;
  181. $html = Template::get('table/gis_visualization/gis_visualization')->render(
  182. array(
  183. 'url_params' => $this->url_params,
  184. 'downloadUrl' => $downloadUrl,
  185. 'labelCandidates' => $labelCandidates,
  186. 'spatialCandidates' => $spatialCandidates,
  187. 'visualizationSettings' => $this->visualizationSettings,
  188. 'sql_query' => $this->sql_query,
  189. 'visualization' => $this->visualization->toImage(
  190. $svgSupport ? 'svg' : 'png'
  191. ),
  192. 'svgSupport' => $svgSupport,
  193. 'drawOl' => $this->visualization->asOl()
  194. )
  195. );
  196. $this->response->addHTML($html);
  197. }
  198. }