app.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. 'use strict';
  2. //import angular from 'angular';
  3. import 'hslayers-ng/components/add-layers/add-layers.module';
  4. import 'hslayers-ng/components/datasource-selector/datasource-selector.module';
  5. import 'hslayers-ng/components/draw/draw.module';
  6. import 'hslayers-ng/components/info/info.module';
  7. import 'hslayers-ng/components/measure/measure.module';
  8. import 'hslayers-ng/components/permalink/permalink.module';
  9. import 'hslayers-ng/components/print/print.module';
  10. import 'hslayers-ng/components/query/query.module';
  11. import 'hslayers-ng/components/search/search.module';
  12. import 'hslayers-ng/components/sidebar/sidebar.module';
  13. import 'hslayers-ng/components/toolbar/toolbar.module';
  14. // hslayers-ng components must be loaded first, otherwise angular will be undefined
  15. // eslint-disable-next-line sort-imports-es6-autofix/sort-imports-es6
  16. import './adjuster/adjuster.module.js';
  17. import VectorLayer from 'ol/layer/Vector';
  18. import View from 'ol/View';
  19. import hsv2rgb from 'hsv2rgb';
  20. import nuts from './nuts.js';
  21. import {Fill, Stroke, Style} from 'ol/style';
  22. import {OSM} from 'ol/source';
  23. import {Tile} from 'ol/layer';
  24. let randomColorPalette = [];
  25. function getHostname() {
  26. const url = window.location.href;
  27. const urlArr = url.split('/');
  28. const domain = urlArr[2];
  29. return urlArr[0] + '//' + domain;
  30. }
  31. const stroke = new Stroke({
  32. color: '#3399CC',
  33. width: 0.25,
  34. });
  35. /**
  36. * https://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
  37. * @param {number} colorCount Number of colors to randomly generate
  38. * @returns {Array<Array<Number>>} Array of RGB colors
  39. */
  40. function generateRandomColorPalette(colorCount) {
  41. const palette = [];
  42. const goldenRatioConjugate = 0.618033988749895;
  43. for (let i = 0; i < colorCount; i++) {
  44. let h = Math.random();
  45. h += goldenRatioConjugate;
  46. h %= 1;
  47. h *= 360;
  48. palette.push(hsv2rgb(h, 0.5, 0.95));
  49. }
  50. // eslint-disable-next-line no-unused-vars
  51. // const h = r * 0x10000 + g * 0x100 + b * 0x1;
  52. return palette;
  53. //return `rgba(${r}, ${g}, ${b}, 0.7)`;
  54. }
  55. const styles = function (feature) {
  56. if (isNaN(feature.get('km25.cluster'))) {
  57. return [
  58. new Style({
  59. fill: new Fill({
  60. color: '#FFF',
  61. }),
  62. stroke: stroke,
  63. }),
  64. ];
  65. } else {
  66. return [
  67. new Style({
  68. fill: new Fill({
  69. color: randomColorPalette[feature.get('km25.cluster')],
  70. }),
  71. //stroke: stroke,
  72. }),
  73. ];
  74. }
  75. };
  76. const nuts2Layer = new VectorLayer({
  77. source: nuts.nuts2Source,
  78. visible: false,
  79. style: styles,
  80. title: 'NUTS2 regions',
  81. });
  82. const nuts3Layer = new VectorLayer({
  83. source: nuts.nuts3Source,
  84. visible: true,
  85. style: styles,
  86. title: 'NUTS3 regions',
  87. });
  88. //TODO: update to new PopUp config & align with new attrs
  89. nuts3Layer.set('hoveredKeys', [
  90. 'NUTS_NAME',
  91. 'totalForHumans',
  92. 'Social & Human',
  93. 'Anthropic',
  94. 'Institutional',
  95. 'Economical',
  96. 'Natural',
  97. 'Cultural',
  98. ]);
  99. nuts3Layer.set('hoveredKeysTranslations', {
  100. NUTS_NAME: 'Name',
  101. totalForHumans: 'Calculated score',
  102. });
  103. angular
  104. .module('hs', [
  105. 'hs.sidebar',
  106. 'hs.draw',
  107. 'hs.info',
  108. 'hs.toolbar',
  109. 'hs.layermanager',
  110. 'hs.query',
  111. 'hs.search',
  112. 'hs.print',
  113. 'hs.permalink',
  114. 'hs.geolocation',
  115. 'hs.datasource_selector',
  116. 'hs.save-map',
  117. 'hs.measure',
  118. 'hs.addLayers',
  119. 'pra.adjuster',
  120. ])
  121. .directive('hs', function (HsConfig, HsCore) {
  122. 'ngInject';
  123. return {
  124. template: HsCore.hslayersNgTemplate,
  125. /* link: function (scope, element) {
  126. HsCore.fullScreenMap(element);
  127. } */
  128. };
  129. })
  130. .value('HsConfig', {
  131. proxyPrefix: '../8085/',
  132. default_layers: [
  133. new Tile({
  134. source: new OSM(),
  135. title: 'OpenStreetMap',
  136. base: true,
  137. removable: false,
  138. }),
  139. nuts2Layer,
  140. nuts3Layer,
  141. ],
  142. popUpDisplay: 'hover',
  143. project_name: 'erra/map',
  144. default_view: new View({
  145. center: [2433348.3022471312, 7744501.813885343],
  146. zoom: 3.6,
  147. units: 'm',
  148. }),
  149. advanced_form: true,
  150. datasources: [],
  151. hostname: {
  152. default: {
  153. title: 'Default',
  154. type: 'default',
  155. editable: false,
  156. url: getHostname(),
  157. },
  158. },
  159. panelWidths: {},
  160. // allowAddExternalDatasets: false,
  161. panelsEnabled: {
  162. composition_browser: false,
  163. draw: false,
  164. //info: false,
  165. saveMap: false,
  166. language: false,
  167. },
  168. /*searchProvider: (q) => {
  169. return `/app/jupyter-test/8085/search/?q=${q}`;
  170. },*/
  171. sizeMode: 'fullscreen',
  172. })
  173. .controller('MainController', function (
  174. $scope,
  175. HsCore,
  176. $compile,
  177. HsLayoutService,
  178. PraAdjusterService
  179. ) {
  180. 'ngInject';
  181. const vm = this;
  182. vm.exists = HsCore.exists;
  183. vm.panelVisible = HsLayoutService.panelVisible;
  184. HsLayoutService.sidebarRight = false;
  185. // HsLayoutService.sidebarToggleable = false;
  186. // HsCore.singleDatasources = true;
  187. HsLayoutService.sidebarButtons = true;
  188. HsLayoutService.setDefaultPanel('adjuster');
  189. $scope.$on('scope_loaded', function (event, args) {
  190. if (args === 'Sidebar') {
  191. const el = angular.element(
  192. '<pra.adjuster hs.draggable ng-if="vm.exists(\'pra.adjuster\')" ng-show="vm.panelVisible(\'adjuster\', this)"></pra.adjuster>'
  193. )[0];
  194. HsLayoutService.panelListElement.appendChild(el);
  195. $compile(el)($scope);
  196. const toolbarButton = angular.element(
  197. '<div pra-adjuster-sidebar-btn></div>'
  198. )[0];
  199. HsLayoutService.sidebarListElement.appendChild(toolbarButton);
  200. $compile(toolbarButton)(event.targetScope);
  201. }
  202. });
  203. $scope.$on('clusters_loaded', function (event, args) {
  204. randomColorPalette = generateRandomColorPalette(
  205. PraAdjusterService.clusters.length
  206. );
  207. });
  208. });