Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
iap
sigor_i
пропущено...


интересный взгляд.......сложноват для меня.....но очень интересно увидеть все это как есть?в реале с учетом кривизны и т.д......вот только как это все будет выглядеть для 2005 sql.......неужели писать кучу математических расчетов...не хочется видеть огромный кодиЩЕ........
Наберите в Google: "прямая и обратная геодезическая задача"



http://edu.dvgups.ru/METDOC/ITS/GEOD/LEK/l2/L3.htm нашел будем пыхтеть
а еще будут предложения?
10 окт 12, 07:22    [13293553]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
sigor_i
iap
пропущено...
Наберите в Google: "прямая и обратная геодезическая задача"



http://edu.dvgups.ru/METDOC/ITS/GEOD/LEK/l2/L3.htm нашел будем пыхтеть
а еще будут предложения?
Может, функция CLR поможет?
Наверняка же есть такие библиотеки. На C# каком-нибудь
10 окт 12, 09:03    [13293708]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
CREATE FUNCTION dbo.GetDis(@x1 float, @y1 float, @x2 float, @y2 float)
RETURNS float
AS
BEGIN
DECLARE @Result float,
        @rad int;
set @Result = 0.0;
set @rad = 6372795;
set @Result = 2*asin(sqrt(square(sin((radians(@y2)-radians(@y1))/2))+
    cos(radians(@y1))*cos(radians(@y2))*square(sin((radians(@x2)-radians(@x1))/2))))
    
RETURN (@Result*@rad)
END


ну вот функцию написал
а как найти та первую ближнюю точку?
и как вообще все это завязать?
желательно во временной
10 окт 12, 09:07    [13293717]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
sigor_i
sigor_i
[color=red]declade @t  (id int SpatialLocation geography )

insert into @t
     ([id],
      [SpatialLocation])

values
       ('POINT(-123.626 47.8315,
                   -122.626 47.8315
                    -121.626 47.8315)')
[/color]


DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(3)SpatialLocation.ToString() as Blijnie_to4ki, City,SpatialLocation.STDistance(@g)/1000 as Rasstoanie FROM Person.Address
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);

осталось во временную таблицу перегнать


вопрос работает ли все это в 2005 версии?


хотел бы не с таблицы брать а все с кода..т.е. с временной таблицы..отсюда же....не работает...в чем ошибаюсь?
10 окт 12, 10:22    [13294044]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
????? нет вариантов????люди??????
10 окт 12, 13:40    [13295675]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Вам скорее сюда.
10 окт 12, 16:27    [13297339]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
sigor_i,

автор
Разности ΔX и ΔY координат точек последующей и предыдущей называются приращениями координат. Они представляют собой проекции отрезка АВ на соответствующие оси координат. Их значения находим из прямоугольного прямоугольника АВС:

ΔX = SAB · cos αAB ;

ΔY = SAB · sin αAB .


я так понимаю вам надо искать по минимальному приращению..по другому я думаю никак не получится
ЗЫ прямо с вашей ссылки
10 окт 12, 22:43    [13299366]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
http://geographiclib.sourceforge.net/
10 окт 12, 23:27    [13299545]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
sigor_i
sigor_i
пропущено...


вопрос работает ли все это в 2005 версии?


хотел бы не с таблицы брать а все с кода..т.е. с временной таблицы..отсюда же....не работает...в чем ошибаюсь?


я хотел бы все это считывать во временки но как обьявлять правильно пока проблем
11 окт 12, 08:26    [13300207]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
declare @t  as table  (Name  nvarchar(40), SpatialLocation  geography)

INSERT INTO @t
           ([Name]
           ,[SpatialLocation])
     VALUES
           ('Test'
           ,'POINT ((123.626 47.8315,
                     122.626 46.8315,
                     121.626 45.8315))')


DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(3)SpatialLocation.ToString() as Blijnie_to4ki, SpatialLocation.STDistance(@g)/1000 as Rasstoanie FROM @t
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);


error
автор
Сообщение 6522, уровень 16, состояние 1, строка 3
Произошла ошибка .NET Framework во время выполнения определяемой пользователем подпрограммы или агрегатной функции "geography":
System.FormatException: 24141: в позиции 15 на входе ожидалось числовое значение, однако было обнаружено значение (123.626.
System.FormatException:
в Microsoft.SqlServer.Types.OpenGisWktReader.RecognizeDouble()
в Microsoft.SqlServer.Types.OpenGisWktReader.ParsePointText(Boolean parseParentheses)
в Microsoft.SqlServer.Types.OpenGisWktReader.ParseTaggedText(OpenGisType type)
в Microsoft.SqlServer.Types.OpenGisWktReader.Read(OpenGisType type, Int32 srid)
в Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)
в Microsoft.SqlServer.Types.SqlGeography.STGeomFromText(SqlChars geometryTaggedText, Int32 srid)
в Microsoft.SqlServer.Types.SqlGeography.Parse(SqlString s)
.
Выполнение данной инструкции было прервано.

(строк обработано: 0)
11 окт 12, 08:42    [13300240]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
Glory
Member

Откуда:
Сообщений: 104760
POINT ((123.626 47.8315,
122.626 46.8315,
121.626 45.8315))

И зачем придумывать синтаксис POINT самому ? вместо того, чтобы взять его из хелпа ?
11 окт 12, 09:21    [13300372]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
Glory
POINT ((123.626 47.8315,
122.626 46.8315,
121.626 45.8315))

И зачем придумывать синтаксис POINT самому ? вместо того, чтобы взять его из хелпа ?



спасибо все сделал теперь вот вопрос
имеются 2 столбца...
а выше я использовал один столбец
как взять широту + долготу?
имеется таблица см.ниже
dbLon dbLat
106,620165 10,746475
153,095160 -27,377213
0,000000 0,000000
22,952630 40,599135
114,079980 22,547512
114,080272 22,547073
114,037833 22,543650
-115,405117 32,622633
114,079867 22,548733
106,536433 21,013733
100,572567 13,728350
400,039067 3,539083

К сообщению приложен файл. Размер - 47Kb
11 окт 12, 12:21    [13301527]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
Glory
Member

Откуда:
Сообщений: 104760
sigor_i
имеются 2 столбца...
а выше я использовал один столбец
как взять широту + долготу?

Куда взять ?
11 окт 12, 12:29    [13301587]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
Glory
sigor_i
имеются 2 столбца...
а выше я использовал один столбец
как взять широту + долготу?

Куда взять ?


declare @t  as table  (Name  nvarchar(40), SpatialLocation  geography)

INSERT INTO @t
           ([Name]
           ,[SpatialLocation])
     VALUES
           ('Test'
           ,'POINT ((123.626 47.8315,
                     122.626 46.8315,
                     121.626 45.8315))')


DECLARE @g geography = 'POINT(-121.626 47.8315)';
SELECT TOP(3)SpatialLocation.ToString() as Blijnie_to4ki, SpatialLocation.STDistance(@g)/1000 as Rasstoanie FROM @t
WHERE SpatialLocation.STDistance(@g) IS NOT NULL
ORDER BY SpatialLocation.STDistance(@g);


если здесь я использовал временную то теперь с помощью этого кода мне надо работать с таблицой где 3 столбца(id dbLon dbLat)....проблема в том что долгота и широта 2 отдельных столбца


может туплю..но все же что то не получается...выше я брал данные с одного столбца где долгота и широта
11 окт 12, 12:46    [13301748]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
Glory
Member

Откуда:
Сообщений: 104760
Вы не можете что ли значение полей в POINT подставить что ли ?
declare @x table(dbLon float,  dbLat float)
insert @x values(106.620165, 10.746475)
insert @x values(153.095160, -27.377213)
insert @x values(0.000000, 0.000000)
insert @x values(22.952630, 40.599135)
insert @x values(114.079980, 22.547512)
insert @x values(114.080272, 22.547073)
insert @x values(114.037833, 22.543650)
insert @x values(-115.405117, 32.622633)
insert @x values(114.079867, 22.548733)
insert @x values(106.536433, 21.013733)
insert @x values(100.572567, 13.728350)
insert @x values(400.039067, 3.539083 )

DECLARE @g geography = 'POINT(-121.626 47.8315)';

select *, x.ToString(), x.STDistance(@g)/1000 as Rasstoanie   from (
select *
,geography::STPointFromText('POINT('+STR(dbLon,20,10)+' '+ STR(dblat,20,10)+')' , 4326) as x

 from @x
 ) as a
 ORDER BY x.STDistance(@g)
11 окт 12, 13:31    [13302143]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
Glory
Вы не можете что ли значение полей в POINT подставить что ли ?
declare @x table(dbLon float,  dbLat float)
insert @x values(106.620165, 10.746475)
insert @x values(153.095160, -27.377213)
insert @x values(0.000000, 0.000000)
insert @x values(22.952630, 40.599135)
insert @x values(114.079980, 22.547512)
insert @x values(114.080272, 22.547073)
insert @x values(114.037833, 22.543650)
insert @x values(-115.405117, 32.622633)
insert @x values(114.079867, 22.548733)
insert @x values(106.536433, 21.013733)
insert @x values(100.572567, 13.728350)
insert @x values(400.039067, 3.539083 )

DECLARE @g geography = 'POINT(-121.626 47.8315)';

select *, x.ToString(), x.STDistance(@g)/1000 as Rasstoanie   from (
select *
,geography::STPointFromText('POINT('+STR(dbLon,20,10)+' '+ STR(dblat,20,10)+')' , 4326) as x

 from @x
 ) as a
 ORDER BY x.STDistance(@g)


спасибо но не все так просто а у @g geography = 'POINT(-121.626 47.8315)';
значения тоже такие же
всмысле тоже содержится
долгота
и тоже широта
и все это считать с таблицы
declare @x table(dbLon float, dbLat float)
insert @x values(106.620165, 10.746475)
insert @x values(153.095160, -27.377213)
insert @x values(0.000000, 0.000000)
insert @x values(22.952630, 40.599135)
insert @x values(114.079980, 22.547512)
insert @x values(114.080272, 22.547073)
insert @x values(114.037833, 22.543650)
insert @x values(-115.405117, 32.622633)
insert @x values(114.079867, 22.548733)
insert @x values(106.536433, 21.013733)
insert @x values(100.572567, 13.728350)
insert @x values(400.039067, 3.539083 )
11 окт 12, 14:20    [13302609]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
Glory
Member

Откуда:
Сообщений: 104760
sigor_i
спасибо но не все так просто а у @g geography = 'POINT(-121.626 47.8315)';
значения тоже такие же
всмысле тоже содержится
долгота
и тоже широта
и все это считать с таблицы

И что вам мешает для 2ой таблицы сделать тоже самое, что я сделал для 1ой таблицы ?
11 окт 12, 14:22    [13302622]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
например у g тоже точки

declare @x table(dbLon float,  dbLat float)
insert @x values(106.620165, 10.746475)
insert @x values(153.095160, -27.377213)
insert @x values(0.000000, 0.000000)
insert @x values(22.952630, 40.599135)
insert @x values(114.079980, 22.547512)
insert @x values(114.080272, 22.547073)
insert @x values(114.037833, 22.543650)
insert @x values(-115.405117, 32.622633)
insert @x values(114.079867, 22.548733)
insert @x values(106.536433, 21.013733)
insert @x values(100.572567, 13.728350)
insert @x values(400.039067, 3.539083 )

declare @g table(dbLon float,  dbLat float)
insert @g values(104.620165, 10.746475)
insert @g  values(156.095160, -27.377213)
insert @g  values(0.200000, 0.000000)
insert @g  values(22.952630, 40.599135)
insert @g  values(112.079980, 22.547512)
insert @g  values(113.080272, 22.547073)
insert @g  values(114.037833, 22.543650)
insert @g  values(-116.405117, 32.622633)
insert @g  values(117.079867, 22.548733)
insert @g  values(108.536433, 21.013733)
insert @g  values(109.572567, 13.728350)
insert @g  values(406.039067, 3.539083 )

select *, x.ToString(), x.STDistance(@g)/1000 as Rasstoanie   from (
select *
,geography::STPointFromText('POINT('+STR(dbLon,20,10)+' '+ STR(dbLat,20,10)+')' , 4326) as x

 from @x
 ) as a
 ORDER BY x.STDistance(@g)


тогда ошибка

автор
Конфликт типов операндов: table несовместим с geography
11 окт 12, 14:24    [13302644]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
sigor_i
тогда ошибка

автор
Конфликт типов операндов: table несовместим с geography
А зачем Вы в STDistance табличную переменную засунули?
Там должен объект типа geography стоять
11 окт 12, 14:31    [13302705]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
sigor_i
например у g тоже точки

declare @x table(dbLon float,  dbLat float)
insert @x values(106.620165, 10.746475)
insert @x values(153.095160, -27.377213)
insert @x values(0.000000, 0.000000)
insert @x values(22.952630, 40.599135)
insert @x values(114.079980, 22.547512)
insert @x values(114.080272, 22.547073)
insert @x values(114.037833, 22.543650)
insert @x values(-115.405117, 32.622633)
insert @x values(114.079867, 22.548733)
insert @x values(106.536433, 21.013733)
insert @x values(100.572567, 13.728350)
insert @x values(400.039067, 3.539083 )

declare @g table(dbLon float,  dbLat float)
insert @g values(104.620165, 10.746475)
insert @g  values(156.095160, -27.377213)
insert @g  values(0.200000, 0.000000)
insert @g  values(22.952630, 40.599135)
insert @g  values(112.079980, 22.547512)
insert @g  values(113.080272, 22.547073)
insert @g  values(114.037833, 22.543650)
insert @g  values(-116.405117, 32.622633)
insert @g  values(117.079867, 22.548733)
insert @g  values(108.536433, 21.013733)
insert @g  values(109.572567, 13.728350)
insert @g  values(406.039067, 3.539083 )

select *, x.ToString(), x.STDistance(@g)/1000 as Rasstoanie   from (
select *
,geography::STPointFromText('POINT('+STR(dbLon,20,10)+' '+ STR(dbLat,20,10)+')' , 4326) as x

 from @x
 ) as a
 ORDER BY x.STDistance(@g)


тогда ошибка

автор
Конфликт типов операндов: table несовместим с geography


сорри если туплю но запутался окончательно
11 окт 12, 14:32    [13302716]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
sigor_i,

Надо из строк табличных переменных конструировать объекты Geography,
а уж их использовать при вызове географических функций
11 окт 12, 14:36    [13302750]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
Glory
Member

Откуда:
Сообщений: 104760
sigor_i
тогда ошибка

автор
Конфликт типов операндов: table несовместим с geography

Вы точно понимаете, что хотите сделать ?
x.STDistance(@g) - что сервер тут сделать с _таблицей_ @g ?
Сам за вас преобразовать каждую запись в тип geography и подставить в вычисление STDistance?
11 окт 12, 14:41    [13302797]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
Glory
sigor_i
тогда ошибка

пропущено...

Вы точно понимаете, что хотите сделать ?
x.STDistance(@g) - что сервер тут сделать с _таблицей_ @g ?
Сам за вас преобразовать каждую запись в тип geography и подставить в вычисление STDistance?


declare @x table(dbLon float,  dbLat float)
insert @x values(106.620165, 10.746475)
insert @x values(153.095160, -27.377213)
insert @x values(0.000000, 0.000000)
insert @x values(22.952630, 40.599135)
insert @x values(114.079980, 22.547512)
insert @x values(114.080272, 22.547073)
insert @x values(114.037833, 22.543650)
insert @x values(-115.405117, 32.622633)
insert @x values(114.079867, 22.548733)
insert @x values(106.536433, 21.013733)
insert @x values(100.572567, 13.728350)
insert @x values(400.039067, 3.539083 )

declare @g table(dbLon float,  dbLat float)
insert @g values(104.620165, 10.746475)
insert @g  values(156.095160, -27.377213)
insert @g  values(0.200000, 0.000000)
insert @g  values(22.952630, 40.599135)
insert @g  values(112.079980, 22.547512)
insert @g  values(113.080272, 22.547073)
insert @g  values(114.037833, 22.543650)
insert @g  values(-116.405117, 32.622633)
insert @g  values(117.079867, 22.548733)
insert @g  values(108.536433, 21.013733)
insert @g  values(109.572567, 13.728350)
insert @g  values(406.039067, 3.539083 )

select *
,geography::STPointFromText('POINT('+STR(dbLon,20,10)+' '+ STR(dbLat,20,10)+')' , 4326) as y

 from @g
 

select *, x.ToString(), x.STDistance(???)/1000 as Rasstoanie   from (
select *
,geography::STPointFromText('POINT('+STR(dbLon,20,10)+' '+ STR(dbLat,20,10)+')' , 4326) as x

 from @x
 ) as a
 ORDER BY x.STDistance(@g)



что то немножко вьехал......вроде сделал так
11 окт 12, 14:44    [13302828]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
sigor_i
Member

Откуда:
Сообщений: 40
sigor_i
Glory
пропущено...

Вы точно понимаете, что хотите сделать ?
x.STDistance(@g) - что сервер тут сделать с _таблицей_ @g ?
Сам за вас преобразовать каждую запись в тип geography и подставить в вычисление STDistance?


declare @x table(dbLon float,  dbLat float)
insert @x values(106.620165, 10.746475)
insert @x values(153.095160, -27.377213)
insert @x values(0.000000, 0.000000)
insert @x values(22.952630, 40.599135)
insert @x values(114.079980, 22.547512)
insert @x values(114.080272, 22.547073)
insert @x values(114.037833, 22.543650)
insert @x values(-115.405117, 32.622633)
insert @x values(114.079867, 22.548733)
insert @x values(106.536433, 21.013733)
insert @x values(100.572567, 13.728350)
insert @x values(400.039067, 3.539083 )

declare @g table(dbLon float,  dbLat float)
insert @g values(104.620165, 10.746475)
insert @g  values(156.095160, -27.377213)
insert @g  values(0.200000, 0.000000)
insert @g  values(22.952630, 40.599135)
insert @g  values(112.079980, 22.547512)
insert @g  values(113.080272, 22.547073)
insert @g  values(114.037833, 22.543650)
insert @g  values(-116.405117, 32.622633)
insert @g  values(117.079867, 22.548733)
insert @g  values(108.536433, 21.013733)
insert @g  values(109.572567, 13.728350)
insert @g  values(406.039067, 3.539083 )

select *
,geography::STPointFromText('POINT('+STR(dbLon,20,10)+' '+ STR(dbLat,20,10)+')' , 4326) as y

 from @g
 

select *, x.ToString(), x.STDistance(???)/1000 as Rasstoanie   from (
select *
,geography::STPointFromText('POINT('+STR(dbLon,20,10)+' '+ STR(dbLat,20,10)+')' , 4326) as x

 from @x
 ) as a
 ORDER BY x.STDistance(@g)



что то немножко вьехал......вроде сделал так


совсем запутался
11 окт 12, 15:12    [13303054]     Ответить | Цитировать Сообщить модератору
 Re: долгота широта в SQL! Вычисления расстояния!  [new]
iap
Member

Откуда: Москва
Сообщений: 47045
sigor_i,

есть две табличные переменные. Что с ними делать-то надо? Кроссджойнить или что?
Без ответа на этот вопрос всё бессмысленно
11 окт 12, 15:18    [13303102]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить