diff --git a/package-lock.json b/package-lock.json index fc88e67e41..fd590a5fa7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -62,8 +62,7 @@ "latlon2country": "^1.2.7", "libphonenumber-js": "^1.11.19", "mangrove-reviews-typescript": "^1.3.1", - "maplibre": "^0.0.1-security", - "maplibre-gl": "^5.1.0 ", + "maplibre-gl": "^5.1.0", "marked": "^12.0.2", "monaco-editor": "^0.46.0", "mvt-to-geojson": "^0.0.6", @@ -73,7 +72,7 @@ "osm-auth": "^2.6.0", "osmtogeojson": "^3.0.0-beta.5", "pannellum": "^2.5.6", - "panoramax-js": "^0.4.8", + "panoramax-js": "^0.4.11", "panzoom": "^9.4.3", "papaparse": "^5.5.2", "pg": "^8.11.3", @@ -19352,11 +19351,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/maplibre": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/maplibre/-/maplibre-0.0.1-security.tgz", - "integrity": "sha512-XawLsomeCq3O+x3IYTlU1QH52m9JvgEZvffgzWZ9P61HdSghJFzLUJjGXvtwV3hEuuZy9v9iSCG7W8pfr8p4Eg==" - }, "node_modules/maplibre-gl": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.1.0.tgz", @@ -23013,9 +23007,10 @@ "license": "MIT" }, "node_modules/panoramax-js": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/panoramax-js/-/panoramax-js-0.4.8.tgz", - "integrity": "sha512-z4kV++aHZXJ18S29DwoPScMbewNsSm69LWkmHIJzBOB0xTEUZnWyMzx+lp+5ykAJEBqlYaEhanbETlavyFiMVw==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/panoramax-js/-/panoramax-js-0.4.11.tgz", + "integrity": "sha512-TrNSFMOb1nCFej+nzu0d7iGdWbToALvPkfWZdMi0l/yeQr/xj/r/ONCvSb98w8q7kAWaZnstVjs3VEC1zRqftg==", + "license": "GPL-3.0-or-later", "dependencies": { "@ogcapi-js/features": "^1.1.1", "@ogcapi-js/shared": "^1.1.1", @@ -43837,11 +43832,6 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" }, - "maplibre": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/maplibre/-/maplibre-0.0.1-security.tgz", - "integrity": "sha512-XawLsomeCq3O+x3IYTlU1QH52m9JvgEZvffgzWZ9P61HdSghJFzLUJjGXvtwV3hEuuZy9v9iSCG7W8pfr8p4Eg==" - }, "maplibre-gl": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.1.0.tgz", @@ -46230,9 +46220,9 @@ "integrity": "sha512-R4kSPpj36wQPlyIi9ZftxPfVYF11DEbNBATUEI+pkMGZDFYBV5Jxi6tYFVDdmxA2xaTeKZQHMIuIIj7njVSTQQ==" }, "panoramax-js": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/panoramax-js/-/panoramax-js-0.4.8.tgz", - "integrity": "sha512-z4kV++aHZXJ18S29DwoPScMbewNsSm69LWkmHIJzBOB0xTEUZnWyMzx+lp+5ykAJEBqlYaEhanbETlavyFiMVw==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/panoramax-js/-/panoramax-js-0.4.11.tgz", + "integrity": "sha512-TrNSFMOb1nCFej+nzu0d7iGdWbToALvPkfWZdMi0l/yeQr/xj/r/ONCvSb98w8q7kAWaZnstVjs3VEC1zRqftg==", "requires": { "@ogcapi-js/features": "^1.1.1", "@ogcapi-js/shared": "^1.1.1", diff --git a/package.json b/package.json index 4c02c6b8da..1de850a72a 100644 --- a/package.json +++ b/package.json @@ -233,7 +233,7 @@ "osm-auth": "^2.6.0", "osmtogeojson": "^3.0.0-beta.5", "pannellum": "^2.5.6", - "panoramax-js": "^0.4.8", + "panoramax-js": "^0.4.11", "panzoom": "^9.4.3", "papaparse": "^5.5.2", "pg": "^8.11.3", diff --git a/src/Logic/ImageProviders/ImageProvider.ts b/src/Logic/ImageProviders/ImageProvider.ts index 63602d3b39..690842bfa1 100644 --- a/src/Logic/ImageProviders/ImageProvider.ts +++ b/src/Logic/ImageProviders/ImageProvider.ts @@ -20,7 +20,8 @@ export interface ProvidedImage { lat?: number lon?: number host?: string - isSpherical: boolean + isSpherical: boolean, + license?: LicenseInfo } export interface PanoramaView { diff --git a/src/Logic/ImageProviders/Panoramax.ts b/src/Logic/ImageProviders/Panoramax.ts index 84dcceaf3b..0b6dc4e80c 100644 --- a/src/Logic/ImageProviders/Panoramax.ts +++ b/src/Logic/ImageProviders/Panoramax.ts @@ -24,7 +24,7 @@ export default class PanoramaxImageProvider extends ImageProvider { public defaultKeyPrefixes: string[] = ["panoramax"] public readonly name: string = "panoramax" - private static knownMeta: Record = {} + private static knownMeta: Record; time: Date }> = {} public SourceIcon( img?: { id: string; url: string }, @@ -45,8 +45,8 @@ export default class PanoramaxImageProvider extends ImageProvider { ) } - public addKnownMeta(meta: ImageData) { - PanoramaxImageProvider.knownMeta[meta.id] = { data: meta, time: new Date() } + public addKnownMeta(meta: ImageData, url?: string) { + PanoramaxImageProvider.knownMeta[meta.id] = { data: Promise.resolve({ data: meta, url }), time: new Date() } } /** @@ -102,16 +102,7 @@ export default class PanoramaxImageProvider extends ImageProvider { } } - private async getInfoFor(id: string): Promise<{ data: ImageData; url: string }> { - if (!id.match(/^[a-zA-Z0-9-]+$/)) { - return undefined - } - const cached = PanoramaxImageProvider.knownMeta[id] - if (cached) { - if (new Date().getTime() - cached.time.getTime() < 1000) { - return { data: cached.data, url: undefined } - } - } + private async getInfoForUncached(id: string) { try { return await this.getInfoFromMapComplete(id) } catch (e) { @@ -125,6 +116,25 @@ export default class PanoramaxImageProvider extends ImageProvider { return undefined } + private async getInfoFor(id: string): Promise<{ data: ImageData; url: string }> { + if (!id.match(/^[a-zA-Z0-9-]+$/)) { + return undefined + } + const cached = PanoramaxImageProvider.knownMeta[id] + if (cached) { + if (new Date().getTime() - cached.time.getTime() < 5000) { + return await cached.data + } + } + const promise: Promise<{ data: ImageData; url: string }> = this.getInfoForUncached(id) + PanoramaxImageProvider.knownMeta[id] = { + time: new Date(), + data: promise + } + return await promise + + } + public async ExtractUrls(key: string, value: string): Promise { if (!Panoramax.isId(value)) { return undefined @@ -139,7 +149,7 @@ export default class PanoramaxImageProvider extends ImageProvider { getRelevantUrls(tags: Record, prefixes: string[]): Store { const source = UIEventSource.FromPromise(super.getRelevantUrlsFor(tags, prefixes)) - + console.trace("Getting relevant URLS for panoramax yielded", source.data) function hasLoading(data: ProvidedImage[]) { if (data === undefined) { return true diff --git a/src/Logic/Web/NearbyImagesSearch.ts b/src/Logic/Web/NearbyImagesSearch.ts index 3bff2e9c60..80ecbf5cf9 100644 --- a/src/Logic/Web/NearbyImagesSearch.ts +++ b/src/Logic/Web/NearbyImagesSearch.ts @@ -172,7 +172,7 @@ class ImagesFromPanoramaxFetcher implements ImageFetcher { "https://panoramax.mapcomplete.org", ] - constructor(url?: string, radius: number = 100) { + constructor(url?: string, radius: number = 50) { this._radius = radius if (url) { this._panoramax = new Panoramax(url) @@ -182,12 +182,11 @@ class ImagesFromPanoramaxFetcher implements ImageFetcher { } public async fetchImages(lat: number, lon: number): Promise { - const bboxObj = new BBox([ - GeoOperations.destination([lon, lat], this._radius * Math.sqrt(2), -45), - GeoOperations.destination([lon, lat], this._radius * Math.sqrt(2), 135), - ]) - const bbox: [number, number, number, number] = bboxObj.toLngLatFlat() - const images = await this._panoramax.search({ bbox, limit: 1000 }) + const images = await this._panoramax.search({ + place: [lon, lat], + place_distance: this._radius ?? 50, + limit: 50 + }) return images.map((i) => { const [lng, lat] = i.geometry.coordinates diff --git a/src/UI/Image/ImageAttribution.svelte b/src/UI/Image/ImageAttribution.svelte index 46bb525fc2..aaefb59a88 100644 --- a/src/UI/Image/ImageAttribution.svelte +++ b/src/UI/Image/ImageAttribution.svelte @@ -1,7 +1,7 @@