Гео-пространственные данные SQL Server & C # - одна из них НЕПРАВИЛЬНА! - PullRequest
0 голосов
/ 15 мая 2011

Так что у этого вопроса есть несколько частей, но, надеюсь, у кого-то будет достаточно знаний, чтобы помочь.

В моей базе данных 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-запрос, который будет искать таблицу местоположений в пределах определенного радиуса, а также возвращать расстояние между местоположением и точкой поиска в милях и в километрах, что было бы здорово.

Но я также хотел бы понять, почему я получаю разные результаты в том, что должно возвращать то же самое. Я довольно новичок в гео-пространственных данных.

1 Ответ

0 голосов
/ 25 мая 2011

Вы используете GEOGRAPHY, который является вычислениями на поверхности сферы.Вы можете использовать ГЕОМЕТРИЮ, которая является вычислениями на плоскости.Это имеет значение.Также проверьте ваши SRID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...