arneheggestad/getcoordinates

View on GitHub
lib/here.js

Summary

Maintainability
A
0 mins
Test Coverage
var utilities = require('./utilities.js'),
        xml2js = require('xml2js')
        ;

var reqOptions = {
    hostname: 'geocoder.cit.api.here.com',
    port: 80,
    path: '',
    method: 'GET'
};

var here = {
    geocode: function (address, options, callback) {
        var coords = {};
        address = address.replace(/\s/g, '+');
        if (!options.here.auth || !options.here.auth.app_id || !options.here.auth.app_code) {
            return callback('no credentials', null);
        }
        reqOptions.path = '/6.2/geocode.xml?app_id=' + options.here.auth.app_id
                                        + '&app_code=' + options.here.auth.app_code + '&gen=8&searchtext=' + address;
        utilities.queryAPI(reqOptions, function (err, response) {
            if (err) { return callback(err); }
            here.parseResponse(response, function (err, pointsArray) {
                if (err) { return callback (err); }
                switch (pointsArray.length) {
                    case 0:
                        return callback('no results');
                    case 1:
                        coords.lat = pointsArray[0].lat;
                        coords.lon = pointsArray[0].lon;
                        return callback(null, coords);
                    default:
                        return callback('multiple results');
                }
            });
        });
    },

    parseResponse: function (response, callback) {
        var parser = new xml2js.Parser( {
            attrNameProcessors: [ stripPrefix ],
            tagNameProcessors: [ stripPrefix ]
        });

        parser.parseString(response, function (err, parsedResponse) {
            if (!parsedResponse) {
                return callback('API error');
            } else if (!parsedResponse.Search.Response[0].View) {
                return callback('no results');
            } else {
                var pointsArray = [];
                var results = parsedResponse.Search.Response[0].View[0].Result;
                for (var i = 0; i < results.length; i++) {
                    var temp = {};
                    temp.lat = parseFloat(results[i].Location[0].DisplayPosition[0].Latitude[0]);
                    temp.lon = parseFloat(results[i].Location[0].DisplayPosition[0].Longitude[0]);
                    pointsArray.push(temp);
                }
                callback(null, pointsArray);
            }
        });
    }
};

var stripPrefix = function (str) {
    var prefixMatch;
  prefixMatch = new RegExp(/(?!xmlns)^.*:/);
    return str.replace(prefixMatch, '');
}

module.exports = here;