Нахождение географического пункта в пределах диапазона другого - SQL Server - PullRequest
4 голосов
/ 05 декабря 2011

У меня есть таблица в SQL Server, в которой есть столбец типа данных географии. Я хочу запросить эту таблицу, чтобы найти строки, которые находятся вблизи (в пределах диапазона) другой заданной географической точки. У кого-нибудь есть идеи, как лучше всего это сделать? У меня есть 2 варианта, где сделать этот тип запроса. Я могу написать его на сервере sql как сохраненный процесс или я могу сделать это в коде c #, так как я использую Entity Framework для доступа к данным.

У меня будет запрос с диапазоном (например, 100 м) и географической точкой, переданной ему. Псевдокод будет примерно таким ...

выберите строки где rows.geo в пределах диапазона заданной географической точки

У меня возникли проблемы с поиском примеров географических запросов в SQL Server в Интернете.

Любая помощь будет оценена.

Ответы [ 2 ]

12 голосов
/ 20 декабря 2011

Вы уже используете SQL Server Пространственные и географические столбцы, поэтому вы можете просто использовать следующее, чтобы получить результат. Есть два способа:

Использование STDistance ():

-- Get the center point
DECLARE @g geography
SELECT @g = geo FROM yourTable WHERE PointId = something

-- Get the results, radius 100m
SELECT * FROM yourTable WHERE @g.STDistance(geo) <= 100

Использование STBuffer () и STIntersects

-- Get the center buffer, 100m radius
DECLARE @g geography
SELECT @g = geo.STBuffer(100) FROM yourTable WHERE PointId = something

-- Get the results within the buffer
SELECT * FROM yourTable WHERE @g.STIntersects(geo) = 1

Исходя из моего опыта, эффективность двух методов зависит от распределения данных и размера сетки пространственного индекса, поэтому проверьте свои собственные данные, чтобы решить, какой из них использовать. Не забудьте создать пространственный индекс в столбце гео.

2 голосов
/ 05 декабря 2011

Предполагая, что у вас есть лат и длинные значения точек в БД.

select * from yourtable where SQRT 
( POWER((yourtable.lat - reflat) * COS(reflat/180) * 40000 / 360, 2) 
+ POWER((yourtable.long - reflong) * 40000 / 360, 2)) < radiusofinterest

reflat и reflong - это точка, с которой вы хотите узнать места, близкие к. Радиус интереса - это расстояние от этой точки. 40000 это окружность земли. Вы могли бы использовать более точные цифры.

Я не проверил синтаксис с SQLServer, хотя .... поэтому там могут быть некоторые ошибки.

cos (reflat) исправляет окружность на основе широты, в которой вы находитесь. Она должна нормально работать на меньших расстояниях.

...