Я бы предложил (если возможно) получить центральную точку почтового индекса, а затем применить формулу Хаверсайна, чтобы найти все магазины в пределах определенного радиуса.
Формула здесь указана в километрах.
Вам нужно изменить соответствующие цифры, и она будет работать за мили.
Например: конвертировать 6371,392896 в мили.
ОБЪЯВИТЬ @radiusInKm AS FLOAT
ОБЪЯВИТЬ @ lat2Сравнить как плавать
ОБЪЯВИТЬ @ long2Сравнить как плавать
SET @radiusInKm = 5.000
SET @ lat2Compare = insert_your_lat_to_compare_here
SET @ long2Compare = insert_you_long_to_compare_here
SELECT * FROM insert_your_table_here WITH (NOLOCK)
WHERE (6371.392896 * 2 * ATN2 (SQRT ((sin ((радианы (GeoLatitude - @ lat2Compare)) / 2) * sin ((радианы (GeoLatitude - @ lat2Compare)) / 2)) + (cos (радианы (GeoLatitude)) * cos (радианы (@ lat2Compare)) * sin (радианы (GeoLongitude - @ long2Compare) / 2) * sin (радианы (GeoLongitude - @ long2Compare) / 2)))
, SQRT (1 - ((sin ((радианы (GeoLatitude - @ lat2Compare)) / 2) * sin ((радианы (GeoLatitude - @ lat2Compare)) / 2)) + (cos (радианы (GeoLatitude)) * cos (радианы (@ lat2Compare)) * sin (радианы (GeoLongitude - @ long2Compare) / 2) * sin (радианы (GeoLongitude - @ long2Compare) / 2)))
))) <= @ radiusInKm </p>
если вы хотите выполнить формулу Haversine в C #,
double resultDistance = 0.0;
double avgRadiusOfEarth = 6371,392896; // Радиусы Земли отличаются, я беру среднее.
// Формула Haversine
// расстояние = R * 2 * aTan2 (квадратный корень из A, квадратный корень из 1 - A)
// где A = синус в квадрате (разница в широте / 2) + (косинус широты 1 * косинус в широте 2 * синус в квадрате (разница в долготе / 2))
// и R = окружность земли
double разностьInLat = DegreeToRadian (currentLatitude - latitudeToCompare);
double разностьInLong = DegreeToRadian (currentLongitude - longtitudeToCompare);
удваивается
double aFormula = (Math.Sin ((diffInLat) / 2) * Math.Sin ((diffInLat) / 2)) + (aInnerFormula);
resultDistance = avgRadiusOfEarth * 2 * Math.Atan2 (Math.Sqrt (aFormula), Math.Sqrt (1 - aFormula));
DegreesToRadian - это функция, которую я создал.
Это простой 1 вкладыш "Math.PI * angle / 180.0"
Для LINQ вы можете использовать математические функции C #, а также все проверки C #. Например:! = Равно не равно и т. Д.
В качестве примера смотрите следующее.
Он не полный, поэтому, пожалуйста, настройте его по своему вкусу.
var linqQuery = из linqCollection в
insert_your_collection_here
где s_lat! = ничего
выберите Math.ACos (Math.Sin (DegreesToRadian (sentlng))
* Math.Pi / 180))
Посмотрите ссылку MSDN ниже для всех простых примеров LINQ. Поиграйте с этим, надеюсь, это поможет
Моя запись в блоге - SQL Haversine
MSDN - 101 образец LINQ