给定经度/纬度,请将米转换为经度/纬度

时间:2019-06-24 17:11:31

标签: sql sql-server geometry

我将经度和纬度存储为SRID 4326的几何图形。

我想制作一条正好1000米长的线,即90度(向右)。

我知道从纵向/横向到米的转换因您在地球上的位置而异。这就是为什么我会通过一个参考长/纬度可以考虑的原因。

我正在寻找一种“足够好”的东西,它假定您想要的距离不会超过100英里。

考虑到长/纬度和一米的距离为1000米,请向我返回线的长/纬度的大小。

这个问题是特定于一个示例的,但是我正在寻找一种通用的解决方案,因为我有很多功能可以在“ SRID单位”上使用,并且我使用的SRID是long / lat(4326),但是我一直想处理用米而不是度。

希望是,我可以调用定标器功能将所需的仪表转换为4326单位。

我考虑过的一些寻找X米的技巧是将几何转换为地理,然后使用STBuffer(X)制作一个半径等于X的圆,然后创建一条与缓冲区相交的长线,并找到相交的点,这将是恰好X米远的长/纬度。这似乎很hacky,效率低下,但可能是最准确的


编辑:

要查找deltaX和deltaY,函数需要执行以下操作:

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

我可以提供@AngleRads和@DistanceInDegrees。 问题是@DistanceInDegrees必须匹配4326个单位(度)。不管给定什么角度,是否有可能找到对应于1000米的@DistanceInDegrees?

当我使用公式时 @DistanceInDegrees = (@Meters / 6371008.7714) * (180 / pi()) / cos(@Lat1 * pi()/180)并成90度角,则线的长度为1002米,接近但不等于1000。如果我使用45度,则线的长度为1191.67米。

2 个答案:

答案 0 :(得分:1)

如果我理解您的问题,那么只需一点数学即可。

这还假设地球的平均半径为 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

可以验证结果 here

enter image description here

答案 1 :(得分:0)

编辑后,您似乎正在寻找距离和轴承

这是一个表值函数,可能会有所帮助

示例

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

返回

RetLat              RetLng
-37.7802105711301   145.170133170589

现在,当我计算距离时,我会得到 999.99999448737米

感兴趣的表值函数

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