【发布时间】:2020-09-14 03:07:12
【问题描述】:
我有一些 GPS 测量线,每条线有 3 个点,由于测量的不确定性而弯曲,我想用长度正好 50m 以中心点为中心的线代替测量线和测量点的大致方向。
为此,我想从中心点(由 lon/lat 坐标给出)向某个方向移动 25m,该方向由 lon/lat 矢量给出。现在的问题是,在不同的纬度 25m 的度数并不相同。我做了一些计算来得到 1m 在该位置的长度:
# Calculate the length of a 1 degree difference
earth_circumference <- 40075016.7
for(i in 1:nrow(coords)){
coords$d_m_lon[i] <- earth_circumference/360*cos(abs(coords$c_lat[1])*pi/180)
coords$d_m_lat[i] <- earth_circumference/360
}
# Claculate the difference in degree that 1m at the surface makes
coords$m_d_lon <- 1/coords$d_m_lon
coords$m_d_lat <- 1/coords$d_m_lat
我有一个 dataframe (coords),它在每一行中包含起始 s、中心 c 的坐标em> 和结束 e 点。我做了一个回归以获得最接近点的一般方向的线(在这里,我使用 [1] 作为数据的第一行;如果它有效,它显然会循环重复所有行的处理):
# Calculate average transect directions
points <- data.frame(
x = c(coords$s_lon[1], coords$c_lon[1], coords$e_lon[1]),
y = c(coords$s_lat[1], coords$c_lat[1], coords$e_lat[1])
)
mod <- lm(points$y ~ points$x)
a <- coefficients(mod)[1]
b <- coefficients(mod)[2]
现在我尝试按照模型给定的方向前进,并在给定的纬度上将矢量缩放到 25m 长,但不知何故新的开始 em> 和 end 点不再在回归线上:
center <- c(coords$c_lon[1], coords$c_lat[1])
direction <- c(b-a, 1)/sqrt((b-a)^2 + 1)
start <- center + 25*c(coords$m_d_lon[1], coords$m_d_lat[1])*direction
end <- center - 25*c(coords$m_d_lon[1], coords$m_d_lat[1])*direction
是否有人看到错误出现在哪里或知道如何解决问题?我想我没有正确缩放矢量...
如果您希望数据的第一行对此进行测试:
coords <- structure(list(s_lat = -29.6032, s_lon = 29.3376, c_lat = -29.6032,
c_lon = 29.3379, e_lat = -29.6032, e_lon = 29.3381, d_m_lon = 96788.6617220582,
d_m_lat = 111319.490833333, m_d_lon = 1.03317886848321e-05,
m_d_lat = 8.98315283796251e-06), row.names = 1L, class = "data.frame")
【问题讨论】:
-
看看
geosphere:cran.r-project.org/web/packages/geosphere 包它会为你节省很多三角函数;)
标签: r vector geospatial latitude-longitude