diff --git a/src/Logic/ImageProviders/ImageProvider.ts b/src/Logic/ImageProviders/ImageProvider.ts index 99b23f01b..8d9f8df17 100644 --- a/src/Logic/ImageProviders/ImageProvider.ts +++ b/src/Logic/ImageProviders/ImageProvider.ts @@ -36,6 +36,7 @@ export interface PanoramaView { */ northOffset?: number pitchOffset?: number + provider: ImageProvider | string } /** @@ -124,7 +125,7 @@ export default abstract class ImageProvider { public abstract DownloadAttribution(providedImage: { url: string - id: string + id?: string }): Promise public abstract apiUrls(): string[] diff --git a/src/Logic/ImageProviders/Mapillary.ts b/src/Logic/ImageProviders/Mapillary.ts index 64b477bd6..44b95ec55 100644 --- a/src/Logic/ImageProviders/Mapillary.ts +++ b/src/Logic/ImageProviders/Mapillary.ts @@ -169,6 +169,8 @@ export class Mapillary extends ImageProvider { properties: { url: response.thumb_2048_url, northOffset: response.computed_compass_angle, + provider: this, + imageMeta: image }, } } diff --git a/src/Logic/ImageProviders/Panoramax.ts b/src/Logic/ImageProviders/Panoramax.ts index 4bcf26742..3494c563a 100644 --- a/src/Logic/ImageProviders/Panoramax.ts +++ b/src/Logic/ImageProviders/Panoramax.ts @@ -208,8 +208,8 @@ export default class PanoramaxImageProvider extends ImageProvider { } public async DownloadAttribution(providedImage: { - url: string - id: string + id: string, + url: string // Actually not used }): Promise { const meta = await this.getInfoFor(providedImage.id) @@ -245,10 +245,12 @@ export default class PanoramaxImageProvider extends ImageProvider { return >{ type: "Feature", geometry: imageInfo.geometry, - properties: { + properties: { url, northOffset, pitchOffset, + provider: this, + imageMeta: imageInfo }, } } diff --git a/src/Logic/Web/NearbyImagesSearch.ts b/src/Logic/Web/NearbyImagesSearch.ts index 7e3240409..3bcb1de3a 100644 --- a/src/Logic/Web/NearbyImagesSearch.ts +++ b/src/Logic/Web/NearbyImagesSearch.ts @@ -17,7 +17,7 @@ interface ImageFetcher { * @param lat * @param lon */ - fetchImages(lat: number, lon: number): Promise + fetchImages(lat: number, lon: number): Promise<(P4CPicture & { id: string })[]> readonly name: string } @@ -25,7 +25,7 @@ interface ImageFetcher { class CachedFetcher implements ImageFetcher { private readonly _fetcher: ImageFetcher private readonly _zoomlevel: number - private readonly cache: Map> = new Map< + private readonly cache: Map> = new Map< number, Promise >() @@ -37,7 +37,7 @@ class CachedFetcher implements ImageFetcher { this.name = fetcher.name } - fetchImages(lat: number, lon: number): Promise { + fetchImages(lat: number, lon: number): Promise<(P4CPicture & { id: string })[]> { const tile = Tiles.embedded_tile(lat, lon, this._zoomlevel) const tileIndex = Tiles.tile_index(tile.z, tile.x, tile.y) if (this.cache.has(tileIndex)) { @@ -80,7 +80,7 @@ class NearbyImageUtils { } class P4CImageFetcher implements ImageFetcher { - public static readonly services = ["mapillary", "flickr", "kartaview", "wikicommons"] as const + public static readonly services = ["flickr", "kartaview", "wikicommons"] as const public static readonly apiUrls = ["https://api.flickr.com"] private _options: { maxDaysOld: number; searchRadius: number } public readonly name: P4CService @@ -90,7 +90,7 @@ class P4CImageFetcher implements ImageFetcher { this._options = options } - async fetchImages(lat: number, lon: number): Promise { + async fetchImages(lat: number, lon: number): Promise<(P4CPicture & { id: string })[]> { const picManager = new P4C.PicturesManager({ usefetchers: [this.name] }) const maxAgeSeconds = (this._options?.maxDaysOld ?? 3 * 365) * 24 * 60 * 60 * 1000 const searchRadius = this._options?.searchRadius ?? 100 @@ -272,7 +272,7 @@ class MapillaryFetcher implements ImageFetcher { this.end_captured_at = options?.end_captured_at } - async fetchImages(lat: number, lon: number): Promise { + async fetchImages(lat: number, lon: number): Promise<(P4CPicture & { id: string })[]> { const boundingBox = new BBox([[lon, lat]]).padAbsolute(0.003) let url = "https://graph.mapillary.com/images?fields=geometry,computed_geometry,creator,id,captured_at,thumb_256_url,thumb_original_url,compass_angle&bbox=" + @@ -313,7 +313,7 @@ class MapillaryFetcher implements ImageFetcher { captured_at: number }[] }>(url) - const pics: P4CPicture[] = [] + const pics: (P4CPicture & { id: string })[] = [] for (const img of response.data) { const c = img.computed_geometry?.coordinates ?? img.geometry.coordinates if (img.thumb_original_url === undefined) { @@ -322,6 +322,7 @@ class MapillaryFetcher implements ImageFetcher { const [lon, lat] = img.computed_geometry.coordinates pics.push({ pictureUrl: img.thumb_original_url, + id: img.id, provider: "Mapillary", coordinates: { lng: c[0], lat: c[1] }, thumbUrl: img.thumb_256_url, @@ -411,7 +412,7 @@ export class CombinedFetcher { lon: number, lat: number ): { - images: Store + images: Store<(P4CPicture & { provider })[]> state: Store> } { const sink = new UIEventSource([]) diff --git a/src/UI/Image/NearbyImages.svelte b/src/UI/Image/NearbyImages.svelte index 484b56169..7c1cb52df 100644 --- a/src/UI/Image/NearbyImages.svelte +++ b/src/UI/Image/NearbyImages.svelte @@ -68,6 +68,7 @@ northOffset: p4c.direction, rotation: p4c.direction, spherical: p4c.details.isSpherical ? "yes" : "no", + provider: p4c.provider }, } )