1.11.0 • Published 9 years ago

module_geo v1.11.0

Weekly downloads
92
License
none
Repository
github
Last release
9 years ago

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();






  
1.11.0

9 years ago

1.10.0

9 years ago

1.9.1

9 years ago

1.8.0

9 years ago

1.6.0

9 years ago

1.5.2

9 years ago

1.5.1

9 years ago

1.4.1

9 years ago

1.4.0

9 years ago

1.3.0

9 years ago

1.2.5

9 years ago

1.2.4

9 years ago

1.2.3

9 years ago

1.2.1

9 years ago

1.2.0

9 years ago

1.1.1

9 years ago

1.1.0

9 years ago

1.0.4

9 years ago

1.0.3

9 years ago

1.0.2

9 years ago

1.0.1

9 years ago

1.0.0

9 years ago