Вопрос

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

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

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

Это было полезно?

Решение

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

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 - радиус Земли)

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top