module_geo v1.11.0
geo information services module. letzchange foundation.
Database:
import data
sudo mongoimport --collection countries --file ./data/countries.json
sudo mongoimport --collection pcode --file ./data/geoInfos.json
countries
country: String,
country_name: String,
currency_code: String,
currency_symbol: String,
address: [String],
states: [String]
pcode
country: String,
pcode: String
maxmind DB GeoLite2 Country http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
location: ./data/GeoLite2-Country.mmdb
Results Format:
pincode data:
{ success: true,
data:
{ admin_level_1: 'West Bengal',
admin_level_2: 'Bardhaman',
country: 'IN',
pcode: '713148' } }
ip and country data:
{ success: true,
data:
{ country: 'DE',
country_name: 'Germany',
currency_code: 'EUR',
exchange_rate: 0.014500824653516325,
currency_symbol: '€',
states:
[ 'Brandenburg',
'Berlin',
'Baden-Württemberg',
'Saarland',
'Sachsen',
'Sachsen-Anhalt',
'Thüringen' ] } }
country list data:
{ success: true,
data:
[ { country: 'SG', country_name: 'Singapore' },
{ country: 'HK', country_name: 'Hong Kong' },
{ country: 'GR', country_name: 'Greece' },
{ country: 'KZ', country_name: 'Kazakhstan' }] }
no_data
{ success: false,
data: null }
pincode db
in example collection name is geoInfos. more appropriate name - pcodes. module doesn't care. since you are providing the collection object.
download and extract from http://download.geonames.org/export/zip/allCountries.zip
import from allCountries.zip file.
mongoimport --db letzchange --collection geoInfos --type tsv --fields country,pcode,area,admin_level_1,admin_code_1,admin_level_2,admin_code_2 --file ./allCountries.txt
unset unnecessary fields.
db.geoInfos.update(
{ },
{ $unset: { area:"", admin_code_1: "", admin_code_2: "", field7: "", field8: "",field9: "",field10: "",field11: "", } },
{ multi: true }
)
normalize data. at this point some pincodes are string and others are numbers.
db.geoInfos.find({pcode : {$exists : true}}).forEach( function(obj) { obj.pcode = ""+obj.pcode; db.geoInfos.save(obj); } );
now all pincodes are string.
then create index on the pcode and country fields with unique and drop_duplicates set to true. this removes duplicate data. brings down count from 10 lakhs to 6 lakhs.
country db
import from data/countries.json
usage
check out test.js
exposed functions
find_by_ip (country_collection, maxmindDB, _ip, _cb)
country_list (country_collection, _cb)
find_by_country (country_collection, _country, _cb)
pincode_find (pcode_collection, _country, _pcode, _cb)
update_exchange_rates (oxr_app_id, _cb)
test.js
var MongoClient = require('mongodb').MongoClient;
var x = require("./module_geo");
var url = "mongodb://cloud9:cloud9@kahana.mongohq.com:10099/doba";
var oxr_app_id = "7b422add4315455088117851ff9157c4";
var db, country, pcode;
var maxminddb = require('maxmind-db-reader').openSync( require("path").join(__dirname + '/data/GeoLite2-Country.mmdb'));
MongoClient.connect(url, function(err, _db) {
if(err) return console.log(err);
db = _db;
country = db.collection('countries');
pcode = db.collection('pcode');
//update exchange rates at least once on startup.
x.update_exchange_rates(oxr_app_id, function() {
if(!err){
run_test();
//setInterval(run_test, 5*1000);
}
});
});
function run_test() {
console.log("..");
x.country_list(country, custom_cb);
x.find_by_country(country, "GR", custom_cb);
x.find_by_ip(country, maxminddb, "5.5.5.5",custom_cb);
x.pincode_find(pcode, "IN","713148",custom_cb);
x.update_exchange_rates(oxr_app_id, null);
}
function custom_cb(err,result) {
console.log(err, result);
}
data from http://www.geonames.org and GeoLite2 data created by MaxMind, available from http://www.maxmind.com
rahul.roy@letzchange.org
install
npm install --save module_geo
return:
all callbacks are invoked with params (err, result)
err
is set if there is application level error.result.success
is false if there is data level error.
module is malfunctioning if err !== null
.
else the result can be piped to client.
example usage
var geo = require("module_geo");
geo.init("mongodb://cloud9:cloud9@kahana.mongohq.com:10099/doba", "7b422add4315455088117851ff9157c4");
geo.country_list(console.log);
geo.find_by_ip("5.5.5.5",console.log);
geo.find_by_country("IN",console.log);
geo.pincode_find("IN","713148",console.log);
geo.update_exchange_rates();
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago