async function getFeaturesNearTiles(minTile, maxTile, matchFunc, features = [], level = 0, maxLevel = 6) {
async function getTile([x, y, z]) {
console.log('tile', x, y, z);
const url = `https://tile.nextzen.org/tilezen/vector/v1/512/all/${z}/${x}/${y}.json?api_key=${nextzenAPIKey}`;
const layers = await fetch(url).then(r => r.json());
const matchedFeatures = matchFunc(layers);
if (matchedFeatures.length > 0) {
features.push(...matchedFeatures);
return true;
}
return false;
}
let tiles = [];
let featureCount = features.length;
const z = minTile[2];
if (minTile[0] === maxTile[0] && minTile[1] === maxTile[1]) {
tiles.push(getTile(minTile));
}
else {
for (let x = minTile[0]; x <= maxTile[0]; x++) {
tiles.push(getTile([x, minTile[1], z]));
tiles.push(getTile([x, maxTile[1], z]));
}
for (let y = minTile[1] + 1; y <= maxTile[1] - 1; y++) {
tiles.push(getTile([minTile[0], y, z]));
tiles.push(getTile([maxTile[0], y, z]));
}
}
await Promise.all(tiles);
if (features.length > featureCount) {
minTile = [minTile[0] - 1, minTile[1] - 1, minTile[2]];
maxTile = [maxTile[0] + 1, maxTile[1] + 1, maxTile[2]];
if (level < maxLevel) {
console.log('expand', minTile, maxTile, features);
await getFeaturesNearTiles(minTile, maxTile, matchFunc, features, level + 1);
}
else {
console.log('hit max expand level');
}
}
return features;
}