Так что у этого вопроса есть несколько частей, но, надеюсь, у кого-то будет достаточно знаний, чтобы помочь.
В моей базе данных SQL Server есть 2 записи местоположения со следующими значениями свойств широта (nLatitude), долгота (nlongtitue) и география (gGeoLocation) в этом порядке.
Запись 1: 39,283638, -76,568567, 0xE6100000010C91F3FE3F4EA443406EA5D766632453C0
Запись 2: 39,285200, -76,554366, 0xE6100000010CDC68006F81A44340EB0088BB7A2353C0
Я создал значения Geography с помощью SQL-запроса ниже:
ОБНОВЛЕНИЕ [Местоположение] SET gGeoLocation = география :: STPointFromText ('POINT (' + CAST (nlongtitue AS VARCHAR (20)) + '' + CAST ([nLatitude] AS VARCHAR (20)) + ')', 4326 )
Теперь допустим, что я хочу выполнить поиск в своей таблице местоположений, чтобы определить, какие из этих местоположений находятся в определенном радиусе определенной широты / долготы (39.290555, -76.609604) Я использовал следующий запрос:
ВЫБРАТЬ * ОТ [Местоположение]
ГДЕ gGeoLocation.STDistance (geography :: Point (@Latitude, @Longitude, 4326)) <((@Miles * 1000) * 0.621371192) </p>
Затем я сравнивал свои результаты с функцией C #, и два результата не совпадают, поэтому один из них должен быть неправильным, или я что-то упускаю. Вот функция C #:
//calculate haversine distance for linear distance - Miles
public static double haversine_mi(double lat1, double long1, double lat2, double long2)
{
double dlong = (long2 - long1) * d2r;
double dlat = (lat2 - lat1) * d2r;
double a = Math.Pow(Math.Sin(dlat / 2.0), 2) + Math.Cos(lat1 * d2r) * Math.Cos(lat2 * d2r) * Math.Pow(Math.Sin(dlong / 2.0), 2);
double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
double d = 3956 * c;
return d;
}
В конечном итоге, если бы кто-то мог предоставить мне SQL-запрос, который будет искать таблицу местоположений в пределах определенного радиуса, а также возвращать расстояние между местоположением и точкой поиска в милях и в километрах, что было бы здорово.
Но я также хотел бы понять, почему я получаю разные результаты в том, что должно возвращать то же самое. Я довольно новичок в гео-пространственных данных.