获取基于lat / long c#的国家/地区名称和代码

时间:2016-03-09 17:10:50

标签: c# geolocation

我到目前为止找到的最佳解决方案是,

using Two10.CountryLookup;

var lookup = new ReverseLookup();
try
{   // get country details based on lat/long
    var country = lookup.Lookup(float.Parse(scandata.gpslat), float.Parse(scandata.gpslong));
  string cName = country.name;
   string cCode = country.code;
}
catch(Exception e)
{
    Console.WriteLine("Exception :"+e);
} 

但是这个对象太重了,我有数百万条记录要经过。这个对象使我的脚本变慢。还有其他更快的方法吗?

2 个答案:

答案 0 :(得分:1)

如果您在网站上阅读自述文件,它会告诉您ReverseLookup对象的创建很昂贵。因此他们希望您创建一次然后重复使用它。

https://github.com/vansha/Two10.CountryLookup/blob/master/readme.md

它很昂贵,因为它加载并解析构造函数中的整个7.1MB区域列表。

我刚刚进行了一些测试。每次查询20个位置并创建ReverseLookup对象需要10秒钟。创建一次并重复使用20次需要0.6秒。重复使用2000次需要2秒钟。

答案 1 :(得分:1)

如果您阅读了库的源代码,则会加载区域列表。

var ar = [{_id : "1", S : "2"},{_id : "1", M : "4"},
  {_id : "2", M : "1"},{_id : "" , M : "1"},{_id : "3", S : "3"}]

_(ar).groupBy('_id').thru(function(o){
  return _.keys(o).reduce(function(arr, key) {
    var r = {
      _id: key,
      S: parseInt((_.find(o[key], function(i){ return i["S"]}) || {S:0}).S, 10),
      M: parseInt((_.find(o[key], function(i){ return i["M"]}) || {M:0}).M, 10)
    };
    arr.push(_.merge(r, {Total: r.S+r.M}));
    return arr;
  }, [])
}).value();

即使this.Regions = ParseInput(LoadFile()).ToArray(); ParseInput()延迟执行它们,它立即将LoadFile()强制转换为一个数组,该数组执行它并强制对每个构造函数进行求值。这是一项昂贵的操作,所以应该设置一次。

您应该构建一次IEnumerable<Region>项,或者在ReverseLookup

中实现它
Singleton.

并按原样使用:

public class RegionLocator
{
    private static RegionLocator instance;
    private static ReverseLookup ReverseLookup;

    private RegionLocator() { }

    public static RegionLocator Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new RegionLocator();
                ReverseLookup = new ReverseLookup();
            }
            return instance;
        }
    }

    public Region Lookup(float lat, float lng, RegionType[] types)
    {
        return ReverseLookup.Lookup(lat, lng, types);
    }

    public Region[] Regions()
    {
        return ReverseLookup.Regions;
    }
}