我将经度和纬度存储为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米。
答案 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)
返回
可以验证结果 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