C# 根据lat/long c获取国家名称和代码#

C# 根据lat/long c获取国家名称和代码#,c#,geolocation,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.n

到目前为止,我找到的最好的解决办法是

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

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

如果您在网站上阅读自述文件,它会告诉您ReverseLookup对象创建的成本很高。所以他们想让你创建一次,然后重新使用它

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


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

如果您阅读网站上的自述文件,它会告诉您反向查阅对象创建的成本很高。所以他们想让你创建一次,然后重新使用它

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


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

如果您阅读了库的源代码,它会加载一个区域列表

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

您应该一次构造
ReverseLookup
项,或者在
单例中实现它。

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;
    }
}
并以此方式使用:

RegionLocator.Instance.Lookup(float.Parse(scandata.gpslat), float.Parse(scandata.gpslong));

如果您阅读了库的源代码,它将加载一个区域列表

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

您应该一次构造
ReverseLookup
项,或者在
单例中实现它。

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;
    }
}
并以此方式使用:

RegionLocator.Instance.Lookup(float.Parse(scandata.gpslat), float.Parse(scandata.gpslong));

什么是
反向查阅
?这是从哪里来的?你是在为你想要查找的每一条记录创建一个新的ReverseLookup实例吗?@TheAnathema使用谷歌地理编码API怎么样,比如说?@ChrisS他正在尝试查找数百万条记录。进行web查找会非常慢。什么是
反向查找
?这是从哪里来的?你是在为你想要查找的每一条记录创建一个新的ReverseLookup实例吗?@TheAnathema使用谷歌地理编码API怎么样,比如说?@ChrisS他正在尝试查找数百万条记录。进行web查找将非常缓慢。@D4Developer可以看看Anathema的解决方案。他创建了一个非常好的单例示例,让开发人员看看Anathema的解决方案。他创造了一个很好的单身例子。太好了:)你让我开心了。。每次初始化它都是愚蠢的:(@D4Developer,是的,使用Singleton处理5000组lat/LON需要1.3秒,每次初始化后处理50组需要23秒。太好了:)你让我开心了。。每次初始化都是愚蠢的:(@D4Developer,是的,使用Singleton处理5000组lat/LON需要1.3秒,每次初始化后处理50组需要23秒。