1

所以我知道这不是共享代码的传统方式,而是看到堆栈上没有关于如何完成这样的任务的任何内容 - 我想我会分享。

为了进一步解释,我到处寻找一个易于使用的 Node.JS 模块来将地名数据处理到 mongo 数据库中。我发现的几个项目被证明是失败的。也许人们没有分享,因为它真的是一个如此简单的任务。话虽如此,我仍然认为分享我所拥有的东西可能很有价值。

以下答案将展示如何将来自http://geonames.org的地名数据处理成可用的对象,然后可以将其保存到数据库中或直接使用。

4

2 回答 2

2
var lineReader = require('line-reader');

lineReader.eachLine('./geonames-data/US/US.txt', function(line, last) {

  var city = line.split('\t').structure();

  if (city.is) { // if this is a city.

    // Delete un-needed object properties so we don't add useless info to DB.
    delete city.is;
    delete city.type;

    // Do something with the city object.
    console.log(JSON.stringify(city, true, 3) + '\n');
  }

});


Array.prototype.structure = function() {
    // from geonames readme: - P.PPL    populated place a city, town, village, or other agglomeration of buildings where people live and work
    return {
        _id: Number(this[0]),
        name: this[1],
        state: this[10],
        country: this[8],
        coordinates: [this[4], this[5]],
        timezone: this[17],
        is: ((this[6] == "P") ? true : false), // if object type is city.
        type: ((this[6] == "P") ? "city" : "other") // todo: add a parse function to parse other geonames db types
    }
}
于 2013-12-04T14:25:32.327 回答
0

进一步扩展上述答案。我已经包含了一个使用来自 Github 的 geonames Node.JS 模块的示例。(https://github.com/bugs181/geonames

免责声明:我是上述 github repo 的作者。

这个例子也可以在 Github repo 上找到。

var geonames = require('./geonames.js');

// Intialize geonames module.
geonames.init();

// 34.0500, -118.2500 - Los Angeles, California - More specifically Bunker Hill, California
// 34.057°N 118.238°W - San Francisco, California - More specifically Opera Plaza, California

geonames.city(34.0500, -118.2500, function(err, result) {
        if (err) {
                console.log("There was an error resolving coordinates.");
                console.log(err);
                return;
        }

        console.log("Result: " + JSON.stringify(result, true, 3));
});


输出:

[geonames] Resolve city from coordinates. [34.05, -118.25]
Result: {
   "city": "Bunker Hill",
   "state": "CA"
}


您也可以将字符串用于纬度和经度,但您必须将它们转换为 Mongo 数据库。使用Number()方法来做到这一点。

例如:

var lat = "34.0500";
var lon = "-118.2500";

geonames.city(Number( lat ), Number( lon ), function(err, result) {
于 2013-12-10T14:18:59.843 回答