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秒。