По долготе / широте конвертировать метры в градусы долготы / широты - PullRequest
1 голос
/ 24 июня 2019

У меня есть долгота и широта, сохраненные в виде геометрии с SRID 4326.

Я хочу создать линию длиной ровно 1000 метров, которая будет 90 градусов (вправо).

Я знаю, что перевод из продольной / широтной степени в метр зависит от того, где вы находитесь на земном шаре.Вот почему я передам эталонный длинный / лат, который можно принять во внимание.

Я ищу что-то «достаточно хорошее», предполагающее, что расстояние, которое вы хотите, не будет превышать 100 миль.

Учитывая длинное / лат и метровое расстояние 1000 метров, верните мне размер линии длинные / латовые градусы.

Этот вопрос относится только к одному примеру, но я ищу общийрешение, потому что у меня есть много функций, которые работают с «Единицами SRID», и SRID, с которым я работаю, это long / lat (4326), но я всегда хочу иметь дело с метрами, а не градусами.

Надежда состоит в том, что яМожно вызвать функцию масштабирования, чтобы преобразовать нужные мне метры в 4326.

Некоторые хаки, которые я рассмотрел для поиска Х-метров, - это преобразование геометрии в географию и использование STBuffer (X), чтобы сделать круг срадиус, равный X, затем создайте длинную линию, которая пересекает буфер, и найдите точку пересечения, которая будет long / lat точно XметровЭто кажется очень хакерским и неэффективным, но может быть наиболее точным


Редактировать:

Чтобы найти deltaX и deltaY, функция выполняет следующее:

DeltaX = Cos(@AngleRads) * @DistanceInDegrees;
DeltaY = Sin(@AngleRads) * @DistanceInDegrees;

Я могу предоставить @AngleRads и @DistanceInDegrees.Проблема в том, что @DistanceInDegrees должен соответствовать 4326 единицам (градусам).Можно ли даже найти @DistanceInDegrees, который будет соответствовать 1000 метров независимо от того, какой угол задан?

Когда я использую формулу @DistanceInDegrees = (@Meters / 6371008.7714) * (180 / pi()) / cos(@Lat1 * pi()/180) и угол 90 градусов, тогда длина линии равна1002 метра, близко, но не тождественно 1000 .. Если я использую градус 45, длина линии составляет 1191,67 метра.

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Если я понимаю ваш вопрос, это можно сделать с помощью небольшой математики.

Это также предполагает, что средний радиус Земли составляет 6 371 008,7714 метров .

Пример

Declare @Lat1 float = -37.786570
Declare @Lng1 float = 145.178179

Declare @Meters float = -1000

Select Lat1 = @Lat1
      ,Lng1 = @Lng1
      ,Lat2 = @Lat1
      ,Lng2 = @Lng1 + (@Meters / 6371008.7714) * (180 / pi()) / cos(@Lat1 * pi()/180)

Возвращает

enter image description here

Результаты могут быть подтверждены здесь

enter image description here

0 голосов
/ 25 июня 2019

После вашего РЕДАКТИРОВАНИЯ, кажется, вы ищете РАССТОЯНИЕ и ПОДШИПНИК

Вот табличная функция, которая может помочь

Пример

Select * from [dbo].[tvf-Geo-Distance-Bearing](-37.786570,145.178179,1000,-45)

Возвращает

RetLat              RetLng
-37.7802105711301   145.170133170589

Теперь, когда я вычисляю расстояние, я получаю 999,999999448737 метров

Функция с табличным значением, если она заинтересована

CREATE Function [dbo].[tvf-Geo-Distance-Bearing] (@Lat1 float,@Lng1 float,@Dist Float,@Degr float)  

Returns @LatLng Table (RetLat float,RetLng Float)

As

Begin

    Declare @Lat2 float,@Lng2 float,@eRad float = 6371008.7714

    Select @Lat1 = RADIANS(@Lat1)
          ,@Lng1 = RADIANS(@Lng1)
          ,@Degr = RADIANS(@Degr)

    Set @Lat2 = Asin(Sin(@Lat1) * Cos(@Dist / @eRad ) + Cos(@Lat1) * Sin(@Dist / @eRad ) * Cos(@Degr ))
    Set @Lng2 = @Lng1 + Atn2(Sin(@Degr) * Sin(@Dist / @eRad ) * Cos(@Lat1), Cos(@Dist / @eRad ) - Sin(@Lat1) * Sin(@Lat2))

    Insert Into @LatLng
    Select Degrees(@Lat2)
          ,Degrees(@Lng2)

    Return;

End

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...