使用 Google 地图 API 进行反向地理编码的 Axios 块请求
Axios chunk requests for reverse geocoding with Google Maps API
请帮忙!我正在尝试使用 nodejs、axios 和 google 地图 api 进行批量反向地理编码操作。这是主要功能:
function reverse_geocode (data) {
console.log('Working...')
let records = []
chunks = chunkArray(data, 50) // Split data into chunks
chunks.forEach(chunk => {
records.push(process_chunk(chunk)) // Do the requests for each chunk then
// push into array the results
})
console.log(records)
}
我有一组 773 个 {lat, lng} 对象,我使用这个函数将它们分成 50 个元素的块:
function chunkArray(myArray, chunk_size){
var index = 0
var arrayLength = myArray.length
var tempArray = []
for (index = 0; index < arrayLength; index += chunk_size) {
myChunk = myArray.slice(index, index+chunk_size)
tempArray.push(myChunk)
}
return tempArray
}
接下来,我将每个块传递给使用 axios.all:
发出请求的异步函数
async function process_chunk(chunk){
const key = process.env.GOOGLE_MAPS_API_KEY
let promises = []
let chunk_records = []
chunk.forEach(element => {
query = `https://maps.googleapis.com/maps/api/geocode/json?`+
`latlng=${element.latitude},${element.longitude}&key=${key}`+
`&result_type=administrative_area_level_3`
promises.push(axios.get(query)
.catch(function(err){
console.log(err)
}))
})
let responses = await axios.all(promises)
.catch(function(err){
console.log(err)
})
console.log('Responses downloaded... Processing')
responses.forEach(function(response){
res_data = response.data['results'][0]
comune = res_data['address_components'][0]['long_name']
provincia = res_data['address_components'][1]['short_name']
lat = res_data['geometry']['location']['lat']
lng = res_data['geometry']['location']['lng']
chunk_records.push(
{
lat: lat,
lng: lng,
comune: comune,
provincia: provincia
}
)
})
return chunk_records
}
最终结果是记录有未决的承诺,几秒钟后出现几个 'socket hang up' 错误代码 'ECONNRESET':
Listening
Working...
[
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> }
]
Error: socket hang up
at connResetException (internal/errors.js:570:14)
at TLSSocket.socketOnEnd (_http_client.js:440:23)
at TLSSocket.emit (events.js:215:7)
at endReadableNT (_stream_readable.js:1184:12)
at processTicksAndRejections (internal/process/task_queues.js:80:21) {
code: 'ECONNRESET',
我做错了什么?还有其他方法可以做同样的事情吗?在此先感谢您的任何建议!
我自己找的。实际上是非常愚蠢的错误。所以在 reverse_geocode()
中的 forEach 中,我不等待 process_chunk()
返回的承诺来解决。
切换到正常的 for 循环:
async function reverse_geocode (data) {
console.log('Working...')
let records = []
chunks = chunkArray(data, 50) // Split data into chunks
for(let i = 0; i < chunks.length; i++){
processed_chunk = await process_chunk(chunks[i])
records.push(processed_chunk)
}
console.log(records)
}
请帮忙!我正在尝试使用 nodejs、axios 和 google 地图 api 进行批量反向地理编码操作。这是主要功能:
function reverse_geocode (data) {
console.log('Working...')
let records = []
chunks = chunkArray(data, 50) // Split data into chunks
chunks.forEach(chunk => {
records.push(process_chunk(chunk)) // Do the requests for each chunk then
// push into array the results
})
console.log(records)
}
我有一组 773 个 {lat, lng} 对象,我使用这个函数将它们分成 50 个元素的块:
function chunkArray(myArray, chunk_size){
var index = 0
var arrayLength = myArray.length
var tempArray = []
for (index = 0; index < arrayLength; index += chunk_size) {
myChunk = myArray.slice(index, index+chunk_size)
tempArray.push(myChunk)
}
return tempArray
}
接下来,我将每个块传递给使用 axios.all:
发出请求的异步函数async function process_chunk(chunk){
const key = process.env.GOOGLE_MAPS_API_KEY
let promises = []
let chunk_records = []
chunk.forEach(element => {
query = `https://maps.googleapis.com/maps/api/geocode/json?`+
`latlng=${element.latitude},${element.longitude}&key=${key}`+
`&result_type=administrative_area_level_3`
promises.push(axios.get(query)
.catch(function(err){
console.log(err)
}))
})
let responses = await axios.all(promises)
.catch(function(err){
console.log(err)
})
console.log('Responses downloaded... Processing')
responses.forEach(function(response){
res_data = response.data['results'][0]
comune = res_data['address_components'][0]['long_name']
provincia = res_data['address_components'][1]['short_name']
lat = res_data['geometry']['location']['lat']
lng = res_data['geometry']['location']['lng']
chunk_records.push(
{
lat: lat,
lng: lng,
comune: comune,
provincia: provincia
}
)
})
return chunk_records
}
最终结果是记录有未决的承诺,几秒钟后出现几个 'socket hang up' 错误代码 'ECONNRESET':
Listening
Working...
[
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> },
Promise { <pending> }
]
Error: socket hang up
at connResetException (internal/errors.js:570:14)
at TLSSocket.socketOnEnd (_http_client.js:440:23)
at TLSSocket.emit (events.js:215:7)
at endReadableNT (_stream_readable.js:1184:12)
at processTicksAndRejections (internal/process/task_queues.js:80:21) {
code: 'ECONNRESET',
我做错了什么?还有其他方法可以做同样的事情吗?在此先感谢您的任何建议!
我自己找的。实际上是非常愚蠢的错误。所以在 reverse_geocode()
中的 forEach 中,我不等待 process_chunk()
返回的承诺来解决。
切换到正常的 for 循环:
async function reverse_geocode (data) {
console.log('Working...')
let records = []
chunks = chunkArray(data, 50) // Split data into chunks
for(let i = 0; i < chunks.length; i++){
processed_chunk = await process_chunk(chunks[i])
records.push(processed_chunk)
}
console.log(records)
}