私はあなたがこの解決策を使うべきではないと思います。数日前にランダムに考えたのですが、特定の点からの距離の測定は、均一なグリッドではなく、円に基づいて行われると思います。0,0から離れるほど、精度は低くなります。
私がしたことは、PostalCodeクラスに2つの追加の値を設定することでした。郵便番号の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);
}
これで、DBの各行のグリッド参照0,0からのx、yグリッド距離(マイル単位)が得られました。長さ/緯度が5マイルのすべての場所を検索する場合は、最初にX、Yグリッド参照(たとえば25,75)を取得し、次にDBで20..30、70..80を検索します。を使用してメモリ内の結果をフィルタリングします
MathExtensder.GetDistanceBetweenPoints(candidate.Lat, candidate.Long, search.Lat, search.Long) < TheRadiusOfInterest
インDB部分は超高速であり、インメモリ部分はより小さなセットで動作して超正確になります。