forked from MapComplete/MapComplete
chore: automated housekeeping...
This commit is contained in:
parent
47281a8d6c
commit
3fd14e82a0
84 changed files with 2093 additions and 1450 deletions
|
@ -49,7 +49,7 @@ export default class OverpassFeatureSource implements UpdatableFeatureSource {
|
|||
},
|
||||
options?: {
|
||||
padToTiles?: Store<number>
|
||||
isActive?: Store<boolean>,
|
||||
isActive?: Store<boolean>
|
||||
ignoreZoom?: boolean
|
||||
}
|
||||
) {
|
||||
|
@ -57,7 +57,9 @@ export default class OverpassFeatureSource implements UpdatableFeatureSource {
|
|||
this._isActive = options?.isActive ?? new ImmutableStore(true)
|
||||
this.padToZoomLevel = options?.padToTiles
|
||||
const self = this
|
||||
this._layersToDownload = options?.ignoreZoom? new ImmutableStore(state.layers) : state.zoom.map((zoom) => this.layersToDownload(zoom))
|
||||
this._layersToDownload = options?.ignoreZoom
|
||||
? new ImmutableStore(state.layers)
|
||||
: state.zoom.map((zoom) => this.layersToDownload(zoom))
|
||||
|
||||
state.bounds.mapD(
|
||||
(_) => {
|
||||
|
@ -123,9 +125,11 @@ export default class OverpassFeatureSource implements UpdatableFeatureSource {
|
|||
let bounds: BBox
|
||||
do {
|
||||
try {
|
||||
bounds = overrideBounds ?? this.state.bounds.data
|
||||
?.pad(this.state.widenFactor)
|
||||
?.expandToTileBounds(this.padToZoomLevel?.data)
|
||||
bounds =
|
||||
overrideBounds ??
|
||||
this.state.bounds.data
|
||||
?.pad(this.state.widenFactor)
|
||||
?.expandToTileBounds(this.padToZoomLevel?.data)
|
||||
if (!bounds) {
|
||||
return
|
||||
}
|
||||
|
|
|
@ -42,7 +42,7 @@ export default class ThemeSource extends FeatureSourceMerger {
|
|||
backend: string,
|
||||
isDisplayed: (id: string) => Store<boolean>,
|
||||
mvtAvailableLayers: Set<string>,
|
||||
fullNodeDatabaseSource?: FullNodeDatabaseSource,
|
||||
fullNodeDatabaseSource?: FullNodeDatabaseSource
|
||||
) {
|
||||
const supportsForceDownload: UpdatableFeatureSource[] = []
|
||||
|
||||
|
@ -63,7 +63,7 @@ export default class ThemeSource extends FeatureSourceMerger {
|
|||
{
|
||||
isActive: isDisplayed(layer.id),
|
||||
maxAge: layer.maxAgeOfCache,
|
||||
},
|
||||
}
|
||||
)
|
||||
fromCache.set(layer.id, src)
|
||||
}
|
||||
|
@ -82,7 +82,7 @@ export default class ThemeSource extends FeatureSourceMerger {
|
|||
zoom,
|
||||
backend,
|
||||
featureSwitches,
|
||||
fullNodeDatabaseSource,
|
||||
fullNodeDatabaseSource
|
||||
)
|
||||
nonMvtSources.push(osmApiSource)
|
||||
|
||||
|
@ -91,14 +91,13 @@ export default class ThemeSource extends FeatureSourceMerger {
|
|||
console.log(
|
||||
"Layers ",
|
||||
nonMvtLayers.map((l) => l.id),
|
||||
" cannot be fetched from the cache server, defaulting to overpass/OSM-api",
|
||||
" cannot be fetched from the cache server, defaulting to overpass/OSM-api"
|
||||
)
|
||||
overpassSource = ThemeSource.setupOverpass(osmLayers, bounds, zoom, featureSwitches)
|
||||
nonMvtSources.push(overpassSource)
|
||||
supportsForceDownload.push(overpassSource)
|
||||
}
|
||||
|
||||
|
||||
function setIsLoading() {
|
||||
const loading = overpassSource?.runningQuery?.data || osmApiSource?.isRunning?.data
|
||||
isLoading.setData(loading)
|
||||
|
@ -108,40 +107,47 @@ export default class ThemeSource extends FeatureSourceMerger {
|
|||
osmApiSource?.isRunning?.addCallbackAndRun(() => setIsLoading())
|
||||
|
||||
const geojsonSources: UpdatableFeatureSource[] = geojsonlayers.map((l) =>
|
||||
ThemeSource.setupGeojsonSource(l, mapProperties, isDisplayed(l.id)),
|
||||
ThemeSource.setupGeojsonSource(l, mapProperties, isDisplayed(l.id))
|
||||
)
|
||||
|
||||
const downloadAllBounds: UIEventSource<BBox> = new UIEventSource<BBox>(undefined)
|
||||
const downloadAll= new OverpassFeatureSource({
|
||||
layers: layers.filter(l => l.isNormal()),
|
||||
bounds: mapProperties.bounds,
|
||||
zoom: mapProperties.zoom,
|
||||
overpassUrl: featureSwitches.overpassUrl,
|
||||
overpassTimeout: featureSwitches.overpassTimeout,
|
||||
overpassMaxZoom: new ImmutableStore(99),
|
||||
widenFactor: 0,
|
||||
},{
|
||||
ignoreZoom: true
|
||||
})
|
||||
const downloadAll = new OverpassFeatureSource(
|
||||
{
|
||||
layers: layers.filter((l) => l.isNormal()),
|
||||
bounds: mapProperties.bounds,
|
||||
zoom: mapProperties.zoom,
|
||||
overpassUrl: featureSwitches.overpassUrl,
|
||||
overpassTimeout: featureSwitches.overpassTimeout,
|
||||
overpassMaxZoom: new ImmutableStore(99),
|
||||
widenFactor: 0,
|
||||
},
|
||||
{
|
||||
ignoreZoom: true,
|
||||
}
|
||||
)
|
||||
|
||||
super(...geojsonSources, ...Array.from(fromCache.values()), ...mvtSources, ...nonMvtSources, downloadAll)
|
||||
super(
|
||||
...geojsonSources,
|
||||
...Array.from(fromCache.values()),
|
||||
...mvtSources,
|
||||
...nonMvtSources,
|
||||
downloadAll
|
||||
)
|
||||
|
||||
this.isLoading = isLoading
|
||||
supportsForceDownload.push(...geojsonSources)
|
||||
supportsForceDownload.push(...mvtSources) // Non-mvt sources are handled by overpass
|
||||
|
||||
|
||||
this._mapBounds = mapProperties.bounds
|
||||
this._downloadAll = downloadAll
|
||||
|
||||
this.supportsForceDownload = supportsForceDownload
|
||||
|
||||
}
|
||||
|
||||
private static setupMvtSource(
|
||||
layer: LayerConfig,
|
||||
mapProperties: { zoom: Store<number>; bounds: Store<BBox> },
|
||||
isActive?: Store<boolean>,
|
||||
isActive?: Store<boolean>
|
||||
): UpdatableFeatureSource {
|
||||
return new DynamicMvtileSource(layer, mapProperties, { isActive })
|
||||
}
|
||||
|
@ -149,12 +155,12 @@ export default class ThemeSource extends FeatureSourceMerger {
|
|||
private static setupGeojsonSource(
|
||||
layer: LayerConfig,
|
||||
mapProperties: { zoom: Store<number>; bounds: Store<BBox> },
|
||||
isActiveByFilter?: Store<boolean>,
|
||||
isActiveByFilter?: Store<boolean>
|
||||
): UpdatableFeatureSource {
|
||||
const source = layer.source
|
||||
const isActive = mapProperties.zoom.map(
|
||||
(z) => (isActiveByFilter?.data ?? true) && z >= layer.minzoom,
|
||||
[isActiveByFilter],
|
||||
[isActiveByFilter]
|
||||
)
|
||||
if (source.geojsonZoomLevel === undefined) {
|
||||
// This is a 'load everything at once' geojson layer
|
||||
|
@ -170,7 +176,7 @@ export default class ThemeSource extends FeatureSourceMerger {
|
|||
zoom: Store<number>,
|
||||
backend: string,
|
||||
featureSwitches: FeatureSwitchState,
|
||||
fullNodeDatabase: FullNodeDatabaseSource,
|
||||
fullNodeDatabase: FullNodeDatabaseSource
|
||||
): OsmFeatureSource | undefined {
|
||||
if (osmLayers.length == 0) {
|
||||
return undefined
|
||||
|
@ -204,7 +210,7 @@ export default class ThemeSource extends FeatureSourceMerger {
|
|||
osmLayers: LayerConfig[],
|
||||
bounds: Store<BBox>,
|
||||
zoom: Store<number>,
|
||||
featureSwitches: FeatureSwitchState,
|
||||
featureSwitches: FeatureSwitchState
|
||||
): OverpassFeatureSource | undefined {
|
||||
if (osmLayers.length == 0) {
|
||||
return undefined
|
||||
|
@ -233,14 +239,14 @@ export default class ThemeSource extends FeatureSourceMerger {
|
|||
{
|
||||
padToTiles: zoom.map((zoom) => Math.min(15, zoom + 1)),
|
||||
isActive,
|
||||
},
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
public async downloadAll() {
|
||||
console.log("Downloading all data:")
|
||||
await this._downloadAll.updateAsync(this._mapBounds.data)
|
||||
// await Promise.all(this.supportsForceDownload.map((i) => i.updateAsync()))
|
||||
// await Promise.all(this.supportsForceDownload.map((i) => i.updateAsync()))
|
||||
console.log("Done")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,8 +31,8 @@ export class Imgur extends ImageProvider {
|
|||
url: value,
|
||||
key: key,
|
||||
provider: this,
|
||||
id: value
|
||||
}
|
||||
id: value,
|
||||
},
|
||||
]
|
||||
}
|
||||
return undefined
|
||||
|
@ -88,9 +88,12 @@ export class Imgur extends ImageProvider {
|
|||
*
|
||||
*
|
||||
*/
|
||||
public async DownloadAttribution(providedImage: {
|
||||
url: string
|
||||
}, withResponse?: (obj) => void): Promise<LicenseInfo> {
|
||||
public async DownloadAttribution(
|
||||
providedImage: {
|
||||
url: string
|
||||
},
|
||||
withResponse?: (obj) => void
|
||||
): Promise<LicenseInfo> {
|
||||
const url = providedImage.url
|
||||
const hash = url.substr("https://i.imgur.com/".length).split(/\.jpe?g/i)[0]
|
||||
|
||||
|
@ -98,15 +101,15 @@ export class Imgur extends ImageProvider {
|
|||
const response = await Utils.downloadJsonCached<{
|
||||
data: { description: string; datetime: string; views: number }
|
||||
}>(apiUrl, 365 * 24 * 60 * 60, {
|
||||
Authorization: "Client-ID " + Constants.ImgurApiKey
|
||||
Authorization: "Client-ID " + Constants.ImgurApiKey,
|
||||
})
|
||||
if (withResponse) {
|
||||
withResponse(response)
|
||||
}
|
||||
|
||||
const imgurData = response.data
|
||||
const license= Imgur.parseLicense(imgurData.description ?? "")
|
||||
if(license){
|
||||
const license = Imgur.parseLicense(imgurData.description ?? "")
|
||||
if (license) {
|
||||
license.views = imgurData.views
|
||||
license.date = new Date(Number(imgurData.datetime) * 1000)
|
||||
}
|
||||
|
|
|
@ -371,7 +371,7 @@ export default class LinkedDataLoader {
|
|||
const match = maxstay.match(/P([0-9]+)D/)
|
||||
if (match) {
|
||||
const days = Number(match[1])
|
||||
if(days === 30){
|
||||
if (days === 30) {
|
||||
// 30 is the default which is set if velopark didn't know the actual value
|
||||
return undefined
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ export default class VeloparkLoader {
|
|||
|
||||
private static readonly coder = new CountryCoder(
|
||||
Constants.countryCoderEndpoint,
|
||||
Utils.downloadJson,
|
||||
Utils.downloadJson
|
||||
)
|
||||
|
||||
public static convert(veloparkData: VeloparkData): Feature {
|
||||
|
@ -46,14 +46,14 @@ export default class VeloparkLoader {
|
|||
|
||||
if (veloparkData.contactPoint?.email) {
|
||||
properties["operator:email"] = VeloparkLoader.emailReformatting.reformat(
|
||||
veloparkData.contactPoint?.email,
|
||||
veloparkData.contactPoint?.email
|
||||
)
|
||||
}
|
||||
|
||||
if (veloparkData.contactPoint?.telephone) {
|
||||
properties["operator:phone"] = VeloparkLoader.phoneValidator.reformat(
|
||||
veloparkData.contactPoint?.telephone,
|
||||
() => "be",
|
||||
() => "be"
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -78,7 +78,7 @@ export default class VeloparkLoader {
|
|||
) {
|
||||
const duration = g.maximumParkingDuration.substring(
|
||||
1,
|
||||
g.maximumParkingDuration.length - 1,
|
||||
g.maximumParkingDuration.length - 1
|
||||
)
|
||||
if (duration !== "30") {
|
||||
// We don't set maxstay if it is 30, they are the default value that velopark chose for "unknown"
|
||||
|
@ -97,11 +97,11 @@ export default class VeloparkLoader {
|
|||
const startHour = spec.opens
|
||||
const endHour = spec.closes === "23:59" ? "24:00" : spec.closes
|
||||
const merged = OH.MergeTimes(
|
||||
OH.ParseRule(dayOfWeek + " " + startHour + "-" + endHour),
|
||||
OH.ParseRule(dayOfWeek + " " + startHour + "-" + endHour)
|
||||
)
|
||||
return OH.ToString(merged)
|
||||
})
|
||||
.join("; "),
|
||||
.join("; ")
|
||||
)
|
||||
properties.opening_hours = oh
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue