Формула большого круга: T-SQL - PullRequest
9 голосов
/ 29 апреля 2011

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

Итак, пример моей таблицы:

- messageId
- lat (float)
- long (float)

Proc проходит в другой паре широта / лонг (обе float с), а также int (миль)

Я нашел это http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=81360 для вычисления фактической формулы, но я не могу понять, как изменить ее в форме процедуры, чтобы можно было просмотреть весь список адресов и дать мне только Id ' s адресов, которые <= миль (которые я прохожу), от широты / долготы, которые я прохожу. </p>

Можно мне здесь помочь?

Спасибо!

Ответы [ 3 ]

6 голосов
/ 29 апреля 2011

SQL Server 2008

Использование пространственной функции STDistance расстояние возврата в метрах

geography :: Point (@ lat1, @ lon1, 4326) .STDistance (geography :: Point (@ lat2, @ lon2, 4326))

2 голосов
/ 29 апреля 2011

Я действительно написал короткое сообщение в блоге некоторое время назад именно для этой цели.По сути, мой запрос:

SELECT
  Name,
  Address,
  City,
  State,
  Latitude,
  Longitude,
  (
    ACOS(
      COS(@center_latitude * (PI()/180)) *
      COS(@center_longitude * (PI()/180)) *
      COS(Latitude * (PI()/180)) *
      COS(Longitude * (PI()/180)) +
      COS(@center_latitude * (PI()/180)) *
      SIN(@center_longitude * (PI()/180)) *
      COS(Latitude * (PI()/180)) *
      SIN(Longitude * (PI()/180)) +
      SIN(@center_latitude * (PI()/180)) *
      SIN(Latitude * (PI()/180))
    ) *
    (
      (@equatorial_radius * @polar_radius) /
      (
        SQRT(
          (@equatorial_radius * @equatorial_radius) -
          (
            (
              (@equatorial_radius * @equatorial_radius) -
              (@polar_radius * @polar_radius)
            ) *
            (
              COS(@center_latitude) *
              COS(@center_latitude)
            )
          )
        )
      )
    )
  ) AS Miles
FROM
  Places
WHERE
  Miles <= @search_radius

Дайте ему центральную широту, центральную долготу и радиус поиска, и вы должны быть хорошими.(Параметры для экваториального и полярного радиусов Земли, естественно, могут быть жестко запрограммированы.)

Вся эта математика должна учитывать кривизну Земли, выпуклость на экваторе и т. Д.

0 голосов
/ 29 апреля 2011

Вы можете просто использовать функцию непосредственно в SP ... Я думал:


CREATE PROCEDURE [FindPlaces](@lat float, @long float, @min_dist float) 
AS 

select messageId from yourtable
where dbo.F_GREAT_CIRCLE_DISTANCE(@lat, @long, lat, long) 
...