Javascript NodeJS中的同步地理编码

Javascript NodeJS中的同步地理编码,javascript,node.js,asynchronous,geocode,Javascript,Node.js,Asynchronous,Geocode,是否可以等待异步调用(geocode.reverseGeocode)?我想循环浏览目录中的JPG文件,从它们的EXIF数据中获取纬度和经度,并反转地理代码以获取这些图片拍摄的国家/城市。最后,它需要向文件中添加一个OSX标记。但是我需要多次运行NodeJS脚本来获取所有标记。(因为文件迭代器不等待地理编码过程)。等待此请求的最佳解决方案是什么 您可以在此处找到我的代码: 提前感谢处理多个异步调用的简单方法是使用承诺,而无需同步运行它们并等待一个异步调用完成。您可以使用节点中可用的本机承诺,也可

是否可以等待异步调用(geocode.reverseGeocode)?我想循环浏览目录中的JPG文件,从它们的EXIF数据中获取纬度和经度,并反转地理代码以获取这些图片拍摄的国家/城市。最后,它需要向文件中添加一个OSX标记。但是我需要多次运行NodeJS脚本来获取所有标记。(因为文件迭代器不等待地理编码过程)。等待此请求的最佳解决方案是什么

您可以在此处找到我的代码:


提前感谢

处理多个异步调用的简单方法是使用承诺,而无需同步运行它们并等待一个异步调用完成。您可以使用节点中可用的本机承诺,也可以使用承诺库,例如,可以承诺其他执行异步操作的库

最简单的用例如下所示

var Promise = require("bluebird");
var geocoder = Promise.promisifyAll(require('geocoder'))

geocoder.geocodeAsync("Atlanta, GA")
.then(function(data){
    var lat = data.results[0].geometry.location.lat;
    var lng = data.results[0].geometry.location.lng;
    console.log("Coordinates for Atlanta, GA: " + lat + "," + lng);
});
使用promisified函数
geocodeAsync
(原始函数名+
Async
),该函数返回一个承诺,返回的数据作为解析值

在您希望执行多个异步代码的情况下,您可以轻松地创建一个承诺数组,然后让它们并行运行,并在所有承诺都解决后处理结果

var citiesToGeocode = ["Miami, FL", "New York", "Orlando, FL", "Rio de Janeiro, Brazil"];
var geocodePromises = [];
for (var i = 0; i < citiesToGeocode.length-1; ++i) {
    geocodePromises.push(geocoder.geocodeAsync(citiesToGeocode[i]));
}

Promise.all(geocodePromises).then(function(result) {
    result.forEach(function(geocodeResponse){
        console.log("Coordinates for " + geocodeResponse.results[0].formatted_address +": " + geocodeResponse.results[0].geometry.location.lat + "," + geocodeResponse.results[0].geometry.location.lng);
    });
});
var citiesToGeocode=[“佛罗里达州迈阿密”、“纽约”、“佛罗里达州奥兰多”、“巴西里约热内卢”];
var geocodepromissions=[];
对于(变量i=0;i

使用相同的方法,您可以使用
reverseGeocodeAsync
从坐标中查找信息。

处理多个异步调用的简单方法是使用承诺,而无需同步运行它们并等待一个承诺完成。您可以使用节点中可用的本机承诺,也可以使用承诺库,例如,可以承诺其他执行异步操作的库

最简单的用例如下所示

var Promise = require("bluebird");
var geocoder = Promise.promisifyAll(require('geocoder'))

geocoder.geocodeAsync("Atlanta, GA")
.then(function(data){
    var lat = data.results[0].geometry.location.lat;
    var lng = data.results[0].geometry.location.lng;
    console.log("Coordinates for Atlanta, GA: " + lat + "," + lng);
});
使用promisified函数
geocodeAsync
(原始函数名+
Async
),该函数返回一个承诺,返回的数据作为解析值

在您希望执行多个异步代码的情况下,您可以轻松地创建一个承诺数组,然后让它们并行运行,并在所有承诺都解决后处理结果

var citiesToGeocode = ["Miami, FL", "New York", "Orlando, FL", "Rio de Janeiro, Brazil"];
var geocodePromises = [];
for (var i = 0; i < citiesToGeocode.length-1; ++i) {
    geocodePromises.push(geocoder.geocodeAsync(citiesToGeocode[i]));
}

Promise.all(geocodePromises).then(function(result) {
    result.forEach(function(geocodeResponse){
        console.log("Coordinates for " + geocodeResponse.results[0].formatted_address +": " + geocodeResponse.results[0].geometry.location.lat + "," + geocodeResponse.results[0].geometry.location.lng);
    });
});
var citiesToGeocode=[“佛罗里达州迈阿密”、“纽约”、“佛罗里达州奥兰多”、“巴西里约热内卢”];
var geocodepromissions=[];
对于(变量i=0;i

使用相同的方法,您可以使用
reverseGeocodeAsync
从坐标中查找信息。

这是我的代码。如您所见,我需要一个根级别的承诺集合。我的目标是获得包含文件名及其地理编码数据的承诺集合

var
    _ = require('lodash'),
    path = require('path'),
    pkg = require(path.join(__dirname, 'package.json')),
    fs = require('fs'),
    promise = require('bluebird'),
    exif = require('exif').ExifImage,
    geocoder = promise.promisifyAll(require('geocoder')),
    exec = require('child_process').exec,
    config = require('nconf').file({
        file: path.join(__dirname, 'config.json')
    });

var geocodePromises = []; // I want to collect all promises here

fs.readdir(path.join(__dirname, 'files'), function (err, files) {
    files.filter(function (file) {
        var ext = file.split('.').pop(),
            cond;

        cond = file; // File needs to exist
        cond = cond && file[0] != '.'; // Exclude hidden files
        cond = cond && config.get("files:support").indexOf(ext) > -1; // File needs to be supported

        return cond;
    }).forEach(function (file) {
        file = path.join(__dirname, 'files/') + file;

        new exif({
            image: file
        }, function (err, data) {
            if (!err) {
                if (data.gps) {
                    var location = parseGPS(data.gps); // Obtain lat & lng

                    geocodePromises.push(geocoder.reverseGeocodeAsync(location.lat, location.lng));
                } else {
                    console.log("Error: GPS data not available");
                }
            } else {
                console.log("Error: " + err);
            }
        });
    });

    Promise.all(geocodePromises).then(function (result) {
        console.log(result); // Returns an empty array []
        // Each result should contain the filename and geocoded location

        /*
            Example:

            {
                "file": "1.jpg",
                "location": {
                    <google reverseGeocode object>
                }
            }
        */
    });

    //exec('killall Finder');
});

function parseGPS(gps) {
    var lat = gps.GPSLatitude,
        lng = gps.GPSLongitude,
        latRef = gps.GPSLatitudeRef || "N",
        lngRef = gps.GPSLongitudeRef || "W";

    // Convert coordinates to WGS84 decimal
    lat = (lat[0] + lat[1] / 60 + lat[2] / 3600) * (latRef == "N" ? 1 : -1);
    lng = (lng[0] + lng[1] / 60 + lng[2] / 3600) * (lngRef == "W" ? -1 : 1);

    // Return lat, lng
    return {
        lat,
        lng
    };
};
var
_=需要('lodash'),
path=require('path'),
pkg=require(path.join(uu dirname,'package.json')),
fs=需要('fs'),
承诺=要求(“蓝鸟”),
exif=require('exif')。ExifImage,
geocoder=promise.promisifyAll(require('geocoder')),
exec=require('child_process')。exec,
config=require('nconf')。文件({
文件:path.join(uu dirname,'config.json')
});
var geocodepromissions=[];//我想在这里收集所有的承诺
fs.readdir(path.join(_dirname,'files')、函数(err,files){
files.filter(函数(文件){
var ext=file.split('.').pop(),
康德;
cond=file;//文件需要存在
cond=cond&&file[0]!='.;//排除隐藏文件
cond=cond&&config.get(“files:support”).indexOf(ext)>-1;//需要支持文件
返回条件;
}).forEach(函数(文件){
file=path.join(uu dirname,'files/')+file;
新进出口银行({
图像:文件
},函数(错误,数据){
如果(!err){
if(data.gps){
var location=parseGPS(data.gps);//获取lat和lng
geocodePromises.push(geocoder.reversegeocodesync(location.lat,location.lng));
}否则{
控制台日志(“错误:GPS数据不可用”);
}
}否则{
日志(“错误:+err”);
}
});
});
Promise.all(geocodePromises).then(函数(结果){
console.log(result);//返回一个空数组[]
//每个结果应包含文件名和地理编码位置
/*
例子:
{
“文件”:“1.jpg”,
“地点”:{
}
}
*/
});
//执行官(“killall Finder”);
});
功能解析gps(gps){
var lat=gps.GPSLatitude,
液化天然气=gps.gpsLongtude,
latRef=gps.GPSLatitudeRef | |“N”,
lngRef=gps.GPSLNGITUDEREF | | |“W”;
//将坐标转换为WGS84十进制
lat=(lat[0]+lat[1]/60+lat[2]/3600)*(latRef==“N”?1:-1);
液化天然气=(液化天然气[0]+液化天然气[1]/60+液化天然气[2]/3600)*(lngRef==“W”?-1:1);
//返回lat,液化天然气
返回{