이 솔루션을 사용하지 않아도됩니다. 며칠 전에 무작위로 그것에 대해 생각한 결과, 특정 지점에서 격자 사각형의 위치까지의 거리를 측정하는 것이 획일 화 된 격자가 아닌 원형을 기반으로한다고 생각합니다. 0,0에서 멀어 질수록 덜 정확합니다.
내가 한 것은 내 PostalCode 클래스에 2 개의 추가 값을 가졌기 때문입니다. 때마다 나는 그런 내가 지금처럼 내 클래스를 업데이트, 내가 X, 긴 0에서 Y 거리를 계산을 PostalCode에
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);
}
}
위도 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 파트는 매우 빠르며 메모리 파트는 더 작은 세트에서 작동하여 매우 정확합니다.
플랫폼에서 더 많은 정보를 제공하면 도움이 될 것입니다. – alphadogg
[이것은 실제 답변이 짧습니다.] kd 트리를 사용하고 싶다면 다음을 번역해야합니다. 데카르트 거리 쿼리를 위도와 경도 범위로 매핑합니다 (또는 위도/경도 평면 분리가 쿼리와 교차하는지 확인하기 위해 수학 만 수행). – MSN