Я не думаю, что вы должны использовать это решение. Случайно подумав об этом несколько дней назад, я думаю, что при измерении расстояния от конкретной точки местоположения квадратов сетки будут основываться на кругах, а не на сетке в форме. Чем дальше от 0,0, тем менее точно это будет!
Что я сделал, так это чтобы у меня было 2 дополнительных значения в моем классе PostalCode. Всякий раз, когда я обновляю Long / Lat на PostalCode, я вычисляю расстояние X, Y от Long 0, Lat 0.
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);
}
Так что теперь у меня есть расстояние по сетке x, y (в милях) от ссылки на сетку 0,0 для каждой строки в моей БД. Если я хочу найти все места с длиной 5 миль в длину / широту, я сначала получу ссылку на сетку X, Y (скажем, 25,75), затем я буду искать в базе данных 20..30, 70..80 и далее отфильтровать результаты в памяти, используя
MathExtensder.GetDistanceBetweenPoints(candidate.Lat, candidate.Long, search.Lat, search.Long) < TheRadiusOfInterest
Часть in DB очень быстрая, а часть in-memory работает на меньшем наборе, чтобы сделать ее сверхточной.