我认为您不应该使用此解决方案。几天前随机想到它,我认为测量与特定点的距离,网格方块的位置将基于圆形而不是统一的网格。离 0,0 越远,这就越不准确!
我所做的是在我的 PostalCode 类上有 2 个附加值。每当我更新 PostalCode 上的 Long/Lat 时,我都会计算出 Long 0, Lat 0 的 X,Y 距离。
public static class MathExtender
{
public static double GetDistanceBetweenPoints(double sourceLatitude, double sourceLongitude, double destLatitude, double destLongitude)
{
double theta = sourceLongitude - destLongitude;
double distance =
Math.Sin(DegToRad(sourceLatitude))
* Math.Sin(DegToRad(destLatitude))
+ Math.Cos(DegToRad(sourceLatitude))
* Math.Cos(DegToRad(destLatitude))
* Math.Cos(DegToRad(theta));
distance = Math.Acos(distance);
distance = RadToDeg(distance);
distance = distance * 60 * 1.1515;
return (distance);
}
public static double DegToRad(double degrees)
{
return (degrees * Math.PI / 180.0);
}
public static double RadToDeg(double radians)
{
return (radians / Math.PI * 180.0);
}
}
然后我像这样更新我的课程:
private void CalculateGridReference()
{
GridReferenceX = MathExtender.GetDistanceBetweenPoints(0, 0, 0, Longitude);
GridReferenceY = MathExtender.GetDistanceBetweenPoints(0, 0, Latitude, 0);
}
所以现在对于我的数据库中的每一行,我有一个距网格参考 0,0 的 x,y 网格距离(以英里为单位)。如果我想找到长/纬度为 5 英里的所有地方,我首先会获得 X、Y 网格参考(比如 25,75),然后我会在数据库中搜索 20..30、70..80,然后进一步使用过滤内存中的结果
MathExtensder.GetDistanceBetweenPoints(candidate.Lat, candidate.Long, search.Lat, search.Long) < TheRadiusOfInterest
数据库中的部分超快,而内存中的部分在较小的集合上工作以使其超准确。