Поиск точки географии в пределах другого диапазона - SQL Server

100
10

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


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


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


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


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

спросил(а) 2021-01-25T16:51:31+03:00 6 месяцев назад
1
Решение
141

Вы уже используете столбцы пространственных и географических столбцов 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


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

ответил(а) 2021-01-25T16:51:31+03:00 6 месяцев назад
63

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


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

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


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

ответил(а) 2021-01-25T16:51:31+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема