// The API Key provided is restricted to JSFiddle website
// Get your own API Key on https://myprojects.geoapify.com
const myAPIKey = "6dc7fb95a3b246cfa0f3bcef5ce9ed9a";
// number of retries, if it is 2, then in total we will see 3 requests (1 initial + 2 retries)
const maxRetries = 2;
const retryDelayInMillis = 500;
const rpsLimit = 5;
const delayBetweenBatchesInMillis = 1000;
const addresses = [
"North Oak Street, Bethalto, IL 62010, USA",
"2809 College Avenue, Alton, IL 62002, USA",
"1 Lock and Dam Way, Alton, IL 62002, USA",
"40 West Ferguson Avenue, Wood River, IL 62095, USA",
"Illinois Route 111, Roxana, IL 62084, USA",
"715 North Main Street, Edwardsville, IL 62025, USA",
"620 Saint Louis Street, Edwardsville, IL 62025, USA",
"409 South Buchanan Street, Edwardsville, IL 62025, USA",
"722 Holyoake Road, Edwardsville, IL 62025, USA",
"1 Lewis and Clark Trail, Hartford, IL 62048, USA",
"Woodcrest Lane, Hazelwood, MO 63042, USA",
"14301 Creve Coeur Airport Road, Maryland Heights, MO 63146, USA",
"Plum Street, Collinsville, IL 62234, USA",
"4600 Labadie Avenue, St. Louis, MO 63115, USA",
"30 Ramey Street, Collinsville, IL 62234, USA",
"2505 Saint Louis Avenue, St. Louis, MO 63106, USA",
"2223 Saint Louis Avenue, St. Louis, MO 63106, USA",
"Westmoreland Avenue, Clayton, MO 63105, USA",
"1 Forsyth Boulevard, St. Louis, MO 63130, USA",
"5700 Lindell Boulevard, St. Louis, MO 63018, USA",
"650 Maryville University Drive, Town and Country, MO 63141, USA",
"4652 Maryland Avenue, St. Louis, MO 63108, USA",
"478 Covenat Lane, Creve Coeur, MO 63141, USA",
"3750 Washington Boulevard, St. Louis, MO 63108, USA",
"1 Fine Arts Drive, St. Louis, MO 63110, USA",
"2716 Doctor Martin Luther King Drive, St. Louis, MO 63106, USA",
"3441 Olive Street, St. Louis, MO 63103, USA",
"2660 Delmar Boulevard, St. Louis, MO 63103, USA",
"3415 Olive Street, St. Louis, MO 63103, USA",
"750 North 16th Street, St. Louis, MO 63103, USA",
"1508 Locust Street, St. Louis, MO 63103, USA",
"720 North 2nd Street, St. Louis, MO 63102, USA",
"615 Washington Avenue, St. Louis, MO 63101, USA",
"5050 Oakland Avenue, St. Louis, MO 63110, USA",
"1315 Chestnut Street, St. Louis, MO 63103, USA",
"1005 Pennsylvania Avenue, East St. Louis, IL 62201, USA",
"411 Locust Street, St. Louis, MO 63102, USA",
"1101 Macklind Avenue, St. Louis, MO 63110, USA",
"11 North 4th Street, St. Louis, MO 63101, USA",
"Gateway Arch Trail, St. Louis, MO 63102, USA",
"283 Lamp & Lantern Village, Town and Country, MO 63017, USA",
]
const geocodeAPI = "https://api.geoapify.com/v1/geocode";
async function geocodeWithRpsLimit(addresses, rps) {
const geocodeRequests = addresses.map(address => () => callGeocode(address));
return await executeRequestsWithRPS(geocodeRequests, rps);
}
async function callGeocode(address, attempt = 1) {
const url = `${geocodeAPI}/search?text=${encodeURIComponent(address)}&limit=1&apiKey=${myAPIKey}`;
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error occured Status: ${response.status}`);
}
const data = await response.json();
return data.features.length ? data.features[0] : {
error: "Not found"
};
} catch (error) {
if (attempt <= maxRetries) {
await new Promise(resolve => setTimeout(resolve, retryDelayInMillis));
return callGeocode(address, attempt + 1);
} else {
return {
error: error.toString()
};
}
}
}
async function executeRequestsWithRPS(geocodeRequests, rps) {
const result = new Array(geocodeRequests.length);
const promises = [];
for (let startIndex = 0; startIndex < geocodeRequests.length; startIndex += rps) {
const endIndex = Math.min(startIndex + rps, geocodeRequests.length);
console.log(`Sending from ${startIndex + 1} to ${endIndex} addresses`);
const batch = geocodeRequests.slice(startIndex, endIndex).map((execute, index) =>
execute().then(res => {
result[startIndex + index] = res;
})
);
promises.push(...batch);
if (endIndex < geocodeRequests.length) {
await new Promise(resolve => setTimeout(resolve, delayBetweenBatchesInMillis));
}
}
await Promise.all(promises);
return result;
}
document.getElementById("button").addEventListener("click", () => {
document.getElementById("button").innerText = 'In progress...';
document.getElementById("button").disabled = true;
geocodeWithRpsLimit(addresses, rpsLimit).then(results => {
document.getElementById("button").innerText = 'Geocode with RPS';
document.getElementById("button").disabled = false;
console.log(results);
});
});
<button id="button">Geocode with RPS</button>