@panoramax/web-viewer 3.1.1-develop-1e642517 → 3.1.1-develop-a3fa5272
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.
- package/CHANGELOG.md +2 -0
- package/build/index.css +1 -1
- package/build/index.css.map +1 -1
- package/build/index.js +5 -5
- package/build/index.js.map +1 -1
- package/docs/03_URL_settings.md +10 -1
- package/package.json +4 -3
- package/src/Viewer.js +33 -2
- package/src/components/CoreView.css +6 -0
- package/src/components/CoreView.js +25 -10
- package/src/components/Map.js +9 -0
- package/src/translations/en.json +12 -2
- package/src/translations/fr.json +12 -2
- package/src/translations/hu.json +105 -70
- package/src/utils/API.js +20 -3
- package/src/utils/Exif.js +3 -8
- package/src/utils/Map.js +20 -1
- package/src/utils/Utils.js +36 -0
- package/src/utils/Widgets.js +47 -0
- package/src/viewer/URLHash.js +16 -1
- package/src/viewer/Widgets.css +63 -0
- package/src/viewer/Widgets.js +111 -29
- package/tests/utils/Exif.test.js +10 -10
- package/tests/utils/__snapshots__/API.test.js.snap +5 -0
- package/tests/viewer/__snapshots__/Widgets.test.js.snap +39 -29
package/docs/03_URL_settings.md
CHANGED
|
@@ -116,13 +116,22 @@ The camera make and model to filter shown pictures and sequences on map (if map
|
|
|
116
116
|
- `camera=gopro%20max` will only show pictures taken with a _GoPro Max_ camera
|
|
117
117
|
- `camera=max` will not shown any picture on map, as it doesn't match any camera make
|
|
118
118
|
|
|
119
|
+
### :medal: `pic_score`: filter map data by quality score
|
|
120
|
+
|
|
121
|
+
The pictures quality level wanted for map display (if map is enabled). Values are `A`, `B`, `C`, `D`, `E` and can be used that way:
|
|
122
|
+
|
|
123
|
+
- `pic_score=A` for only best pictures
|
|
124
|
+
- `pic_score=ABC` for A, B or C-grade pictures
|
|
125
|
+
|
|
126
|
+
|
|
119
127
|
### :material-format-paint: `theme`: map colouring for pictures and sequences
|
|
120
128
|
|
|
121
129
|
The map theme to use for displaying pictures and sequences (if map is enabled). Available themes are:
|
|
122
130
|
|
|
123
131
|
- `theme=default` (or no setting defined): single color for display (no classification)
|
|
124
132
|
- `theme=age`: color based on picture/sequence age (red = recent, yellow = 2+ years old)
|
|
125
|
-
- `theme=type`: color based on camera type (orange = classic, green = 360°)
|
|
133
|
+
- `theme=type`: color based on camera type (orange = classic, green = 360°)
|
|
134
|
+
- `theme=score`: color based on quality score (green = best quality, yellow = worst)
|
|
126
135
|
|
|
127
136
|
### :material-nature-people: `background`: map background
|
|
128
137
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@panoramax/web-viewer",
|
|
3
|
-
"version": "3.1.1-develop-
|
|
3
|
+
"version": "3.1.1-develop-a3fa5272",
|
|
4
4
|
"description": "Panoramax web viewer for geolocated pictures",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"author": "Panoramax team",
|
|
@@ -88,8 +88,9 @@
|
|
|
88
88
|
"workbox-webpack-plugin": "^6.5.4"
|
|
89
89
|
},
|
|
90
90
|
"dependencies": {
|
|
91
|
-
"@fortawesome/fontawesome-svg-core": "^6.
|
|
92
|
-
"@fortawesome/free-
|
|
91
|
+
"@fortawesome/fontawesome-svg-core": "^6.6.0",
|
|
92
|
+
"@fortawesome/free-regular-svg-icons": "^6.6.0",
|
|
93
|
+
"@fortawesome/free-solid-svg-icons": "^6.6.0",
|
|
93
94
|
"@photo-sphere-viewer/core": "5.11.0-beta.1",
|
|
94
95
|
"@photo-sphere-viewer/equirectangular-tiles-adapter": "5.11.0-beta.1",
|
|
95
96
|
"@photo-sphere-viewer/gallery-plugin": "5.11.0-beta.1",
|
package/src/Viewer.js
CHANGED
|
@@ -2,11 +2,11 @@ import "./Viewer.css";
|
|
|
2
2
|
import { SYSTEM as PSSystem, DEFAULTS as PSDefaults } from "@photo-sphere-viewer/core";
|
|
3
3
|
import Widgets from "./viewer/Widgets";
|
|
4
4
|
import URLHash from "./viewer/URLHash";
|
|
5
|
-
import { COLORS, josmBboxParameters, linkMapAndPhoto } from "./utils/Utils";
|
|
5
|
+
import { COLORS, QUALITYSCORE_VALUES, josmBboxParameters, linkMapAndPhoto } from "./utils/Utils";
|
|
6
6
|
import CoreView from "./components/CoreView";
|
|
7
7
|
import Photo, { PSV_DEFAULT_ZOOM, PSV_ANIM_DURATION, PIC_MAX_STAY_DURATION } from "./components/Photo";
|
|
8
8
|
import Map from "./components/Map";
|
|
9
|
-
import { TILES_PICTURES_ZOOM } from "./utils/Map";
|
|
9
|
+
import { TILES_PICTURES_ZOOM, MAP_EXPR_QUALITYSCORE } from "./utils/Map";
|
|
10
10
|
import { enableCopyButton, fa } from "./utils/Widgets";
|
|
11
11
|
import { faXmark } from "@fortawesome/free-solid-svg-icons/faXmark";
|
|
12
12
|
|
|
@@ -20,6 +20,7 @@ const MAP_THEMES = {
|
|
|
20
20
|
DEFAULT: "default",
|
|
21
21
|
AGE: "age",
|
|
22
22
|
TYPE: "type",
|
|
23
|
+
SCORE: "score",
|
|
23
24
|
};
|
|
24
25
|
|
|
25
26
|
|
|
@@ -809,6 +810,15 @@ class Viewer extends CoreView {
|
|
|
809
810
|
COLORS.QUALI_2
|
|
810
811
|
);
|
|
811
812
|
}
|
|
813
|
+
else if(this._mapTheme == MAP_THEMES.SCORE) {
|
|
814
|
+
s.push(
|
|
815
|
+
["==", MAP_EXPR_QUALITYSCORE, 5], QUALITYSCORE_VALUES[0].color,
|
|
816
|
+
["==", MAP_EXPR_QUALITYSCORE, 4], QUALITYSCORE_VALUES[1].color,
|
|
817
|
+
["==", MAP_EXPR_QUALITYSCORE, 3], QUALITYSCORE_VALUES[2].color,
|
|
818
|
+
["==", MAP_EXPR_QUALITYSCORE, 2], QUALITYSCORE_VALUES[3].color,
|
|
819
|
+
QUALITYSCORE_VALUES[4].color,
|
|
820
|
+
);
|
|
821
|
+
}
|
|
812
822
|
else {
|
|
813
823
|
s.push(COLORS.BASE);
|
|
814
824
|
}
|
|
@@ -827,6 +837,7 @@ class Viewer extends CoreView {
|
|
|
827
837
|
// - 20-80 : custom ranges
|
|
828
838
|
// - 10 : basic feature
|
|
829
839
|
// - 0 : on bottom / feature with undefined property
|
|
840
|
+
|
|
830
841
|
// Hidden style
|
|
831
842
|
const s = ["case",
|
|
832
843
|
["==", ["get", "hidden"], true], 90
|
|
@@ -859,6 +870,15 @@ class Viewer extends CoreView {
|
|
|
859
870
|
["==", ["get", "type"], "equirectangular"], 50,
|
|
860
871
|
);
|
|
861
872
|
}
|
|
873
|
+
else if(this._mapTheme == MAP_THEMES.SCORE) {
|
|
874
|
+
s.push(
|
|
875
|
+
["==", MAP_EXPR_QUALITYSCORE, 5], 80,
|
|
876
|
+
["==", MAP_EXPR_QUALITYSCORE, 4], 65,
|
|
877
|
+
["==", MAP_EXPR_QUALITYSCORE, 3], 50,
|
|
878
|
+
["==", MAP_EXPR_QUALITYSCORE, 2], 35,
|
|
879
|
+
["==", MAP_EXPR_QUALITYSCORE, 1], 20,
|
|
880
|
+
);
|
|
881
|
+
}
|
|
862
882
|
|
|
863
883
|
s.push(10);
|
|
864
884
|
return s;
|
|
@@ -1076,6 +1096,7 @@ class Viewer extends CoreView {
|
|
|
1076
1096
|
* @param {string} [filters.type] Type of picture to keep (flat, equirectangular)
|
|
1077
1097
|
* @param {string} [filters.camera] Camera make and model to keep
|
|
1078
1098
|
* @param {string} [filters.theme] Map theme to use
|
|
1099
|
+
* @param {number[]} [filters.qualityscore] QualityScore values, as a list of 1 to 5 grades
|
|
1079
1100
|
* @param {boolean} [skipZoomIn=false] If true, doesn't force zoom in to map level >= 7
|
|
1080
1101
|
*/
|
|
1081
1102
|
setFilters(filters, skipZoomIn = false) {
|
|
@@ -1088,6 +1109,7 @@ class Viewer extends CoreView {
|
|
|
1088
1109
|
mapSeqFilters.push([">=", ["get", "date"], filters.minDate]);
|
|
1089
1110
|
mapPicFilters.push([">=", ["get", "ts"], filters.minDate]);
|
|
1090
1111
|
}
|
|
1112
|
+
|
|
1091
1113
|
if(filters.maxDate && filters.maxDate !== "") {
|
|
1092
1114
|
this._mapFilters.maxDate = filters.maxDate;
|
|
1093
1115
|
mapSeqFilters.push(["<=", ["get", "date"], filters.maxDate]);
|
|
@@ -1099,11 +1121,13 @@ class Viewer extends CoreView {
|
|
|
1099
1121
|
d = d.toISOString().split("T")[0];
|
|
1100
1122
|
mapPicFilters.push(["<=", ["get", "ts"], d]);
|
|
1101
1123
|
}
|
|
1124
|
+
|
|
1102
1125
|
if(filters.type && filters.type !== "") {
|
|
1103
1126
|
this._mapFilters.type = filters.type;
|
|
1104
1127
|
mapSeqFilters.push(["==", ["get", "type"], filters.type]);
|
|
1105
1128
|
mapPicFilters.push(["==", ["get", "type"], filters.type]);
|
|
1106
1129
|
}
|
|
1130
|
+
|
|
1107
1131
|
if(filters.camera && filters.camera !== "") {
|
|
1108
1132
|
this._mapFilters.camera = filters.camera;
|
|
1109
1133
|
// low/high model hack : to enable fuzzy filtering of camera make and model
|
|
@@ -1116,6 +1140,12 @@ class Viewer extends CoreView {
|
|
|
1116
1140
|
mapPicFilters.push(["<=", ["get", "model"], highModel, collator]);
|
|
1117
1141
|
}
|
|
1118
1142
|
|
|
1143
|
+
if(filters.qualityscore && filters.qualityscore.length > 0) {
|
|
1144
|
+
this._mapFilters.qualityscore = filters.qualityscore;
|
|
1145
|
+
mapSeqFilters.push(["in", MAP_EXPR_QUALITYSCORE, ["literal", this._mapFilters.qualityscore]]);
|
|
1146
|
+
mapPicFilters.push(["in", MAP_EXPR_QUALITYSCORE, ["literal", this._mapFilters.qualityscore]]);
|
|
1147
|
+
}
|
|
1148
|
+
|
|
1119
1149
|
if(filters.theme && Object.values(MAP_THEMES).includes(filters.theme)) {
|
|
1120
1150
|
this._mapFilters.theme = filters.theme;
|
|
1121
1151
|
if(this.map) {
|
|
@@ -1175,6 +1205,7 @@ class Viewer extends CoreView {
|
|
|
1175
1205
|
* @property {string} [detail.type] Camera type (equirectangular, flat, null/empty string for both)
|
|
1176
1206
|
* @property {string} [detail.camera] Camera make and model
|
|
1177
1207
|
* @property {string} [detail.theme] Map theme
|
|
1208
|
+
* @property {number[]} [detail.qualityscore] QualityScore values, as a list of 1 to 5 grades
|
|
1178
1209
|
*/
|
|
1179
1210
|
const event = new CustomEvent("filters-changed", { detail: Object.assign({}, this._mapFilters) });
|
|
1180
1211
|
this.dispatchEvent(event);
|
|
@@ -68,16 +68,31 @@ export default class CoreView extends EventTarget {
|
|
|
68
68
|
this.container.appendChild(this.loaderContainer);
|
|
69
69
|
this._loader = new Loader(this, this.loaderContainer);
|
|
70
70
|
|
|
71
|
-
// API init
|
|
72
|
-
endpoint = endpoint.replace("/api/search", "/api");
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
71
|
+
// API init)
|
|
72
|
+
endpoint = (endpoint || "").replace("/api/search", "/api");
|
|
73
|
+
try {
|
|
74
|
+
this._api = new API(endpoint, {
|
|
75
|
+
users: this._options.users,
|
|
76
|
+
fetch: this._options?.fetchOptions,
|
|
77
|
+
style: this._options.style,
|
|
78
|
+
});
|
|
79
|
+
this._api.onceReady()
|
|
80
|
+
.then(() => {
|
|
81
|
+
let unavailable = this._api.getUnavailableFeatures();
|
|
82
|
+
let available = this._api.getAvailableFeatures();
|
|
83
|
+
available = unavailable.length === 0 ? "✅ All features available" : "✅ Available features: "+available.join(", ");
|
|
84
|
+
unavailable = unavailable.length === 0 ? "" : "🚫 Unavailable features: "+unavailable.join(", ");
|
|
85
|
+
console.info(`🌐 Connected to API "${this._api._metadata.name}" (${this._api._endpoint})
|
|
86
|
+
ℹ️ API runs STAC ${this._api._metadata.stac_version} ${this._api._metadata.geovisio_version ? "& GeoVisio "+this._api._metadata.geovisio_version : ""}
|
|
87
|
+
${available}
|
|
88
|
+
${unavailable}
|
|
89
|
+
`.trim());
|
|
90
|
+
})
|
|
91
|
+
.catch(e => this._loader.dismiss(e, this._t.gvs.error_api));
|
|
92
|
+
}
|
|
93
|
+
catch(e) {
|
|
94
|
+
this._loader.dismiss(e, this._t.gvs.error_api);
|
|
95
|
+
}
|
|
81
96
|
}
|
|
82
97
|
|
|
83
98
|
/**
|
package/src/components/Map.js
CHANGED
|
@@ -187,6 +187,15 @@ export default class Map extends maplibregl.Map {
|
|
|
187
187
|
});
|
|
188
188
|
}
|
|
189
189
|
|
|
190
|
+
/**
|
|
191
|
+
* Is QualityScore available in vector tiles ?
|
|
192
|
+
* @private
|
|
193
|
+
*/
|
|
194
|
+
_hasQualityScore() {
|
|
195
|
+
const fields = this.getStyle()?.metadata?.["panoramax:fields"] || {};
|
|
196
|
+
return fields?.pictures?.includes("gps_accuracy") && fields?.pictures?.includes("h_pixel_density");
|
|
197
|
+
}
|
|
198
|
+
|
|
190
199
|
/**
|
|
191
200
|
* Force refresh of vector tiles data
|
|
192
201
|
*/
|
package/src/translations/en.json
CHANGED
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"🔍 Analyzing EXIF metadata",
|
|
63
63
|
"🏘️ 3D rendering",
|
|
64
64
|
"📷 Initializing 360° pictures",
|
|
65
|
-
"🟠 Colour balancing"
|
|
65
|
+
"🟠 Colour balancing",
|
|
66
|
+
"💯 Computing Quality Score ©"
|
|
66
67
|
],
|
|
67
68
|
"loading_labels_fun": [
|
|
68
69
|
"🦌 Deer crossing sign detection",
|
|
@@ -97,8 +98,9 @@
|
|
|
97
98
|
"filter_zoom_in": "Zoom-in for filters to be visible",
|
|
98
99
|
"picture_flat": "Classic",
|
|
99
100
|
"picture_360": "360°",
|
|
100
|
-
"filter_camera_model": "By camera model",
|
|
101
101
|
"filter_reset": "Clear filters",
|
|
102
|
+
"filter_qualityscore": "Quality score",
|
|
103
|
+
"filter_qualityscore_help": "Click to enable or disable",
|
|
102
104
|
"map_background": "Map background",
|
|
103
105
|
"map_background_aerial": "Aerial",
|
|
104
106
|
"map_background_streets": "Streets",
|
|
@@ -110,6 +112,7 @@
|
|
|
110
112
|
"map_theme_age_3": "< 1 year",
|
|
111
113
|
"map_theme_age_4": "< 1 month",
|
|
112
114
|
"map_theme_type": "Camera type",
|
|
115
|
+
"map_theme_score": "Quality score",
|
|
113
116
|
"contrast": "Enable higher image contrast",
|
|
114
117
|
"metadata": "Picture metadata",
|
|
115
118
|
"metadata_general_picid": "Picture identifier",
|
|
@@ -124,12 +127,19 @@
|
|
|
124
127
|
"metadata_camera_make": "Make",
|
|
125
128
|
"metadata_camera_model": "Model",
|
|
126
129
|
"metadata_camera_type": "Type",
|
|
130
|
+
"metadata_camera_resolution": "Resolution",
|
|
127
131
|
"metadata_camera_focal_length": "Focal length",
|
|
128
132
|
"metadata_location": "Location",
|
|
129
133
|
"metadata_location_longitude": "Longitude",
|
|
130
134
|
"metadata_location_latitude": "Latitude",
|
|
131
135
|
"metadata_location_orientation": "Capture direction",
|
|
132
136
|
"metadata_location_precision": "Positioning precision",
|
|
137
|
+
"metadata_quality": "Quality Score",
|
|
138
|
+
"metadata_quality_help": "Know more about Quality Score",
|
|
139
|
+
"metadata_quality_score": "Global score",
|
|
140
|
+
"metadata_quality_gps_score": "Positioning score",
|
|
141
|
+
"metadata_quality_resolution_score": "Resolution score",
|
|
142
|
+
"metadata_quality_missing": "no value set in picture",
|
|
133
143
|
"metadata_exif": "EXIF / XMP",
|
|
134
144
|
"metadata_exif_name": "Tag",
|
|
135
145
|
"metadata_exif_value": "Value",
|
package/src/translations/fr.json
CHANGED
|
@@ -62,7 +62,8 @@
|
|
|
62
62
|
"🔍 Analyse des métadonnées EXIF",
|
|
63
63
|
"🏘️ Création du rendu 3D",
|
|
64
64
|
"📷 Initialisation des vues 360°",
|
|
65
|
-
"🟠 Équilibrage des couleurs"
|
|
65
|
+
"🟠 Équilibrage des couleurs",
|
|
66
|
+
"💯 Calcul du score qualité ©"
|
|
66
67
|
],
|
|
67
68
|
"loading_labels_fun": [
|
|
68
69
|
"🦌 Détection des panneaux biche",
|
|
@@ -96,8 +97,9 @@
|
|
|
96
97
|
"filter_picture": "Type d'image",
|
|
97
98
|
"picture_flat": "Classique",
|
|
98
99
|
"picture_360": "360°",
|
|
99
|
-
"filter_camera_model": "Par modèle d'appareil",
|
|
100
100
|
"filter_reset": "Retirer les filtres",
|
|
101
|
+
"filter_qualityscore": "Score de qualité",
|
|
102
|
+
"filter_qualityscore_help": "Cliquez pour activer ou désactiver",
|
|
101
103
|
"filter_zoom_in": "Zoomez plus pour voir les filtres",
|
|
102
104
|
"map_background": "Fond de carte",
|
|
103
105
|
"map_background_aerial": "Satellite",
|
|
@@ -110,6 +112,7 @@
|
|
|
110
112
|
"map_theme_age_3": "< 1 an",
|
|
111
113
|
"map_theme_age_4": "< 1 mois",
|
|
112
114
|
"map_theme_type": "Type de caméra",
|
|
115
|
+
"map_theme_score": "Score de qualité",
|
|
113
116
|
"contrast": "Augmenter le contraste de l'image",
|
|
114
117
|
"metadata": "Métadonnées de la photo",
|
|
115
118
|
"metadata_general_picid": "Identifiant de photo",
|
|
@@ -124,12 +127,19 @@
|
|
|
124
127
|
"metadata_camera_make": "Fabricant",
|
|
125
128
|
"metadata_camera_model": "Modèle",
|
|
126
129
|
"metadata_camera_type": "Type",
|
|
130
|
+
"metadata_camera_resolution": "Résolution",
|
|
127
131
|
"metadata_camera_focal_length": "Longueur focale",
|
|
128
132
|
"metadata_location": "Localisation",
|
|
129
133
|
"metadata_location_longitude": "Longitude",
|
|
130
134
|
"metadata_location_latitude": "Latitude",
|
|
131
135
|
"metadata_location_orientation": "Direction de prise de vue",
|
|
132
136
|
"metadata_location_precision": "Précision du positionnement",
|
|
137
|
+
"metadata_quality": "Score de qualité",
|
|
138
|
+
"metadata_quality_help": "En savoir plus sur le score de qualité",
|
|
139
|
+
"metadata_quality_score": "Note globale",
|
|
140
|
+
"metadata_quality_gps_score": "Note du positionnement",
|
|
141
|
+
"metadata_quality_resolution_score": "Note de la résolution",
|
|
142
|
+
"metadata_quality_missing": "pas d'info dans l'image",
|
|
133
143
|
"metadata_exif": "EXIF / XMP",
|
|
134
144
|
"metadata_exif_name": "Balise",
|
|
135
145
|
"metadata_exif_value": "Valeur",
|
package/src/translations/hu.json
CHANGED
|
@@ -1,114 +1,114 @@
|
|
|
1
1
|
{
|
|
2
2
|
"psv": {
|
|
3
|
-
"twoFingers": "
|
|
4
|
-
"ctrlZoom": "
|
|
3
|
+
"twoFingers": "Két ujjal navigálhat",
|
|
4
|
+
"ctrlZoom": "Közelítés vagy távolítás: Ctrl + görgetés",
|
|
5
5
|
"loadError": "A panoráma nem tölthető be"
|
|
6
6
|
},
|
|
7
7
|
"gvs": {
|
|
8
8
|
"zoom": "Nagyítás",
|
|
9
|
-
"zoomOut": "
|
|
10
|
-
"zoomIn": "
|
|
9
|
+
"zoomOut": "Távolítás",
|
|
10
|
+
"zoomIn": "Közelítés",
|
|
11
11
|
"moveUp": "Mozgás fel",
|
|
12
12
|
"moveDown": "Mozgás le",
|
|
13
13
|
"moveLeft": "Mozgás balra",
|
|
14
14
|
"moveRight": "Mozgás jobbra",
|
|
15
15
|
"moveMiddle": "Nézet középre hozása",
|
|
16
|
-
"expand": "
|
|
17
|
-
"expand_info": "
|
|
18
|
-
"show_psv": "
|
|
19
|
-
"show_map": "
|
|
20
|
-
"minimize": "
|
|
16
|
+
"expand": "Bővítés",
|
|
17
|
+
"expand_info": "Widget megjelenítése teljes oldalon",
|
|
18
|
+
"show_psv": "Képnézegető megjelenítése",
|
|
19
|
+
"show_map": "Térkép megjelenítése",
|
|
20
|
+
"minimize": "Widget elrejtése; a bal alsó sarokban lévő gombbal újra megjelenítheti",
|
|
21
21
|
"options": "Beállítások",
|
|
22
22
|
"filters": "Szűrők",
|
|
23
23
|
"layers": "Rétegek",
|
|
24
24
|
"share": "Megosztás",
|
|
25
25
|
"search": "Keresés",
|
|
26
|
-
"search_empty": "Nincs
|
|
27
|
-
"share_links": "
|
|
28
|
-
"share_page": "
|
|
29
|
-
"share_image": "
|
|
30
|
-
"share_rss": "RSS",
|
|
26
|
+
"search_empty": "Nincs találat",
|
|
27
|
+
"share_links": "Linkek",
|
|
28
|
+
"share_page": "Link erre az oldalra",
|
|
29
|
+
"share_image": "Nagy felbontású (HD) kép",
|
|
30
|
+
"share_rss": "RSS hírcsatorna",
|
|
31
31
|
"share_rss_title": "A térkép látható területén lévő új sorozatok RSS-hírcsatornája",
|
|
32
|
-
"share_embed": "Beágyazás a
|
|
32
|
+
"share_embed": "Beágyazás a weboldaladon",
|
|
33
33
|
"share_print": "Nyomtatás",
|
|
34
34
|
"copy": "Másolás",
|
|
35
35
|
"copied": "Másolva",
|
|
36
|
-
"error": "
|
|
36
|
+
"error": "Ajjaj, baj van…",
|
|
37
37
|
"error_subtitle": "Próbálja újra később, vagy nézze meg a böngészőkonzolt a további részletekért.",
|
|
38
38
|
"sequence_next": "A sorozat következő képe",
|
|
39
|
-
"sequence_play": "
|
|
40
|
-
"sequence_pause": "
|
|
39
|
+
"sequence_play": "Sorozat lejátszása",
|
|
40
|
+
"sequence_pause": "Sorozatlejátszás szüneteltetése",
|
|
41
41
|
"sequence_prev": "A sorozat előző képe",
|
|
42
42
|
"sequence_more": "További lejátszási lehetőségek",
|
|
43
|
-
"sequence_speed": "
|
|
43
|
+
"sequence_speed": "Lejátszás sebessége",
|
|
44
44
|
"legend_license": "Licenc: {l}",
|
|
45
|
-
"edit_osm": "
|
|
45
|
+
"edit_osm": "OSM szerkesztése",
|
|
46
46
|
"id": "iD",
|
|
47
47
|
"josm": "JOSM",
|
|
48
|
-
"josm_live": "
|
|
48
|
+
"josm_live": "JOSM automatikus szinkronizálásának engedélyezése képbetöltéskor",
|
|
49
49
|
"loading_labels_serious": [
|
|
50
|
-
"🗺️
|
|
51
|
-
"🖥️
|
|
52
|
-
"🖼️
|
|
53
|
-
"🔍
|
|
54
|
-
"🏘️ 3D
|
|
55
|
-
"📷
|
|
56
|
-
"🟠
|
|
50
|
+
"🗺️ Térképadatok betöltése",
|
|
51
|
+
"🖥️ API lekérdezése",
|
|
52
|
+
"🖼️ Bélyegképek betöltése",
|
|
53
|
+
"🔍 EXIF metaadatok elemzése",
|
|
54
|
+
"🏘️ 3D megjelenítés",
|
|
55
|
+
"📷 360°-os képek inicializálása",
|
|
56
|
+
"🟠 Színek kiegyenlítése"
|
|
57
57
|
],
|
|
58
58
|
"loading_labels_fun": [
|
|
59
|
-
"🦌
|
|
60
|
-
"🚘
|
|
61
|
-
"☕
|
|
62
|
-
"😀
|
|
63
|
-
"🐈
|
|
64
|
-
"😴
|
|
65
|
-
"🫖
|
|
66
|
-
"🐧
|
|
67
|
-
"🚇
|
|
68
|
-
"🧹
|
|
69
|
-
"🚒
|
|
70
|
-
"🚲
|
|
71
|
-
"🚉
|
|
72
|
-
"🛰️
|
|
73
|
-
"👥
|
|
74
|
-
"🐟
|
|
75
|
-
"🧑💻
|
|
76
|
-
"📈
|
|
59
|
+
"🦌 Vadveszélyt jelző tábla észlelése",
|
|
60
|
+
"🚘 Panoramax autó © keresése",
|
|
61
|
+
"☕ Koffeininjekció",
|
|
62
|
+
"😀 Mosolyogj, fel lettél térképezve!",
|
|
63
|
+
"🐈 Kiscicás képek megosztása",
|
|
64
|
+
"😴 Halogatás csökkentése",
|
|
65
|
+
"🫖 Tea megfőzése",
|
|
66
|
+
"🐧 Forráskód felnyitása",
|
|
67
|
+
"🚇 Metróállomások indexelése",
|
|
68
|
+
"🧹 Metaadatok tisztogatása",
|
|
69
|
+
"🚒 Tűzoltóságról szóló fotók beküldése",
|
|
70
|
+
"🚲 Zöldutak frissítése",
|
|
71
|
+
"🚉 Peronok bejárása",
|
|
72
|
+
"🛰️ Műholdak keresése",
|
|
73
|
+
"👥 Personák megírása",
|
|
74
|
+
"🐟 Sültkrumplikapók lokalizálása",
|
|
75
|
+
"🧑💻 Hibakereső felület",
|
|
76
|
+
"📈 Statisztika növelése"
|
|
77
77
|
],
|
|
78
|
-
"error_psv": "A
|
|
79
|
-
"error_pic": "A kért kép nem
|
|
80
|
-
"error_nopic": "
|
|
78
|
+
"error_psv": "A Photo Sphere Viewer (gömbpanoráma-nézegető) nem töltődik be megfelelően",
|
|
79
|
+
"error_pic": "A kért kép nem található",
|
|
80
|
+
"error_nopic": "Az adott helyen nem érhető el kép",
|
|
81
81
|
"error_api": "A képkiszolgáló nem érhető el",
|
|
82
82
|
"error_webgl": "A WebGL nem támogatott ebben a böngészőben",
|
|
83
|
-
"error_josm": "A JOSM nem válaszol
|
|
84
|
-
"error_api_compatibility": "A
|
|
83
|
+
"error_josm": "A JOSM nem válaszol. Valóban fut és elérhető távolról?",
|
|
84
|
+
"error_api_compatibility": "A képkiszolgáló nem kompatibilis a képnézegető ezen verziójával",
|
|
85
85
|
"filter_date": "Dátum szerint",
|
|
86
86
|
"filter_user": "Felhasználó szerint",
|
|
87
|
-
"filter_picture": "
|
|
87
|
+
"filter_picture": "Képtípus szerint",
|
|
88
88
|
"picture_flat": "Klasszikus",
|
|
89
89
|
"picture_360": "360°",
|
|
90
90
|
"filter_camera_model": "Kameramodell szerint",
|
|
91
91
|
"filter_reset": "Szűrők törlése",
|
|
92
|
-
"map_background": "
|
|
93
|
-
"map_background_aerial": "Légi",
|
|
94
|
-
"map_background_streets": "
|
|
92
|
+
"map_background": "Térképháttér",
|
|
93
|
+
"map_background_aerial": "Légi felvétel",
|
|
94
|
+
"map_background_streets": "képUtca",
|
|
95
95
|
"map_theme": "Térkép témája",
|
|
96
|
-
"map_theme_default": "
|
|
97
|
-
"map_theme_age": "
|
|
96
|
+
"map_theme_default": "Klasszikus",
|
|
97
|
+
"map_theme_age": "Képkészítés ideje",
|
|
98
98
|
"map_theme_age_1": "> 2 éve",
|
|
99
99
|
"map_theme_age_2": "< 2 éve",
|
|
100
100
|
"map_theme_age_3": "< 1 éve",
|
|
101
101
|
"map_theme_age_4": "< 1 hónapja",
|
|
102
|
-
"map_theme_type": "Kameratípus
|
|
103
|
-
"contrast": "
|
|
104
|
-
"metadata": "
|
|
105
|
-
"metadata_general_picid": "
|
|
106
|
-
"metadata_general_seqid": "Sorozat
|
|
107
|
-
"metadata_general_picid_link": "
|
|
108
|
-
"metadata_general_seqid_link": "
|
|
102
|
+
"map_theme_type": "Kameratípus",
|
|
103
|
+
"contrast": "Nagyobb képkontraszt engedélyezése",
|
|
104
|
+
"metadata": "Kép metaadatai",
|
|
105
|
+
"metadata_general_picid": "Kép azonosítójs",
|
|
106
|
+
"metadata_general_seqid": "Sorozat azonosítója",
|
|
107
|
+
"metadata_general_picid_link": "Ugrás a kép JSON leírásához",
|
|
108
|
+
"metadata_general_seqid_link": "Ugrás a sorozat JSON leírásához",
|
|
109
109
|
"metadata_general_author": "Szerző",
|
|
110
|
-
"metadata_general_license": "
|
|
111
|
-
"metadata_general_license_link": "
|
|
110
|
+
"metadata_general_license": "Licenc (engedély)",
|
|
111
|
+
"metadata_general_license_link": "Ugrás a licenc teljes leírásához",
|
|
112
112
|
"metadata_general_date": "Készítés dátuma",
|
|
113
113
|
"metadata_camera": "Kamera",
|
|
114
114
|
"metadata_camera_make": "Gyártó",
|
|
@@ -118,16 +118,51 @@
|
|
|
118
118
|
"metadata_location": "Helyszín",
|
|
119
119
|
"metadata_location_longitude": "Hosszúság",
|
|
120
120
|
"metadata_location_latitude": "Szélesség",
|
|
121
|
-
"metadata_location_orientation": "
|
|
122
|
-
"metadata_location_precision": "
|
|
121
|
+
"metadata_location_orientation": "Felvétel iránya",
|
|
122
|
+
"metadata_location_precision": "Helymeghatározás pontossága",
|
|
123
123
|
"metadata_exif": "EXIF / XMP",
|
|
124
124
|
"metadata_exif_name": "Címke",
|
|
125
|
-
"metadata_exif_value": "Érték"
|
|
125
|
+
"metadata_exif_value": "Érték",
|
|
126
|
+
"report": "Kép bejelentése",
|
|
127
|
+
"report_auth": "A jelentés a fiókod ({a}) felhasználásával lesz elküldve",
|
|
128
|
+
"report_nature": {
|
|
129
|
+
"": "Probléma jellegének kiválasztása…",
|
|
130
|
+
"blur_missing": "A képen látszik egy személy arca vagy egy rendszámtábla",
|
|
131
|
+
"blur_excess": "A képen el van mosódva egy olyan objektum, amelynek nem kellene elmosódva lennie",
|
|
132
|
+
"inappropriate": "A kép nem megfelelő (irreleváns, meztelenséget jelenít meg stb.)",
|
|
133
|
+
"privacy": "A képen magánút vagy magánterület látható",
|
|
134
|
+
"picture_low_quality": "A kép nagyon rossz minőségű",
|
|
135
|
+
"mislocated": "A kép rosszul van elhelyezve a térképen",
|
|
136
|
+
"copyright": "A kép szerzői jogot sért",
|
|
137
|
+
"other": "Bármilyen más jellegű probléma"
|
|
138
|
+
},
|
|
139
|
+
"report_nature_label": "Probléma jellege",
|
|
140
|
+
"report_details": "További részletek",
|
|
141
|
+
"filter_zoom_in": "Nagyíts a szűrők láthatóvá tételéhez",
|
|
142
|
+
"report_email": "E-mail-cím",
|
|
143
|
+
"report_email_placeholder": "Nem kötelező",
|
|
144
|
+
"report_submit": "Beküldés",
|
|
145
|
+
"report_success": "A jelentés sikeresen be lett küldve; a lehető leghamarabb megvizsgáljuk.",
|
|
146
|
+
"report_failure": "Hiba történt a jelentés létrehozásakor: {e}. Kérjük, próbáld meg később újra.",
|
|
147
|
+
"search_user": "Felhasználónév keresése…",
|
|
148
|
+
"search_address": "Cím, város stb. keresése…",
|
|
149
|
+
"share_embed_docs": "További információ a beágyazás konfigurálásáról",
|
|
150
|
+
"error_click": "Kattints a folytatáshoz",
|
|
151
|
+
"error_retry": "Kérjük, próbáld meg később",
|
|
152
|
+
"legend_title": "Kép adatainak megjelenítése",
|
|
153
|
+
"report_whole_sequence": "A teljes sorozatra vonatkozik",
|
|
154
|
+
"report_wait": "Jelentés beküldése folyamatban…",
|
|
155
|
+
"report_details_placeholder": "Megadhatsz további részleteket a problémáról (nem kötelező)"
|
|
126
156
|
},
|
|
127
157
|
"map": {
|
|
128
158
|
"loading": "Betöltés…",
|
|
129
159
|
"thumbnail": "A kurzorral mutatott kép bélyegképe",
|
|
130
160
|
"no_thumbnail": "Nincs bélyegkép",
|
|
131
|
-
"not_public": "Nem látható nyilvánosan"
|
|
161
|
+
"not_public": "Nem látható nyilvánosan",
|
|
162
|
+
"slow_loading": "A térkép lassan töltődik be, és lehet, hogy lerobbant"
|
|
163
|
+
},
|
|
164
|
+
"maplibre": {
|
|
165
|
+
"GeolocateControl.FindMyLocation": "Tartózkodási hely megtalálása",
|
|
166
|
+
"GeolocateControl.LocationNotAvailable": "Tartózkodási hely nem érhető el"
|
|
132
167
|
}
|
|
133
168
|
}
|
package/src/utils/API.js
CHANGED
|
@@ -76,6 +76,22 @@ export default class API {
|
|
|
76
76
|
return this._isReady == 1;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
/**
|
|
80
|
+
* List of available features offered by API
|
|
81
|
+
* @returns {string[]} Keywords of enabled features
|
|
82
|
+
*/
|
|
83
|
+
getAvailableFeatures() {
|
|
84
|
+
return Object.entries(this._endpoints).filter(e => e[1] !== null).map(e => e[0]);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* List of unavailable features on API
|
|
89
|
+
* @returns {string[]} Keywords of disabled features
|
|
90
|
+
*/
|
|
91
|
+
getUnavailableFeatures() {
|
|
92
|
+
return Object.entries(this._endpoints).filter(e => e[1] === null).map(e => e[0]);
|
|
93
|
+
}
|
|
94
|
+
|
|
79
95
|
/**
|
|
80
96
|
* Interprets JSON landing page and store important information
|
|
81
97
|
*
|
|
@@ -107,7 +123,7 @@ export default class API {
|
|
|
107
123
|
// Read metadata
|
|
108
124
|
this._metadata.name = landing.title || "Unnamed";
|
|
109
125
|
this._metadata.stac_version = landing.stac_version;
|
|
110
|
-
this._metadata.geovisio_version = landing.geovisio_version
|
|
126
|
+
this._metadata.geovisio_version = landing.geovisio_version;
|
|
111
127
|
|
|
112
128
|
// Read links
|
|
113
129
|
const supportedLinks = [
|
|
@@ -243,7 +259,7 @@ export default class API {
|
|
|
243
259
|
const mapUsers = new Set(users || []);
|
|
244
260
|
|
|
245
261
|
// Load all necessary map styles
|
|
246
|
-
this.mapStyle = { version: 8, sources: {}, layers: [] };
|
|
262
|
+
this.mapStyle = { version: 8, sources: {}, layers: [], metadata: {} };
|
|
247
263
|
const stylePromises = [ this.getMapStyle() ];
|
|
248
264
|
|
|
249
265
|
// General map style
|
|
@@ -263,7 +279,7 @@ export default class API {
|
|
|
263
279
|
return Promise.all(stylePromises)
|
|
264
280
|
.then(styles => {
|
|
265
281
|
const overridableProps = [
|
|
266
|
-
"bearing", "center", "glyphs", "light", "
|
|
282
|
+
"bearing", "center", "glyphs", "light", "name",
|
|
267
283
|
"pitch", "sky", "sprite", "terrain", "transition", "zoom"
|
|
268
284
|
];
|
|
269
285
|
|
|
@@ -272,6 +288,7 @@ export default class API {
|
|
|
272
288
|
if(style[p]) { this.mapStyle[p] = style[p] || this.mapStyle[p]; }
|
|
273
289
|
});
|
|
274
290
|
Object.assign(this.mapStyle.sources, style?.sources || {});
|
|
291
|
+
Object.assign(this.mapStyle.metadata, style?.metadata || {});
|
|
275
292
|
this.mapStyle.layers = this.mapStyle.layers.concat(style?.layers || []);
|
|
276
293
|
});
|
|
277
294
|
})
|
package/src/utils/Exif.js
CHANGED
|
@@ -41,17 +41,12 @@ export function getExifFloat(val) {
|
|
|
41
41
|
* @private
|
|
42
42
|
*/
|
|
43
43
|
export function getGPSPrecision(picture) {
|
|
44
|
-
let quality = "
|
|
45
|
-
const gpsHPosError = getExifFloat(picture?.properties?.exif?.["Exif.GPSInfo.GPSHPositioningError"]);
|
|
44
|
+
let quality = "❓";
|
|
45
|
+
const gpsHPosError = picture?.properties?.["quality:horizontal_accuracy"] || getExifFloat(picture?.properties?.exif?.["Exif.GPSInfo.GPSHPositioningError"]);
|
|
46
46
|
const gpsDop = getExifFloat(picture?.properties?.exif?.["Exif.GPSInfo.GPSDOP"]);
|
|
47
47
|
|
|
48
48
|
if(gpsHPosError !== undefined) {
|
|
49
|
-
|
|
50
|
-
else if(gpsHPosError < 1) { quality = "excellent"; }
|
|
51
|
-
else if(gpsHPosError < 3) { quality = "good"; }
|
|
52
|
-
else if(gpsHPosError < 7) { quality = "moderate"; }
|
|
53
|
-
else if(gpsHPosError < 10) { quality = "fair"; }
|
|
54
|
-
else { quality = "poor"; }
|
|
49
|
+
quality = `${gpsHPosError} m`;
|
|
55
50
|
}
|
|
56
51
|
else if(gpsDop !== undefined) {
|
|
57
52
|
if(gpsDop < 1) { quality = "ideal"; }
|