Точка на окружности (долгота / широта) в .NET / SQL - PullRequest
1 голос
/ 15 февраля 2010

У меня следующая проблема: У меня есть таблица со значениями long / lat и другая таблица с идентификатором проекта и long / lat / radius (circle).

Теперь мне нужно выяснить, какой проект соответствует значениям long / lat из первой таблицы.

Есть ли простой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2010

Есть несколько алгоритмов для вычисления расстояния на сфере, но мы используем следующее:

create function GetDistance(
    @latitudeFrom decimal(30,10), 
    @longitudeFrom decimal(30,10),
    @latitudeTo decimal(30,10), 
    @longitudeTo decimal(30,10)
)
RETURNS float
AS
BEGIN

DECLARE @distance float

    SET @distance = ROUND(6378.137 * ACOS(
            convert(decimal(30,10), 
            (SIN(RADIANS(@latitudeFrom)) * SIN(RADIANS(@latitudeTo))) +
            (COS(RADIANS(@latitudeFrom)) * COS(RADIANS(@latitudeTo)) *
             COS(RADIANS(@longitudeTo) - RADIANS(@longitudeFrom))))), 15)

 RETURN @distance
 END
 go

(где 6378.137 - радиус Земли)

Так что теперь, когда вы можете рассчитать расстояние между двумя точками на Земле, вы можете построить запрос

 select * 
     from Table1, Project 
     where dbo.GetDistance(
           Table1.lat, Table1.lon, 
           Project.lat, Project.lon) < @YouRadius

где @YouRadius - параметризованный радиус вашего круга

0 голосов
/ 15 февраля 2010

Относительно просто: вычислите расстояние большого круга между точкой и центром круга. Если расстояние меньше радиуса, точка находится в круге, если нет. Если это на окружности круга, вы решаете. Было несколько обсуждений SO по вычислению расстояний большого круга, взгляните на них.

Чтобы ускорить процесс, вы можете подумать о сохранении, с определением каждого круга, его минимальной ограничительной рамки в широтах / длинных «квадратах». Это предоставит вам информацию, необходимую для быстрой проверки того, находится ли точка внутри круга, вычисляя только расстояния, когда точка находится внутри mbb.

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