in src/graph/Graph.ts [764:853]
public cacheSpatialArea$(key: string): Observable<Graph>[] {
if (!this.hasNode(key)) {
throw new GraphMapillaryError(`Cannot cache spatial area of node that does not exist in graph (${key}).`);
}
if (key in this._cachedSpatialEdges) {
throw new GraphMapillaryError(`Image already spatially cached (${key}).`);
}
if (!(key in this._requiredSpatialArea)) {
throw new GraphMapillaryError(`Spatial area not determined (${key}).`);
}
let spatialArea: SpatialArea = this._requiredSpatialArea[key];
if (Object.keys(spatialArea.cacheNodes).length === 0) {
throw new GraphMapillaryError(`Spatial nodes already cached (${key}).`);
}
if (key in this._cachingSpatialArea$) {
return this._cachingSpatialArea$[key];
}
let batches: string[][] = [];
while (spatialArea.cacheKeys.length > 0) {
batches.push(spatialArea.cacheKeys.splice(0, 200));
}
let batchesToCache: number = batches.length;
let spatialNodes$: Observable<Graph>[] = [];
for (let batch of batches) {
let spatialNodeBatch$: Observable<Graph> = this._api.getSpatialImages$(batch).pipe(
tap(
(items: SpatialImagesContract): void => {
for (const item of items) {
if (!item.node) {
console.warn(`Image is empty (${item.node_id})`);
continue;
}
const id = item.node_id;
const spatialNode = spatialArea.cacheNodes[id];
if (spatialNode.complete) {
delete spatialArea.cacheNodes[id];
continue;
}
this._makeFull(spatialNode, item.node);
delete spatialArea.cacheNodes[id];
}
if (--batchesToCache === 0) {
delete this._cachingSpatialArea$[key];
}
}),
map((): Graph => { return this; }),
catchError(
(error: Error): Observable<Graph> => {
for (let batchKey of batch) {
if (batchKey in spatialArea.all) {
delete spatialArea.all[batchKey];
}
if (batchKey in spatialArea.cacheNodes) {
delete spatialArea.cacheNodes[batchKey];
}
}
if (--batchesToCache === 0) {
delete this._cachingSpatialArea$[key];
}
throw error;
}),
finalize(
(): void => {
if (Object.keys(spatialArea.cacheNodes).length === 0) {
this._changed$.next(this);
}
}),
publish(),
refCount());
spatialNodes$.push(spatialNodeBatch$);
}
this._cachingSpatialArea$[key] = spatialNodes$;
return spatialNodes$;
}