2015-02-19 6 views
1

Заранее благодарим за понимание. Я новичок в использовании пространственных функций в SQL Server. Я был бы признателен, если бы кто-то мог указать мне на правильный правильный подход к решению проблемы, которую я имею.Пространственные данные SQL Server

Я работаю с клиентом, который контролирует газовые скважины, которые доступны с водных путей. В определенный день лодка перемещается из точки А в точку В вдоль реки. У меня есть этот «маршрут» как серия значений Lat/Long, которые могут быть нанесены на карту. Я думаю, что это будет использоваться как LineString в SQL Server.

У меня также есть список известных скважин, а также их позиции Lat/Long. Я хотел бы сохранить эти записи в базе данных и индексировать Lat/Long с пространственным индексом некоторого вида. Я не уверен на 100%, как правильно индексировать таблицу, но она будет содержать столбцы Lat/Long/WellName/Owner и т. Д.

Функция должна выполнять следующие действия: учитывая Lat/Long маршрута лодка принимает в данный день (LineString и все его точки), найдите все колодцы, которые находятся в пределах 2000 футов от этой линии. Рабочие выйдут из лодки и отправятся в колодец, чтобы выполнить техническое обслуживание. Каждый день они будут работать на другом участке реки.

Опять же, я ищу рекомендации по тому, что должно быть таблицей Wells (tblWells), а также создать хранимую процедуру, которая принимает Lat/Long из точек линии в качестве входного параметра nvarchar (MAX). На данный момент ему нужно вернуть все скважины, расположенные в пределах 2000 футов от любой точки линии.

Искренняя благодарность всем, кто уделяет время, чтобы помочь.

сердечным приветом ...

ответ

2

Во-первых, вам понадобится таблица скважин:

create table dbo.Wells (
    WellId int identity not null, 
    Name varchar(50) not null, 
    Owner varchar(50) not null, 
    Location geography not null 
) 

, а затем процедуру для поиска скважин в пределах определенного расстояния от заданной траектории:

create procedure dbo.FindWells 
( 
    @Path geography, 
    @Distance float 
) as 
begin 

    declare @buffer geography = @Path.STBuffer(@Distance); 

    select WellId 
    from dbo.Wells 
    where @buffer.STContains(Location); 
) 

Если вы действительно хотите пройти свой путь в качестве варчара, пойдите для него; просто превратите его в экземпляр географии с geography::STLineFromText или что-то в этом роде.

Что касается индексации на таблице, создайте пространственный индекс в столбце «Расположение». Играйте с разрешением, но я предполагаю, что с учетом вашего прецедента первые три разрешения будут низкими, а последний будет высоким. Поиграйте с ним.

+0

Извините, но это не позволило мне полностью ответить комментарием. Мне пришлось добавить ответ, чтобы добавить следующий вопрос. Это удар; Спасибо. – DanielG

Смежные вопросы