qwc2 2025.10.16 → 2025.10.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/actions/locate.js +3 -2
  2. package/components/AttributeTableWidget.js +24 -15
  3. package/components/FeatureAttributesWindow.js +177 -0
  4. package/components/IdentifyViewer.js +80 -39
  5. package/components/LocationRecorder.js +138 -0
  6. package/components/PickFeature.js +87 -26
  7. package/components/PluginsContainer.js +16 -3
  8. package/components/map/OlLayer.js +2 -1
  9. package/components/map3d/HeightProfile3D.js +2 -0
  10. package/components/style/App.css +14 -0
  11. package/components/style/AttributeTableWidget.css +1 -1
  12. package/components/style/FeatureAttributesWindow.css +16 -0
  13. package/components/style/IdentifyViewer.css +5 -0
  14. package/components/style/LocationRecorder.css +10 -0
  15. package/components/style/NumericInputWindow.css +7 -0
  16. package/components/style/PluginsContainer.css +16 -0
  17. package/components/widgets/LayerCatalogWidget.js +40 -16
  18. package/components/widgets/NavBar.js +10 -3
  19. package/icons/circle_full.svg +75 -0
  20. package/package.json +1 -1
  21. package/plugins/AttributeTable.js +4 -0
  22. package/plugins/GeometryDigitizer.js +3 -0
  23. package/plugins/HeightProfile.js +2 -0
  24. package/plugins/Identify.js +7 -3
  25. package/plugins/ObjectList.js +116 -0
  26. package/plugins/Redlining.js +14 -55
  27. package/plugins/map/EditingSupport.js +22 -1
  28. package/plugins/map/LocateSupport.js +8 -1
  29. package/plugins/map/RedliningSupport.js +108 -18
  30. package/plugins/map/SnappingSupport.js +11 -6
  31. package/plugins/map/style/SnappingSupport.css +2 -13
  32. package/reducers/locate.js +4 -2
  33. package/reducers/redlining.js +2 -1
  34. package/static/translations/bg-BG.json +13 -0
  35. package/static/translations/ca-ES.json +13 -0
  36. package/static/translations/cs-CZ.json +13 -0
  37. package/static/translations/de-CH.json +13 -0
  38. package/static/translations/de-DE.json +14 -1
  39. package/static/translations/en-US.json +13 -0
  40. package/static/translations/es-ES.json +13 -0
  41. package/static/translations/fi-FI.json +13 -0
  42. package/static/translations/fr-FR.json +13 -0
  43. package/static/translations/hu-HU.json +13 -0
  44. package/static/translations/it-IT.json +13 -0
  45. package/static/translations/ja-JP.json +13 -0
  46. package/static/translations/nl-NL.json +13 -0
  47. package/static/translations/no-NO.json +13 -0
  48. package/static/translations/pl-PL.json +13 -0
  49. package/static/translations/pt-BR.json +13 -0
  50. package/static/translations/pt-PT.json +13 -0
  51. package/static/translations/ro-RO.json +13 -0
  52. package/static/translations/ru-RU.json +13 -0
  53. package/static/translations/sv-SE.json +13 -0
  54. package/static/translations/tr-TR.json +13 -0
  55. package/static/translations/tsconfig.json +10 -0
  56. package/static/translations/uk-UA.json +13 -0
  57. package/utils/EditingInterface.js +4 -1
  58. package/utils/EditingUtils.js +3 -1
  59. package/utils/MiscUtils.js +65 -0
  60. package/utils/expr_grammar/grammar.js +104 -22
  61. package/utils/expr_grammar/grammar.ne +2 -0
  62. package/utils/expr_grammar/test.js +21 -4
@@ -30,12 +30,15 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
30
30
 
31
31
  import React from 'react';
32
32
  import { connect } from 'react-redux';
33
+ import FileSaver from 'file-saver';
33
34
  import Mousetrap from 'mousetrap';
34
35
  import ol from 'openlayers';
35
36
  import PropTypes from 'prop-types';
36
37
  import { v4 as uuidv4 } from 'uuid';
37
38
  import { LayerRole, addLayerFeatures, removeLayerFeatures } from '../../actions/layers';
38
39
  import { changeRedliningState } from '../../actions/redlining';
40
+ import FeatureAttributesWindow from '../../components/FeatureAttributesWindow';
41
+ import LocationRecorder from '../../components/LocationRecorder';
39
42
  import NumericInputWindow from '../../components/NumericInputWindow';
40
43
  import { OlLayerAdded, OlLayerUpdated } from '../../components/map/OlLayer';
41
44
  import FeatureStyles from '../../utils/FeatureStyles';
@@ -59,7 +62,8 @@ var GeomTypeConfig = {
59
62
  }));
60
63
  },
61
64
  editTool: 'Pick',
62
- drawNodes: true
65
+ drawNodes: true,
66
+ showRecordLocation: true
63
67
  },
64
68
  LineString: {
65
69
  drawInteraction: function drawInteraction(opts) {
@@ -68,7 +72,8 @@ var GeomTypeConfig = {
68
72
  }));
69
73
  },
70
74
  editTool: 'Pick',
71
- drawNodes: true
75
+ drawNodes: true,
76
+ showRecordLocation: true
72
77
  },
73
78
  Polygon: {
74
79
  drawInteraction: function drawInteraction(opts) {
@@ -130,7 +135,11 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
130
135
  var _this;
131
136
  _classCallCheck(this, RedliningSupport);
132
137
  _this = _callSuper(this, RedliningSupport, [props]);
138
+ _defineProperty(_this, "state", {
139
+ showRecordLocation: false
140
+ });
133
141
  _defineProperty(_this, "updateCurrentFeature", function (feature) {
142
+ var deletedKeys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
134
143
  if (_this.currentFeature && _this.props.redlining.selectedFeature) {
135
144
  if (feature.circleParams) {
136
145
  var circleParams = feature.circleParams;
@@ -138,6 +147,10 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
138
147
  } else {
139
148
  _this.currentFeature.getGeometry().setCoordinates(feature.geometry.coordinates);
140
149
  }
150
+ _this.currentFeature.setProperties(feature.properties, true);
151
+ deletedKeys.forEach(function (key) {
152
+ _this.currentFeature.unset(key);
153
+ });
141
154
  _this.props.changeRedliningState({
142
155
  selectedFeature: feature,
143
156
  geomType: feature.shape
@@ -244,6 +257,9 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
244
257
  }, _this);
245
258
  _this.props.map.addInteraction(drawInteraction);
246
259
  _this.interactions.push(drawInteraction);
260
+ _this.setState({
261
+ showRecordLocation: geomTypeConfig.showRecordLocation
262
+ });
247
263
  });
248
264
  _defineProperty(_this, "updateMeasurements", function () {
249
265
  if (_this.blockOnChange || !_this.currentFeature) {
@@ -310,9 +326,7 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
310
326
  });
311
327
  });
312
328
  _defineProperty(_this, "leaveTemporaryEditMode", function () {
313
- if (_this.currentFeature) {
314
- _this.commitCurrentFeature(_this.props.redlining);
315
- }
329
+ _this.commitCurrentFeature(_this.props.redlining);
316
330
  if (_this.picking) {
317
331
  // Remove modify interactions
318
332
  _this.props.map.removeInteraction(_this.interactions.pop());
@@ -333,9 +347,7 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
333
347
  if (evt.selected.length === 1 && evt.selected[0] === _this.currentFeature) {
334
348
  return;
335
349
  }
336
- if (_this.currentFeature) {
337
- _this.commitCurrentFeature(_this.props.redlining);
338
- }
350
+ _this.commitCurrentFeature(_this.props.redlining);
339
351
  if (currentEditInteraction) {
340
352
  _this.props.map.removeInteraction(currentEditInteraction);
341
353
  _this.interactions = _this.interactions.filter(function (i) {
@@ -377,9 +389,7 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
377
389
  if (evt.feature === _this.currentFeature) {
378
390
  return;
379
391
  }
380
- if (_this.currentFeature) {
381
- _this.commitCurrentFeature(_this.props.redlining);
382
- }
392
+ _this.commitCurrentFeature(_this.props.redlining);
383
393
  if (evt.feature) {
384
394
  _this.setCurrentFeature(evt.feature);
385
395
  }
@@ -513,7 +523,7 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
513
523
  var newFeature = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
514
524
  var feature = _this.currentFeatureObject();
515
525
  if (!feature) {
516
- return;
526
+ return null;
517
527
  }
518
528
  // Don't commit empty/invalid features
519
529
  if (feature.shape === "Text" && !feature.properties.label || feature.shape === "Circle" && feature.circleParams.radius === 0 || ((_feature$geometry = feature.geometry) === null || _feature$geometry === void 0 ? void 0 : _feature$geometry.type) === "Polygon" && _this.currentFeature.getGeometry().getArea() === 0) {
@@ -521,7 +531,7 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
521
531
  _this.props.removeLayerFeatures(redliningProps.layer, [feature.id]);
522
532
  }
523
533
  _this.resetSelectedFeature();
524
- return;
534
+ return null;
525
535
  }
526
536
  if (feature.shape === "Circle") {
527
537
  var _feature$circleParams = feature.circleParams,
@@ -543,6 +553,7 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
543
553
  };
544
554
  _this.props.addLayerFeatures(layer, [feature]);
545
555
  _this.resetSelectedFeature();
556
+ return feature;
546
557
  });
547
558
  _defineProperty(_this, "resetSelectedFeature", function () {
548
559
  if (_this.currentFeature) {
@@ -558,6 +569,9 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
558
569
  }
559
570
  });
560
571
  _defineProperty(_this, "reset", function (redliningProps) {
572
+ _this.setState({
573
+ showRecordLocation: false
574
+ });
561
575
  while (_this.interactions.length > 0) {
562
576
  _this.props.map.removeInteraction(_this.interactions.shift());
563
577
  }
@@ -604,6 +618,49 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
604
618
  }
605
619
  return feature;
606
620
  });
621
+ _defineProperty(_this, "export", function () {
622
+ var currentFeature = _this.commitCurrentFeature(_this.props.redlining);
623
+ var layer = _this.props.layers.find(function (l) {
624
+ return l.id === _this.props.redlining.layer;
625
+ });
626
+ if (!layer) {
627
+ return;
628
+ }
629
+ if (_this.props.redlining.format === "geojson") {
630
+ var geojson = JSON.stringify({
631
+ type: "FeatureCollection",
632
+ features: layer.features.map(function (feature) {
633
+ var newFeature = _objectSpread({}, feature.id === currentFeature.id ? currentFeature : feature);
634
+ newFeature.geometry = VectorLayerUtils.reprojectGeometry(feature.geometry, feature.crs || _this.props.mapCrs, 'EPSG:4326');
635
+ delete newFeature.crs;
636
+ return newFeature;
637
+ })
638
+ }, null, ' ');
639
+ FileSaver.saveAs(new Blob([geojson], {
640
+ type: "text/plain;charset=utf-8"
641
+ }), layer.title + ".json");
642
+ } else if (_this.props.redlining.format === "kml") {
643
+ var nativeLayer = _this.searchRedliningLayer(_this.props.redlining.layer);
644
+ if (!nativeLayer) {
645
+ return;
646
+ }
647
+ var kmlFormat = new ol.format.KML();
648
+ var features = nativeLayer.getSource().getFeatures().map(function (feature) {
649
+ // Circle is not supported by kml format
650
+ if (feature.getGeometry() instanceof ol.geom.Circle) {
651
+ feature = feature.clone();
652
+ feature.setGeometry(ol.geom.polygonFromCircle(feature.getGeometry()));
653
+ }
654
+ return feature;
655
+ });
656
+ var data = kmlFormat.writeFeatures(features, {
657
+ featureProjection: _this.props.mapCrs
658
+ });
659
+ FileSaver.saveAs(new Blob([data], {
660
+ type: "application/vnd.google-earth.kml+xml"
661
+ }), layer.title + ".kml");
662
+ }
663
+ });
607
664
  _this.interactions = [];
608
665
  _this.picking = false;
609
666
  _this.currentFeature = null;
@@ -663,6 +720,12 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
663
720
  }));
664
721
  return;
665
722
  }
723
+ if (this.props.redlining.action === 'Export') {
724
+ this["export"]();
725
+ this.props.changeRedliningState(_objectSpread(_objectSpread({}, prevProps.redlining), {}, {
726
+ selectedFeature: null
727
+ }));
728
+ }
666
729
  var recreateInteraction = this.props.redlining.action !== prevProps.redlining.action || this.props.redlining.layer !== prevProps.redlining.layer || ['Draw', 'PickDraw'].includes(this.props.redlining.action) && this.props.redlining.geomType !== prevProps.redlining.geomType || this.props.redlining.freehand !== prevProps.redlining.freehand || this.props.redlining.drawMultiple !== prevProps.redlining.drawMultiple;
667
730
  if (recreateInteraction) {
668
731
  // Commit to previous layer in case layer changed
@@ -692,18 +755,43 @@ var RedliningSupport = /*#__PURE__*/function (_React$Component) {
692
755
  key: "render",
693
756
  value: function render() {
694
757
  var _this2 = this;
695
- if (this.props.redlining.numericInput) {
696
- return /*#__PURE__*/React.createElement(NumericInputWindow, {
758
+ var widgets = [];
759
+ if (this.props.redlining.extraAction === "NumericInput") {
760
+ widgets.push(/*#__PURE__*/React.createElement(NumericInputWindow, {
697
761
  feature: this.props.redlining.selectedFeature,
762
+ key: "NumericInputWindow",
698
763
  onClose: function onClose() {
699
764
  return _this2.props.changeRedliningState({
700
- numericInput: false
765
+ extraAction: null
701
766
  });
702
767
  },
703
768
  onFeatureChanged: this.updateCurrentFeature
769
+ }));
770
+ } else if (this.props.redlining.extraAction === "FeatureAttributes") {
771
+ widgets.push(/*#__PURE__*/React.createElement(FeatureAttributesWindow, {
772
+ feature: this.props.redlining.selectedFeature,
773
+ key: "FeatureAttributesWindow",
774
+ layerid: this.props.redlining.layer,
775
+ onClose: function onClose() {
776
+ return _this2.props.changeRedliningState({
777
+ extraAction: null
778
+ });
779
+ },
780
+ onFeatureChanged: this.updateCurrentFeature
781
+ }));
782
+ }
783
+ if (this.state.showRecordLocation) {
784
+ var drawInteraction = this.interactions.find(function (interaction) {
785
+ return interaction instanceof ol.interaction.Draw;
704
786
  });
787
+ widgets.push(/*#__PURE__*/React.createElement(LocationRecorder, {
788
+ drawInteraction: drawInteraction,
789
+ geomType: this.props.redlining.geomType,
790
+ key: "LocationRecorder",
791
+ map: this.props.map
792
+ }));
705
793
  }
706
- return null;
794
+ return widgets;
707
795
  }
708
796
  }]);
709
797
  }(React.Component);
@@ -711,6 +799,7 @@ _defineProperty(RedliningSupport, "propTypes", {
711
799
  addLayerFeatures: PropTypes.func,
712
800
  changeRedliningState: PropTypes.func,
713
801
  displayCrs: PropTypes.string,
802
+ layers: PropTypes.array,
714
803
  map: PropTypes.object,
715
804
  mapCrs: PropTypes.string,
716
805
  redlining: PropTypes.object,
@@ -723,7 +812,8 @@ export default connect(function (state) {
723
812
  return {
724
813
  displayCrs: state.map.displayCrs,
725
814
  mapCrs: state.map.projection,
726
- redlining: state.redlining
815
+ redlining: state.redlining,
816
+ layers: state.layers.flat
727
817
  };
728
818
  }, {
729
819
  changeRedliningState: changeRedliningState,
@@ -29,7 +29,9 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
29
29
  */
30
30
 
31
31
  import React from 'react';
32
+ import ReactDOM from 'react-dom';
32
33
  import { connect } from 'react-redux';
34
+ import classNames from 'classnames';
33
35
  import isEmpty from 'lodash.isempty';
34
36
  import ol from 'openlayers';
35
37
  import PropTypes from 'prop-types';
@@ -37,6 +39,7 @@ import { v4 as uuidv4 } from 'uuid';
37
39
  import { LayerRole } from '../../actions/layers';
38
40
  import { setSnappingConfig } from '../../actions/map';
39
41
  import Icon from '../../components/Icon';
42
+ import { BottomToolPortalContext } from '../../components/PluginsContainer';
40
43
  import Spinner from '../../components/widgets/Spinner';
41
44
  import IdentifyUtils from '../../utils/IdentifyUtils';
42
45
  import LocaleUtils from '../../utils/LocaleUtils';
@@ -313,13 +316,14 @@ var SnappingSupport = /*#__PURE__*/function (_React$Component) {
313
316
  return null;
314
317
  }
315
318
  var disabled = !this.state.havesnaplayers || this.props.mapObj.snapping.active === false;
316
- var toolbarClass = disabled ? "snapping-toolbar-inactive" : "";
319
+ var className = classNames({
320
+ "snapping-toolbar": true,
321
+ "snapping-toolbar-inactive": disabled
322
+ });
317
323
  var snapEdge = this.snapToEdge(this.props.mapObj.snapping);
318
324
  var snapVertex = this.snapToVertex(this.props.mapObj.snapping);
319
- return /*#__PURE__*/React.createElement("div", {
320
- className: "snapping-toolbar-container"
321
- }, /*#__PURE__*/React.createElement("div", {
322
- className: toolbarClass
325
+ return /*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div", {
326
+ className: className
323
327
  }, this.state.reqId !== null ? /*#__PURE__*/React.createElement(Spinner, null) : /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement("button", {
324
328
  className: "button" + (snapVertex ? " pressed" : ""),
325
329
  onClick: function onClick() {
@@ -338,10 +342,11 @@ var SnappingSupport = /*#__PURE__*/function (_React$Component) {
338
342
  }, /*#__PURE__*/React.createElement(Icon, {
339
343
  icon: "snap_edge",
340
344
  size: "large"
341
- }))), "\xA0", this.state.reqId ? LocaleUtils.tr("snapping.loading") : LocaleUtils.tr("snapping.snappingenabled")));
345
+ }))), "\xA0", this.state.reqId ? LocaleUtils.tr("snapping.loading") : LocaleUtils.tr("snapping.snappingenabled")), this.context);
342
346
  }
343
347
  }]);
344
348
  }(React.Component);
349
+ _defineProperty(SnappingSupport, "contextType", BottomToolPortalContext);
345
350
  _defineProperty(SnappingSupport, "propTypes", {
346
351
  layers: PropTypes.array,
347
352
  map: PropTypes.object,
@@ -1,21 +1,10 @@
1
- div.snapping-toolbar-container {
2
- position: absolute;
3
- bottom: 2.25em;
4
- left: 0;
5
- right: 0;
6
- text-align: center;
7
- pointer-events: none;
8
- z-index: 3;
9
- }
10
-
11
- div.snapping-toolbar-container > div {
1
+ div.snapping-toolbar {
12
2
  display: inline-flex;
13
3
  align-items: center;
14
4
  line-height: 1.5em;
15
5
  position: relative;
16
- max-width: 95%;
17
- pointer-events: all;
18
6
  padding: 0.25em 0.5em;
7
+ order: 0;
19
8
  background-color: var(--container-bg-color);
20
9
  box-shadow: 0px -2px 4px rgba(136, 136, 136, 0.5);
21
10
  border-bottom: 1px solid rgba(136, 136, 136, 0.5);
@@ -16,7 +16,8 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
16
16
  import { CHANGE_LOCATE_STATE, CHANGE_LOCATE_POSITION, LOCATE_ERROR } from '../actions/locate';
17
17
  var defaultState = {
18
18
  state: "DISABLED",
19
- position: null
19
+ position: null,
20
+ mapPos: null
20
21
  };
21
22
  export default function locate() {
22
23
  var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultState;
@@ -31,7 +32,8 @@ export default function locate() {
31
32
  case CHANGE_LOCATE_POSITION:
32
33
  {
33
34
  return _objectSpread(_objectSpread({}, state), {}, {
34
- position: action.position
35
+ position: action.position,
36
+ mapPos: action.mapPos
35
37
  });
36
38
  }
37
39
  case LOCATE_ERROR:
@@ -16,6 +16,7 @@ import { CHANGE_REDLINING_STATE, RESET_REDLINING_STATE } from '../actions/redlin
16
16
  var defaultState = {
17
17
  action: null,
18
18
  geomType: null,
19
+ format: null,
19
20
  style: {
20
21
  borderColor: [255, 0, 0, 1],
21
22
  fillColor: [255, 255, 255, 1],
@@ -31,7 +32,7 @@ var defaultState = {
31
32
  drawMultiple: true,
32
33
  freehand: false,
33
34
  measurements: false,
34
- numericInput: false,
35
+ extraAction: null,
35
36
  lenUnit: 'metric',
36
37
  areaUnit: 'metric'
37
38
  };
@@ -24,6 +24,7 @@
24
24
  "MapExport3D": "",
25
25
  "MapFilter": "Филтър на картата",
26
26
  "MapLight3D": "Дата и час",
27
+ "ObjectList": "",
27
28
  "Print": "Отпечатване",
28
29
  "Reports": "Доклади",
29
30
  "Settings": "Настройки",
@@ -192,6 +193,12 @@
192
193
  "takepicture": "Направете снимка",
193
194
  "unsavedchanged": "Има неспасени промени. Искате ли все пак да напуснете страницата?"
194
195
  },
196
+ "featureattributes": {
197
+ "name": "",
198
+ "nofeature": "",
199
+ "value": "",
200
+ "windowtitle": ""
201
+ },
195
202
  "featureform": {
196
203
  "feature": "Функции",
197
204
  "noresults": "Няма резултати",
@@ -244,6 +251,7 @@
244
251
  "identify": {
245
252
  "aggregatedreport": "Обобщен доклад",
246
253
  "clipboard": "Копиране в клипборда",
254
+ "compare": "",
247
255
  "comparing": "",
248
256
  "download": "Изтегляне",
249
257
  "export": "Експорт",
@@ -345,6 +353,10 @@
345
353
  "PERMISSION_DENIED": "Позиция: разрешението е отказано"
346
354
  }
347
355
  },
356
+ "locationrecorder": {
357
+ "record": "",
358
+ "stop": ""
359
+ },
348
360
  "map": {
349
361
  "loading": "Зареждане...",
350
362
  "resetrotation": "Нулиране на въртенето"
@@ -481,6 +493,7 @@
481
493
  "loading": "Зареждане на формуляра..."
482
494
  },
483
495
  "redlining": {
496
+ "attributes": "",
484
497
  "buffer": "Буфер",
485
498
  "buffercompute": "Изчисляване",
486
499
  "bufferdistance": "Разстояние",
@@ -24,6 +24,7 @@
24
24
  "MapExport3D": "Exportar mapa",
25
25
  "MapFilter": "Filtre de mapa",
26
26
  "MapLight3D": "Llum i ombres",
27
+ "ObjectList": "",
27
28
  "Print": "Imprimir",
28
29
  "Reports": "Informes",
29
30
  "Settings": "Opcions",
@@ -192,6 +193,12 @@
192
193
  "takepicture": "Escull imatge",
193
194
  "unsavedchanged": "Hi ha canvis sense guardar. Vols sortir de la pàgina sense guardar?"
194
195
  },
196
+ "featureattributes": {
197
+ "name": "",
198
+ "nofeature": "",
199
+ "value": "",
200
+ "windowtitle": ""
201
+ },
195
202
  "featureform": {
196
203
  "feature": "Element",
197
204
  "noresults": "Sense resultats",
@@ -244,6 +251,7 @@
244
251
  "identify": {
245
252
  "aggregatedreport": "Informe agregat",
246
253
  "clipboard": "Copiar al porta-retalls",
254
+ "compare": "",
247
255
  "comparing": "",
248
256
  "download": "Descarregar",
249
257
  "export": "Exportar",
@@ -345,6 +353,10 @@
345
353
  "PERMISSION_DENIED": "Permis denegat"
346
354
  }
347
355
  },
356
+ "locationrecorder": {
357
+ "record": "",
358
+ "stop": ""
359
+ },
348
360
  "map": {
349
361
  "loading": "Carregant...",
350
362
  "resetrotation": "Reiniciar rotació"
@@ -481,6 +493,7 @@
481
493
  "loading": "Carregant formulari..."
482
494
  },
483
495
  "redlining": {
496
+ "attributes": "",
484
497
  "buffer": "Buffer",
485
498
  "buffercompute": "Computar",
486
499
  "bufferdistance": "Distància",
@@ -24,6 +24,7 @@
24
24
  "MapExport3D": "",
25
25
  "MapFilter": "",
26
26
  "MapLight3D": "",
27
+ "ObjectList": "",
27
28
  "Print": "Tisk",
28
29
  "Reports": "",
29
30
  "Settings": "Nastavení",
@@ -192,6 +193,12 @@
192
193
  "takepicture": "",
193
194
  "unsavedchanged": ""
194
195
  },
196
+ "featureattributes": {
197
+ "name": "",
198
+ "nofeature": "",
199
+ "value": "",
200
+ "windowtitle": ""
201
+ },
195
202
  "featureform": {
196
203
  "feature": "Prvek",
197
204
  "noresults": "Žádné výsledky",
@@ -244,6 +251,7 @@
244
251
  "identify": {
245
252
  "aggregatedreport": "",
246
253
  "clipboard": "Zkopírovat do schránky",
254
+ "compare": "",
247
255
  "comparing": "",
248
256
  "download": "",
249
257
  "export": "Exportovat",
@@ -345,6 +353,10 @@
345
353
  "PERMISSION_DENIED": "Poloha: nepovoleno"
346
354
  }
347
355
  },
356
+ "locationrecorder": {
357
+ "record": "",
358
+ "stop": ""
359
+ },
348
360
  "map": {
349
361
  "loading": "Načítání...",
350
362
  "resetrotation": "Obnovit orientaci mapy"
@@ -481,6 +493,7 @@
481
493
  "loading": ""
482
494
  },
483
495
  "redlining": {
496
+ "attributes": "",
484
497
  "buffer": "",
485
498
  "buffercompute": "",
486
499
  "bufferdistance": "",
@@ -24,6 +24,7 @@
24
24
  "MapExport3D": "Karte exportieren",
25
25
  "MapFilter": "Kartenfilter",
26
26
  "MapLight3D": "Beleuchtung und Schatten",
27
+ "ObjectList": "Objektliste",
27
28
  "Print": "Drucken",
28
29
  "Reports": "Berichte",
29
30
  "Settings": "Einstellungen",
@@ -192,6 +193,12 @@
192
193
  "takepicture": "Bild schiessen",
193
194
  "unsavedchanged": "Es gibt nicht gespeicherte Änderungen. Soll die Seite trotzdem verlassen werden?"
194
195
  },
196
+ "featureattributes": {
197
+ "name": "Name",
198
+ "nofeature": "Kein aktives Objekt",
199
+ "value": "Wert",
200
+ "windowtitle": "Objektattribute"
201
+ },
195
202
  "featureform": {
196
203
  "feature": "Objekt",
197
204
  "noresults": "Keine Ergebnisse",
@@ -244,6 +251,7 @@
244
251
  "identify": {
245
252
  "aggregatedreport": "Aggregierter Bericht",
246
253
  "clipboard": "Nach Zwischenablage kopieren",
254
+ "compare": "Selektierte Objekte vergleichen",
247
255
  "comparing": "Vergleich von {0} Objekte",
248
256
  "download": "Herunterladen",
249
257
  "export": "Exportieren",
@@ -345,6 +353,10 @@
345
353
  "PERMISSION_DENIED": "Position: Zugriff verweigert"
346
354
  }
347
355
  },
356
+ "locationrecorder": {
357
+ "record": "Position aufzeichen",
358
+ "stop": "Aufzeichnung stoppen"
359
+ },
348
360
  "map": {
349
361
  "loading": "Karte wird geladen...",
350
362
  "resetrotation": "Drehung zurücksetzen"
@@ -481,6 +493,7 @@
481
493
  "loading": "Formular wird geladen..."
482
494
  },
483
495
  "redlining": {
496
+ "attributes": "Objektattribute",
484
497
  "buffer": "Puffern",
485
498
  "buffercompute": "Berechnen",
486
499
  "bufferdistance": "Distanz",
@@ -24,6 +24,7 @@
24
24
  "MapExport3D": "Karte exportieren",
25
25
  "MapFilter": "Kartenfilter",
26
26
  "MapLight3D": "Beleuchtung und Schatten",
27
+ "ObjectList": "Objektliste",
27
28
  "Print": "Drucken",
28
29
  "Reports": "Berichte",
29
30
  "Settings": "Einstellungen",
@@ -192,6 +193,12 @@
192
193
  "takepicture": "Bild schießen",
193
194
  "unsavedchanged": "Es gibt nicht gespeicherte Änderungen. Soll die Seite trotzdem verlassen werden?"
194
195
  },
196
+ "featureattributes": {
197
+ "name": "Name",
198
+ "nofeature": "Kein aktives Objekt",
199
+ "value": "Wert",
200
+ "windowtitle": "Objektattribute"
201
+ },
195
202
  "featureform": {
196
203
  "feature": "Objekt",
197
204
  "noresults": "Keine Ergebnisse",
@@ -244,6 +251,7 @@
244
251
  "identify": {
245
252
  "aggregatedreport": "Aggregierter Bericht",
246
253
  "clipboard": "Nach Zwischenablage kopieren",
254
+ "compare": "Selektierte Objekte vergleichen",
247
255
  "comparing": "Vergleich von {0} Objekte",
248
256
  "download": "Herunterladen",
249
257
  "export": "Exportieren",
@@ -345,6 +353,10 @@
345
353
  "PERMISSION_DENIED": "Position: Zugriff verweigert"
346
354
  }
347
355
  },
356
+ "locationrecorder": {
357
+ "record": "Position aufzeichen",
358
+ "stop": "Aufzeichnung stoppen"
359
+ },
348
360
  "map": {
349
361
  "loading": "Karte wird geladen...",
350
362
  "resetrotation": "Drehung zurücksetzen"
@@ -436,7 +448,7 @@
436
448
  "angle": "Winkel",
437
449
  "featureunsupported": "Numerische Eingabe nicht verfügbar für dieses Objekt",
438
450
  "height": "Höhe",
439
- "nofeature": "Kein Objekt aktiv",
451
+ "nofeature": "Kein aktives Objekt",
440
452
  "side": "Seite",
441
453
  "width": "Breite",
442
454
  "windowtitle": "Numerische Eingabe"
@@ -481,6 +493,7 @@
481
493
  "loading": "Formular wird geladen..."
482
494
  },
483
495
  "redlining": {
496
+ "attributes": "Objektattribute",
484
497
  "buffer": "Puffern",
485
498
  "buffercompute": "Berechnen",
486
499
  "bufferdistance": "Distanz",
@@ -24,6 +24,7 @@
24
24
  "MapExport3D": "Export Map",
25
25
  "MapFilter": "Map Filter",
26
26
  "MapLight3D": "Light and Shadows",
27
+ "ObjectList": "Object list",
27
28
  "Print": "Print",
28
29
  "Reports": "Reports",
29
30
  "Settings": "Settings",
@@ -192,6 +193,12 @@
192
193
  "takepicture": "Take picture",
193
194
  "unsavedchanged": "There are unsaved changes. Do you want to leave the page anyway?"
194
195
  },
196
+ "featureattributes": {
197
+ "name": "Name",
198
+ "nofeature": "No active feature",
199
+ "value": "Value",
200
+ "windowtitle": "Feature attributes"
201
+ },
195
202
  "featureform": {
196
203
  "feature": "Feature",
197
204
  "noresults": "No results",
@@ -244,6 +251,7 @@
244
251
  "identify": {
245
252
  "aggregatedreport": "Aggregated report",
246
253
  "clipboard": "Copy to clipboard",
254
+ "compare": "Compare selected objects",
247
255
  "comparing": "Comparing {0} features",
248
256
  "download": "Download",
249
257
  "export": "Export",
@@ -345,6 +353,10 @@
345
353
  "PERMISSION_DENIED": "Position: permission denied"
346
354
  }
347
355
  },
356
+ "locationrecorder": {
357
+ "record": "Record location",
358
+ "stop": "Stop recording"
359
+ },
348
360
  "map": {
349
361
  "loading": "Loading...",
350
362
  "resetrotation": "Reset rotation"
@@ -481,6 +493,7 @@
481
493
  "loading": "Loading form..."
482
494
  },
483
495
  "redlining": {
496
+ "attributes": "Feature attributes",
484
497
  "buffer": "Buffer",
485
498
  "buffercompute": "Compute",
486
499
  "bufferdistance": "Distance",