diff --git a/package.json b/package.json index d171a70..10f6419 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ }, "dependencies": { "@intlify/unplugin-vue-i18n": "^6.0.8", + "@turf/boolean-intersects": "^7.2.0", "@panoramax/web-viewer": "^4.1.0", "@togglecorp/fujs": "^2.2.0", "@turf/bbox": "^7.2.0", @@ -28,6 +29,7 @@ "ol": "^10.5.0", "ol-contextmenu": "^5.5.0", "ol-ext": "^4.0.31", + "osmtogeojson": "^3.0.0-beta.5", "pako": "^2.1.0", "pinia": "^2.1.6", "tinycolor2": "^1.6.0", diff --git a/src/components/ConflationProject.vue b/src/components/ConflationProject.vue new file mode 100644 index 0000000..d8ac684 --- /dev/null +++ b/src/components/ConflationProject.vue @@ -0,0 +1,417 @@ + + + + + diff --git a/src/components/ConflationProjectInstructions.vue b/src/components/ConflationProjectInstructions.vue new file mode 100644 index 0000000..00f45cf --- /dev/null +++ b/src/components/ConflationProjectInstructions.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/src/components/ConflationProjectTask.vue b/src/components/ConflationProjectTask.vue new file mode 100644 index 0000000..0f35892 --- /dev/null +++ b/src/components/ConflationProjectTask.vue @@ -0,0 +1,179 @@ + + + diff --git a/src/components/ConflationProjectTutorial.vue b/src/components/ConflationProjectTutorial.vue new file mode 100644 index 0000000..d604717 --- /dev/null +++ b/src/components/ConflationProjectTutorial.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/src/config/projectTypes.ts b/src/config/projectTypes.ts index 5918646..983771a 100644 --- a/src/config/projectTypes.ts +++ b/src/config/projectTypes.ts @@ -27,6 +27,11 @@ const projectTypes = { name: 'Street', component: 'streetProject', }, + '8': { + name: 'Conflation', + component: 'conflationProject', + prioritizeNearlyCompletedGroups: true, + }, '10': { name: 'Validate Image', component: 'validateImageProject', diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index 525b6af..83e1c9b 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -120,8 +120,10 @@ }, "projectView": { "leave": "Projekt verlassen", - "saveResults": "Speichern", "AreYouSureYouWantToLeave": "Bist du sicher, dass du das Projekt verlassen möchtest? Deine Beiträge gehen verloren.", + "projectErrorTitle": "Das hat nicht geklappt", + "projectErrorText": "Leider können wir die Aufgaben nicht bereitstellen.", + "saveResults": "Speichern", "noResults": "Keine Ergebnisse", "checkConnection": "Überprüfe deine Internetverbindung und Browsereinstellungen, um sicherzustellen, dass Inhalte geladen werden können.", "saveFailed": "Ergebnisse konnten nicht gespeichert werden", @@ -228,5 +230,15 @@ "imageTile": { "failureMessage": "Bild konnte nicht geladen werden!", "notAvailableMessage": "Bild nicht verfügbar!" + }, + "conflationProject": { + "doesTheShapeOutline": "Ist der Umriss des {feature} korrekt?", + "skip": "Überspringe diese Aufgabe", + "whichShape": "Welche Form ist der korrekte {feature}-Umriss?" + }, + "conflationInstructions": { + "oneRed": "Es gibt eine rote Form", + "onlyBlue": "Es gibt nur eine blaue Form", + "severalRed": "Es gibt mehere rote Formen" } } diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 7c62d4c..ad10643 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -121,6 +121,8 @@ "projectView": { "leave": "Leave project", "AreYouSureYouWantToLeave": "Are you sure you want to leave the project? Your contributions will be lost.", + "projectErrorTitle": "Something went wrong", + "projectErrorText": "Sorry, we are unable to prepare your tasks.", "noResults": "No results to save", "checkConnection": "Check your internet connection and browser settings to make sure that contents can be loaded", "saveResults": "Save", @@ -228,5 +230,15 @@ "imageTile": { "failureMessage": "Failed to load image!", "notAvailableMessage": "Image not available!" + }, + "conflationProject": { + "doesTheShapeOutline": "Does the shape accurately outline a {feature}?", + "skip": "Skip this task", + "whichShape": "Which shape accurately outlines the {feature}?" + }, + "conflationInstructions": { + "oneRed": "There is one red shape", + "onlyBlue": "There is only a blue shape", + "severalRed": "There are several red shapes" } } diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json index 04cb287..3ff2000 100644 --- a/src/i18n/locales/fr.json +++ b/src/i18n/locales/fr.json @@ -121,6 +121,8 @@ "projectView": { "leave": "Quitter le projet", "AreYouSureYouWantToLeave": "Êtes-vous certain de vouloir quitter le projet ? Vos contributions seront perdues.", + "projectErrorTitle": "Ça n'a pas marché", + "projectErrorText": "Désolé, nous n'arrivons pas à préparer vos tâches.", "noResults": "Aucun résultat à sauvegarder", "checkConnection": "Vérifiez votre connexion Internet et les paramètres de votre navigateur pour vous assurer que le contenu peut être chargé.", "saveResults": "Sauvegarder", @@ -228,5 +230,15 @@ "imageTile": { "failureMessage": "Échec du chargement de l'image !", "notAvailableMessage": "Image non disponible !" + }, + "conflationProject": { + "doesTheShapeOutline": "Est-ce la forme correspond correctement au contour de {feature}?", + "skip": "Ignorez cette tâche", + "whichShape": "Quelle forme correspond avec précision au contour de {feature}?" + }, + "conflationInstructions": { + "oneRed": "Il y a une forme rouge", + "onlyBlue": "Il n'y a qu'une forme bleue", + "severalRed": "Il y a plusieurs formes rouges" } } diff --git a/src/utils/fetchFeaturesFromRawData.ts b/src/utils/fetchFeaturesFromRawData.ts new file mode 100644 index 0000000..5bf6c16 --- /dev/null +++ b/src/utils/fetchFeaturesFromRawData.ts @@ -0,0 +1,47 @@ +const RAW_DATA_API_URL = 'https://api-prod.raw-data.hotosm.org' + +const geomFromExtent = (extent) => { + const [xmin, ymin, xmax, ymax] = extent + const geometry = { + type: 'Polygon', + coordinates: [ + [ + [xmin, ymin], + [xmin, ymax], + [xmax, ymax], + [xmax, ymin], + [xmin, ymin], + ], + ], + } + return geometry +} + +export async function fetchFeaturesFromRawData(extent, filters) { + const geom = geomFromExtent(extent) + const snapshotPlainEndpoint = new URL('/v1/snapshot/plain/', RAW_DATA_API_URL) + const response = await fetch(snapshotPlainEndpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + body: JSON.stringify({ + outputType: 'geojson', + geometryType: ['polygon'], + centroid: false, + useStWithin: true, + includeUserMetadata: false, + filters: filters, + includeStatsHtml: false, + includeTranslit: false, + geometry: geom, + }), + }) + if (!response.ok) { + throw new Error(`Error: ${response.statusText}`) + } + const geojson = await response.json() + const features = geojson.features + return features +} diff --git a/src/utils/makeXyzUrl.ts b/src/utils/makeXyzUrl.ts index 17a89b2..98915ef 100644 --- a/src/utils/makeXyzUrl.ts +++ b/src/utils/makeXyzUrl.ts @@ -3,8 +3,9 @@ import getQuadKeyFromCoordsAndZoom from './getQuadKeyFromCoordsAndZoom' const makeXyzUrl = (tileServer: string, tileCoord: [number, number, number]) => { const apiKey = tileServer.apiKey const wmtsLayerName = tileServer.wmtsLayerName - const [zoom, x, y] = tileCoord - const quadkey = getQuadKeyFromCoordsAndZoom(x, y, zoom) + const [zoom, x, y] = tileCoord ?? ['{z}', '{x}', '{y}'] + const quadkey = getQuadKeyFromCoordsAndZoom(x, y, zoom) ?? '{quadkey}' + const url = tileServer.url .replace(/({apiKey})|({key})/, apiKey) .replace(/({layer})|({name})/, wmtsLayerName) diff --git a/src/views/ProjectView.vue b/src/views/ProjectView.vue index 940355e..0d1b16d 100644 --- a/src/views/ProjectView.vue +++ b/src/views/ProjectView.vue @@ -22,6 +22,7 @@ import MediaProject from '@/components/MediaProject.vue' import ValidateProject from '@/components/ValidateProject.vue' import DigitizeProject from '@/components/DigitizeProject.vue' import StreetProject from '@/components/StreetProject.vue' +import ConflationProject from '@/components/ConflationProject.vue' import CompletenessProject from '@/components/CompletenessProject.vue' import ValidateImageProject from '@/components/ValidateImageProject.vue' import projectTypes from '@/config/projectTypes' @@ -38,6 +39,7 @@ export default defineComponent({ validateProject: ValidateProject, digitizeProject: DigitizeProject, streetProject: StreetProject, + conflationProject: ConflationProject, }, data() { return { @@ -59,7 +61,7 @@ export default defineComponent({ logMappingStarted: (projectType) => { logAnalyticsEvent('mapping_started', { projectType: projectType }) }, - saveResults: (results, startTime) => { + saveResults: (results, startTime, reference) => { if (Object.values(results).every((v) => v === null)) { this.to = this.i18nRoute({ name: 'projects' }) this.showDialog( @@ -87,6 +89,8 @@ export default defineComponent({ startTime, } + reference && (entry.reference = reference) + this.completedGroupId = this.group.groupId goOnline(db) @@ -156,8 +160,10 @@ export default defineComponent({ }, bindTaskGroup() { onValue(getGroupsQuery(this.projectId), (snapshot) => { - const data = snapshot.val() || {} - const flatGroups = Object.values(data).flat() + const flatGroups: any[] = [] + snapshot.forEach((childSnapshot) => { + flatGroups.push(childSnapshot.val()) + }) const completed = Object.keys(this.projectContributions) const available = flatGroups.filter( (g) => g.requiredCount > 0 && !completed.includes(g.groupId), @@ -175,8 +181,12 @@ export default defineComponent({ } else { this.hideDialog() } - const random = available[Math.floor(Math.random() * available.length)] - this.group = random + if (projectTypes[this.project.projectType]?.prioritizeNearlyCompletedGroups) { + this.group = available[0] + } else { + const random = available[Math.floor(Math.random() * available.length)] + this.group = random + } this.bindTasks() }) }, @@ -240,6 +250,16 @@ export default defineComponent({ handleTaskComponentCreated() { goOffline(db) }, + handleProjectError() { + this.to = '/projects' + this.showDialog( + this.$t('projectView.projectErrorTitle'), + this.$t('projectView.projectErrorText'), + this.leaveProject, + true, + false, + ) + }, }, beforeRouteLeave(to, from, next) { if (this.mode === 'contribute' && to.name !== 'authentication') { @@ -280,6 +300,7 @@ export default defineComponent({ :tutorial="tutorial" :tutorialTasks="tutorialTasks" @created="handleTaskComponentCreated" + @error="handleProjectError" /> diff --git a/yarn.lock b/yarn.lock index 35fa281..8548409 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1027,7 +1027,7 @@ dependencies: "@lit-labs/ssr-dom-shim" "^1.4.0" -"@mapbox/geojson-rewind@^0.5.2": +"@mapbox/geojson-rewind@0.5.2", "@mapbox/geojson-rewind@^0.5.2": version "0.5.2" resolved "https://registry.yarnpkg.com/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz#591a5d71a9cd1da1a0bf3420b3bea31b0fc7946a" integrity sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA== @@ -1475,6 +1475,41 @@ "@types/geojson" "^7946.0.10" tslib "^2.8.1" +"@turf/boolean-disjoint@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@turf/boolean-disjoint/-/boolean-disjoint-7.2.0.tgz#84b07b10b6b0fa1e3a8276dd81dd30d697059a47" + integrity sha512-xdz+pYKkLMuqkNeJ6EF/3OdAiJdiHhcHCV0ykX33NIuALKIEpKik0+NdxxNsZsivOW6keKwr61SI+gcVtHYcnQ== + dependencies: + "@turf/boolean-point-in-polygon" "^7.2.0" + "@turf/helpers" "^7.2.0" + "@turf/line-intersect" "^7.2.0" + "@turf/meta" "^7.2.0" + "@turf/polygon-to-line" "^7.2.0" + "@types/geojson" "^7946.0.10" + tslib "^2.8.1" + +"@turf/boolean-intersects@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@turf/boolean-intersects/-/boolean-intersects-7.2.0.tgz#c0893f98820293e446b4229c651d0743b503939c" + integrity sha512-GLRyLQgK3F14drkK5Qi9Mv7Z9VT1bgQUd9a3DB3DACTZWDSwfh8YZUFn/HBwRkK8dDdgNEXaavggQHcPi1k9ow== + dependencies: + "@turf/boolean-disjoint" "^7.2.0" + "@turf/helpers" "^7.2.0" + "@turf/meta" "^7.2.0" + "@types/geojson" "^7946.0.10" + tslib "^2.8.1" + +"@turf/boolean-point-in-polygon@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-7.2.0.tgz#0f9d18bb058b118340d79a0e5f346bd09a363a9a" + integrity sha512-lvEOjxeXIp+wPXgl9kJA97dqzMfNexjqHou+XHVcfxQgolctoJiRYmcVCWGpiZ9CBf/CJha1KmD1qQoRIsjLaA== + dependencies: + "@turf/helpers" "^7.2.0" + "@turf/invariant" "^7.2.0" + "@types/geojson" "^7946.0.10" + point-in-polygon-hao "^1.1.0" + tslib "^2.8.1" + "@turf/buffer@^7.0.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@turf/buffer/-/buffer-7.2.0.tgz#781f3bbf9ff48279351502693a782683b690840b" @@ -1516,6 +1551,15 @@ "@types/geojson" "^7946.0.10" tslib "^2.8.1" +"@turf/invariant@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@turf/invariant/-/invariant-7.2.0.tgz#ba5b377ea20ee8c45af0a4c9b8bf03aa1c43bd5d" + integrity sha512-kV4u8e7Gkpq+kPbAKNC21CmyrXzlbBgFjO1PhrHPgEdNqXqDawoZ3i6ivE3ULJj2rSesCjduUaC/wyvH/sNr2Q== + dependencies: + "@turf/helpers" "^7.2.0" + "@types/geojson" "^7946.0.10" + tslib "^2.8.1" + "@turf/jsts@^2.7.1": version "2.7.2" resolved "https://registry.yarnpkg.com/@turf/jsts/-/jsts-2.7.2.tgz#b327aa54ef065cbf1768ad69bd6ae1087385d32b" @@ -1523,6 +1567,16 @@ dependencies: jsts "2.7.1" +"@turf/line-intersect@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@turf/line-intersect/-/line-intersect-7.2.0.tgz#74f6a149429718ff2219329a5e3239f784f44489" + integrity sha512-GhCJVEkc8EmggNi85EuVLoXF5T5jNVxmhIetwppiVyJzMrwkYAkZSYB3IBFYGUUB9qiNFnTwungVSsBV/S8ZiA== + dependencies: + "@turf/helpers" "^7.2.0" + "@types/geojson" "^7946.0.10" + sweepline-intersections "^1.5.0" + tslib "^2.8.1" + "@turf/meta@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@turf/meta/-/meta-7.2.0.tgz#6a6b1918890b4d9d2b5ff10b3ad47e2fd7470912" @@ -1531,6 +1585,16 @@ "@turf/helpers" "^7.2.0" "@types/geojson" "^7946.0.10" +"@turf/polygon-to-line@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@turf/polygon-to-line/-/polygon-to-line-7.2.0.tgz#f1d209606cbe404e29246135695c3fcaa1269fd5" + integrity sha512-9jeTN3LiJ933I5sd4K0kwkcivOYXXm1emk0dHorwXeSFSHF+nlYesEW3Hd889wb9lZd7/SVLMUeX/h39mX+vCA== + dependencies: + "@turf/helpers" "^7.2.0" + "@turf/invariant" "^7.2.0" + "@types/geojson" "^7946.0.10" + tslib "^2.8.1" + "@turf/projection@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@turf/projection/-/projection-7.2.0.tgz#fe4594bafbf44d5f1b696d4b7f8bdbc048f42b4e" @@ -1569,7 +1633,7 @@ dependencies: "@types/geojson" "*" -"@types/geojson@*", "@types/geojson@^7946.0.10", "@types/geojson@^7946.0.16": +"@types/geojson@*", "@types/geojson@^7946.0", "@types/geojson@^7946.0.10", "@types/geojson@^7946.0.16": version "7946.0.16" resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== @@ -2077,6 +2141,19 @@ resolved "https://registry.yarnpkg.com/@vue/tsconfig/-/tsconfig-0.4.0.tgz#f01e2f6089b5098136fb084a0dd0cdd4533b72b0" integrity sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg== +"@xmldom/xmldom@0.8.3": + version "0.8.3" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.3.tgz#beaf980612532aa9a3004aff7e428943aeaa0711" + integrity sha512-Lv2vySXypg4nfa51LY1nU8yDAGo/5YwF+EY/rUZgIbfvwVARcd67ttCM8SMsTeJy51YhHYavEq+FS6R0hW9PFQ== + +JSONStream@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-0.8.0.tgz#efc462d5a5bc94ec007f4b22571acd7f6f2ae013" + integrity sha512-PiV28BpoUorz9kKFwRbD7+wg0t/k0ITHKn0DgCU44YZ/GaGAZRPt9q5PzoifC85gE55SEPIdMu0Labfxevj8cw== + dependencies: + jsonparse "0.0.5" + through "~2.2.7" + abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -2284,6 +2361,11 @@ btoa@^1.2.1: resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + cac@^6.7.14: version "6.7.14" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" @@ -2464,6 +2546,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" + integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.0.2" + typedarray "^0.0.6" + confbox@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/confbox/-/confbox-0.1.7.tgz#ccfc0a2bcae36a84838e83a3b7f770fb17d6c579" @@ -2492,6 +2584,11 @@ core-js@^3.6.0, core-js@^3.8.3: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37" integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -2675,6 +2772,11 @@ dom-walk@^0.1.0: resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== +domelementtype@1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + domexception@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" @@ -2682,6 +2784,13 @@ domexception@^4.0.0: dependencies: webidl-conversions "^7.0.0" +domhandler@2.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.2.1.tgz#59df9dcd227e808b365ae73e1f6684ac3d946fc2" + integrity sha512-MFFBQFGkyTuNe3vL9WEw9JdlCwIoBYpOGESLeZAvc/jClYNsOl6P1KzevJbWg76GovdEycfR7/2/Ra7NnqtMKw== + dependencies: + domelementtype "1" + dompurify@^3.2.4: version "3.2.6" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad" @@ -2689,6 +2798,13 @@ dompurify@^3.2.4: optionalDependencies: "@types/trusted-types" "^2.0.7" +domutils@1.3: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.3.0.tgz#9ad4d59b5af6ca684c62fe6d768ef170e70df192" + integrity sha512-1UdPmldjSGewOuWE40YYFZB1Q4im4LZoCMXGYeTeLz3R9hvxrDYJPRcPHXR4yBbubQebgGNCY2hwpJxmAiUMzQ== + dependencies: + domelementtype "1" + dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" @@ -3325,6 +3441,14 @@ geographiclib-geodesic@^2.1.1: resolved "https://registry.yarnpkg.com/geographiclib-geodesic/-/geographiclib-geodesic-2.1.1.tgz#5f9c02f2e0db5403055ba637f76d9e58b2215863" integrity sha512-lkd8EUkPSByobWu9BPMHTdYA5AUZxOa8McmUNtBE9KrvUJEvSADnN6gTDmhXbi6NzdA16LtWLpSxLE/lIIRhyA== +geojson-numeric@0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/geojson-numeric/-/geojson-numeric-0.2.1.tgz#2c8c032f792cca0747a6e02ffa86c00ee3d2df6c" + integrity sha512-rvItMp3W7pe16o2EQTnRw54v6WHdiE4bYjUsdr3FZskFb6oPC7gjLe4zginP+Wd1B/HLl2acTukfn16Lmwn7lg== + dependencies: + concat-stream "2.0.0" + optimist "~0.3.5" + geojson-vt@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-4.0.2.tgz#1162f6c7d61a0ba305b1030621e6e111f847828a" @@ -3597,6 +3721,16 @@ html2canvas@^1.0.0-rc.5: css-line-break "^2.1.0" text-segmentation "^1.0.3" +htmlparser2@3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.5.1.tgz#6f42f7657dd19c13f7d65de9118417394a0be6d0" + integrity sha512-9ouaQ6sjVJZS4NhPC65zNm2JCJotiH6BVm6iFvI90hRcsIEISMrgjqMUrPpU9G1VS4vTspH4dyaqSRf6JLQPbg== + dependencies: + domelementtype "1" + domhandler "2.2" + domutils "1.3" + readable-stream "1.1" + http-parser-js@>=0.5.1: version "0.5.8" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" @@ -3674,7 +3808,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2: +inherits@2, inherits@^2.0.3, inherits@~2.0.1: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3863,6 +3997,11 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== + isarray@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" @@ -3994,6 +4133,11 @@ jsonc-eslint-parser@^2.3.0: espree "^9.0.0" semver "^7.3.5" +jsonparse@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-0.0.5.tgz#330542ad3f0a654665b778f3eb2d9a9fa507ac64" + integrity sha512-fw7Q/8gFR8iSekUi9I+HqWIap6mywuoe7hQIg3buTVjuZgALKj4HAmm0X6f+TaL4c9NJbvyFQdaI2ppr5p6dnQ== + jspdf@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/jspdf/-/jspdf-3.0.1.tgz#d81e1964f354f60412516eb2449ea2cccd4d2a3b" @@ -4532,6 +4676,13 @@ onetime@^7.0.0: dependencies: mimic-function "^5.0.0" +optimist@~0.3.5: + version "0.3.7" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" + integrity sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ== + dependencies: + wordwrap "~0.0.2" + optionator@^0.9.3: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -4544,6 +4695,28 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" +osm-polygon-features@^0.9.1: + version "0.9.2" + resolved "https://registry.yarnpkg.com/osm-polygon-features/-/osm-polygon-features-0.9.2.tgz#20ae41130c486e49a3b2a3c2b58a1419c4986778" + integrity sha512-5zNEFCq+G6X2TDkqbKYLF1+GtWVCCLA8zX+FVhSogsiTRsGquyaGRy5cYNW4BE3ci0MKOLvNTkFNsjsCNtgz0A== + +osmtogeojson@^3.0.0-beta.5: + version "3.0.0-beta.5" + resolved "https://registry.yarnpkg.com/osmtogeojson/-/osmtogeojson-3.0.0-beta.5.tgz#c58ed8e4fb3a82a41cf3f00cbe79991e17e028b6" + integrity sha512-izvaUWnunrYvMB4LB0ZN15O1+g90c628yHS4SeSR3daVSBF9vdTHL7iVHfg0wEr1uEYjQ+lMJHCiYFusL5yKVg== + dependencies: + "@mapbox/geojson-rewind" "0.5.2" + "@xmldom/xmldom" "0.8.3" + JSONStream "0.8.0" + concat-stream "2.0.0" + geojson-numeric "0.2.1" + htmlparser2 "3.5.1" + optimist "~0.3.5" + osm-polygon-features "^0.9.1" + tiny-osmpbf "^0.1.0" + optionalDependencies: + "@types/geojson" "^7946.0" + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -4662,7 +4835,7 @@ pbf@4.0.1, pbf@^4.0.1: dependencies: resolve-protobuf-schema "^2.1.0" -pbf@^3.2.1, pbf@^3.3.0: +pbf@^3.0.4, pbf@^3.2.1, pbf@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.3.0.tgz#1790f3d99118333cc7f498de816028a346ef367f" integrity sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q== @@ -4738,6 +4911,13 @@ pmtiles@^4.3.0: dependencies: fflate "^0.8.2" +point-in-polygon-hao@^1.1.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/point-in-polygon-hao/-/point-in-polygon-hao-1.2.4.tgz#8662abdcc84bcca230cc3ecbb0b0ab1a306f1bd6" + integrity sha512-x2pcvXeqhRHlNRdhLs/tgFapAbSSe86wa/eqmj1G6pWftbEs5aVRJhRGM6FYSUERKu0PjekJzMq0gsI2XyiclQ== + dependencies: + robust-predicates "^3.0.2" + polylabel@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/polylabel/-/polylabel-1.1.0.tgz#9483e64fc7a12a49f43e07e7a06752214ed2a8e7" @@ -4911,6 +5091,25 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + integrity sha512-E98tWzqShvKDGpR2MbjsDkDQWLW2TfWUC15H4tNQhIJ5Lsta84l8nUGL9/ybltGwe+wZzWPpc1Kmd2wQP4bdCA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^3.0.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -4994,6 +5193,11 @@ robust-predicates@^2.0.4: resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-2.0.4.tgz#0a2367a93abd99676d075981707f29cfb402248b" integrity sha512-l4NwboJM74Ilm4VKfbAtFeGq7aEjWL+5kVFcmgFA2MrdnQWx9iE/tUGvxY5HyMI7o/WpSIUFLbC5fbeaHgSCYg== +robust-predicates@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771" + integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== + rollup@^4.34.9: version "4.41.1" resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.41.1.tgz#46ddc1b33cf1b0baa99320d3b0b4973dc2253b6a" @@ -5064,7 +5268,7 @@ safe-array-concat@^1.1.2: has-symbols "^1.0.3" isarray "^2.0.5" -safe-buffer@>=5.1.0: +safe-buffer@>=5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -5337,6 +5541,18 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -5404,6 +5620,13 @@ svg-pathdata@^6.0.3: resolved "https://registry.yarnpkg.com/svg-pathdata/-/svg-pathdata-6.0.3.tgz#80b0e0283b652ccbafb69ad4f8f73e8d3fbf2cac" integrity sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw== +sweepline-intersections@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sweepline-intersections/-/sweepline-intersections-1.5.0.tgz#85ab3629a291875926fae0acd508496430d8a647" + integrity sha512-AoVmx72QHpKtItPu72TzFL+kcYjd67BPLDoR0LarIk+xyaRg+pDTMFXndIEvZf9xEKnJv6JdhgRMnocoG0D3AQ== + dependencies: + tinyqueue "^2.0.0" + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -5444,11 +5667,29 @@ three@^0.175.0: resolved "https://registry.yarnpkg.com/three/-/three-0.175.0.tgz#67b357b0b1ee8ef0445b9a768f59363ab1fa7921" integrity sha512-nNE3pnTHxXN/Phw768u0Grr7W4+rumGg/H6PgeseNJojkJtmeHJfZWi41Gp2mpXl1pg1pf1zjwR4McM1jTqkpg== +through@~2.2.7: + version "2.2.7" + resolved "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz#6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd" + integrity sha512-JIR0m0ybkmTcR8URann+HbwKmodP+OE8UCbsifQDYMLD5J3em1Cdn3MYPpbEd5elGDwmP98T+WbqP/tvzA5Mjg== + tiny-emitter@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== +tiny-inflate@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" + integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== + +tiny-osmpbf@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tiny-osmpbf/-/tiny-osmpbf-0.1.0.tgz#0a895717113ebe6aae363c4be5eefa8ecdafb927" + integrity sha512-Sl0xuDdM0+bnrYPhTAWnQ5eui8+2cpYCnsBxq0EFR1/IgmfB7+FiC23I8aa7tdP4AjaWvBUMK34kfXdY6C1LCQ== + dependencies: + pbf "^3.0.4" + tiny-inflate "^1.0.2" + tinybench@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.9.0.tgz#103c9f8ba6d7237a47ab6dd1dcff77251863426b" @@ -5482,7 +5723,7 @@ tinyqueue@^1.2.0: resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-1.2.3.tgz#b6a61de23060584da29f82362e45df1ec7353f3d" integrity sha512-Qz9RgWuO9l8lT+Y9xvbzhPT2efIUIFd69N7eF7tJ9lnQl0iLj1M7peK7IoUGZL9DJHw9XftqLreccfxcQgYLxA== -tinyqueue@^2.0.3: +tinyqueue@^2.0.0, tinyqueue@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA== @@ -5602,6 +5843,11 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + typescript@~5.1.6: version "5.1.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" @@ -5680,7 +5926,7 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" -util-deprecate@^1.0.2: +util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -6022,6 +6268,11 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw== + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"