diff --git a/README.md b/README.md index 53f0fc1..d6f9109 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,28 @@ where.is('Fenway Park', function(err, result) { }); ``` +### Search by Coordinates: + +```javascript +var where = require('node-where'); + +where.is('42.3466764,-71.0972178', function(err, result) { + if (result) { + console.log('Address: ' + result.get('address')); + console.log('Street Number: ' + result.get('streetNumber')); + console.log('Street: ' + result.get('street')); + console.log('Full Street: ' + result.get('streetAddress')); + console.log('City: ' + result.get('city')); + console.log('State / Region: ' + result.get('region')); + console.log('State / Region Code: ' + result.get('regionCode')); + console.log('Zip: ' + result.get('postalCode')); + console.log('Country: ' + result.get('country')); + console.log('Country Code: ' + result.get('countryCode')); + console.log('Lat: ' + result.get('lat')); + console.log('Lng: ' + result.get('lng')); + } +}); +``` ### Search by IP Address (both IPv4 and IPv6): diff --git a/index.js b/index.js index e6864d2..9b3eb4e 100644 --- a/index.js +++ b/index.js @@ -1,7 +1,9 @@ 'use strict'; var isIP = require('validator').isIP; +var isLatLong = require('parse-coordinates'); var Address = require('./lib/address'); +var LatLong = require('./lib/lat-long'); var IP = require('./lib/ip'); var request = require('request'); var Result = require('./lib/result'); @@ -17,6 +19,8 @@ var is = function(ipOrAddress, callback) { return callback(null, new Result()); } else if (isIP(ipOrAddress)) { locator = new IP(ipOrAddress); + } else if(isLatLong(ipOrAddress)) { + locator = new LatLong(ipOrAddress); } else { locator = new Address(ipOrAddress); } diff --git a/lib/address.js b/lib/address.js index 64cd876..2926c2d 100644 --- a/lib/address.js +++ b/lib/address.js @@ -1,7 +1,7 @@ 'use strict'; var _ = require('lodash'); -var Result = require('./result'); +var ResultBuilder = require('./result-builder'); function Address(address) { this.address = address; @@ -9,48 +9,7 @@ function Address(address) { } _.extend(Address.prototype, { - buildResult: function(body) { - body = body || {}; - - if (body && body.results) { - body = body.results[0]; - } - - var country = _resultAddressComponent(body, 'country'); - var postalCode = _resultAddressComponent(body, 'postal_code'); - var region = _resultAddressComponent(body, 'administrative_area_level_1'); - var city = _resultAddressComponent(body, 'locality'); - var neighborhood = _resultAddressComponent(body, 'neighborhood'); - var streetNumber = _resultAddressComponent(body, 'street_number'); - var street = _resultAddressComponent(body, 'route'); - var county = _resultAddressComponent(body, 'administrative_area_level_2'); - - return new Result({ - countryCode: country.short_name, - country: country.long_name, - regionCode: region.short_name, - region: region.long_name, - city: city.long_name, - postalCode: postalCode.long_name, - lat: body.geometry.location.lat, - lng: body.geometry.location.lng, - - streetNumber: streetNumber.long_name, - street: street.long_name, - neighborhood: neighborhood.long_name, - county: county.long_name - }); - }, - + buildResult: ResultBuilder._buildAddressResult, }); -function _resultAddressComponent(body, componentName) { - var components = body.address_components || {}; - - return _.find(components, function(component) { - return _.includes(component.types, componentName); - }) || {}; -} - - module.exports = Address; diff --git a/lib/ip.js b/lib/ip.js index 0e78a91..0544f39 100644 --- a/lib/ip.js +++ b/lib/ip.js @@ -1,7 +1,7 @@ 'use strict'; var _ = require('lodash'); -var Result = require('./result'); +var ResultBuilder = require('./result-builder'); function IP(ip) { this.ip = ip; @@ -9,20 +9,7 @@ function IP(ip) { } _.extend(IP.prototype, { - buildResult: function(body) { - body = body || {}; - - return new Result({ - countryCode: body.country_code, - country: body.country_name, - regionCode: body.region_code, - region: body.region_name, - city: body.city, - postalCode: body.zip_code, - lat: body.latitude, - lng: body.longitude - }); - } + buildResult: ResultBuilder._buildIpResult, }); module.exports = IP; diff --git a/lib/lat-long.js b/lib/lat-long.js new file mode 100644 index 0000000..4258a10 --- /dev/null +++ b/lib/lat-long.js @@ -0,0 +1,15 @@ +'use strict'; + +var _ = require('lodash'); +var ResultBuilder = require('./result-builder'); + +function LatLong(latLong) { + this.latLong = latLong; + this.url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' + encodeURIComponent(this.latLong); +} + +_.extend(LatLong.prototype, { + buildResult: ResultBuilder._buildAddressResult, +}); + +module.exports = LatLong; diff --git a/lib/result-builder.js b/lib/result-builder.js new file mode 100644 index 0000000..d23db7f --- /dev/null +++ b/lib/result-builder.js @@ -0,0 +1,65 @@ +'use strict'; + +var _ = require('lodash'); +var Result = require('./result'); + +function _buildIpResult(body) { + body = body || {}; + + return new Result({ + countryCode: body.country_code, + country: body.country_name, + regionCode: body.region_code, + region: body.region_name, + city: body.city, + postalCode: body.zip_code, + lat: body.latitude, + lng: body.longitude + }); + } + +function _buildAddressResult(body) { + body = body || {}; + + if (body && body.results) { + body = body.results[0]; + } + + var country = _resultAddressComponent(body, 'country'); + var postalCode = _resultAddressComponent(body, 'postal_code'); + var region = _resultAddressComponent(body, 'administrative_area_level_1'); + var city = _resultAddressComponent(body, 'locality'); + var neighborhood = _resultAddressComponent(body, 'neighborhood'); + var streetNumber = _resultAddressComponent(body, 'street_number'); + var street = _resultAddressComponent(body, 'route'); + var county = _resultAddressComponent(body, 'administrative_area_level_2'); + + return new Result({ + countryCode: country.short_name, + country: country.long_name, + regionCode: region.short_name, + region: region.long_name, + city: city.long_name, + postalCode: postalCode.long_name, + lat: body.geometry.location.lat, + lng: body.geometry.location.lng, + + streetNumber: streetNumber.long_name, + street: street.long_name, + neighborhood: neighborhood.long_name, + county: county.long_name + }); +} + +function _resultAddressComponent(body, componentName) { + var components = body.address_components || {}; + + return _.find(components, function(component) { + return _.includes(component.types, componentName); + }) || {}; +} + +module.exports = { + _buildIpResult, + _buildAddressResult +} diff --git a/package.json b/package.json index 5cc7682..0fc2c2a 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "homepage": "https://github.com/venables/node-where#readme", "dependencies": { "lodash": "^4.17.4", + "parse-coordinates": "^0.1.0", "request": "^2.81.0", "validator": "^7.0.0" }, diff --git a/test/test.js b/test/test.js index 72edc89..cb27295 100644 --- a/test/test.js +++ b/test/test.js @@ -80,4 +80,23 @@ describe('where.is', function() { done(); }); }); + + it('geolocates co-ordinates', function(done) { + var result = where.is('42.3466764,-71.0972178', function(err, result) { + expect(err).to.equal(null); + expect(result.get('address')).to.equal('24 Yawkey Way, Boston, MA, 02215, US'); + expect(result.get('streetNumber')).to.equal('24'); + expect(result.get('street')).to.equal('Yawkey Way'); + expect(result.get('streetAddress')).to.equal('24 Yawkey Way'); + expect(result.get('city')).to.equal('Boston'); + expect(result.get('region')).to.equal('Massachusetts'); + expect(result.get('regionCode')).to.equal('MA'); + expect(result.get('postalCode')).to.equal('02215'); + expect(result.get('country')).to.equal('United States'); + expect(result.get('countryCode')).to.equal('US'); + expect(result.get('lat')).to.equal(42.3466214); + expect(result.get('lng')).to.equal(-71.097143); + done(); + }); + }); });