[英]Convert longitude latitude coordinates (WGS) to grid with equidistant axes (in given area)
我在两个数据集中有很多地理坐标,并且想要运行最近邻搜索。 我遇到了“ RANN”包,函数nn2(x,y)
运行速度非常快。
现在有一个问题,在伦敦地区,当然,向北的度数要比向西的度数更长。
我现在的想法是将位置坐标转换为某个网格,其中沿x方向的一步与沿y方向的一步几乎相同。 该地区是伦敦(中心-0.1045,51.489)。 我如何执行此转换?
library(RANN)
xyunf <- structure(c(-0.19117, -0.173862, -0.187623, -0.187623, -0.192366,
-0.176224, 51.489096, 51.482442, 51.50226, 51.50226, 51.491632,
51.495429), .Dim = c(6L, 2L), .Dimnames = list(c("1", "2", "3",
"4", "6", "7"), c("Longitude", "Latitude")))
xyosm <- structure(c(-0.1966434, -0.1097162, -0.2023061, -0.198467, -0.4804301,
-0.4286548, 51.6511198, 51.6134576, 51.6042042, 51.5186019, 51.3757395,
51.3351355), .Dim = c(6L, 2L), .Dimnames = list(NULL, c("lon",
"lat")))
res <- nn2(data=xyunf, query=xyosm, k=1)
res$nn.dists
res$nn.idx
您只需111.1公里/度就可以很好地估算温带纬度的南北距离。 对于经度(东西向):
mtrs_degr_long <- function(long) { a=6378137.0 ; b=6356752.3142
e.sqr <- a^2/b^2 -1; long=long*2*pi/360
pi*a*cos(long)/( 180*(1-e.sqr*sin(long)^2)^(1/2) ) }
(请参阅Wikipedia文章 。)
现在,您可以将经度值乘以mtrs_degr_lat(51.5)/111100
,然后将调整比例,使相对距离正确。 如果将两者都转换为米,则可以获得绝对距离。 给定相对较小的范围,由非直线坐标系引起的误差将非常小。
如果阅读了R Spatial Task视图,则可以找到有关Spatial对象的所有信息-这些是可以关联坐标参考系统的点,网格,线或面。
一旦获得了这些,就可以使用spTransform
在坐标系之间进行转换。 因此,将包含经/纬项的数据框从经度转换为军械测量网格坐标:
coordinates(ptsLL) = ~Longitude+Latitude # turns a dataframe into a SpatialPointsDataFrame
proj4string(ptsLL) = CRS("+init=epsg:4326") # tells it to be lat-long WGS84
ptsOS = spTransform(ptsLL, CRS("+init=epsg:27700")) # converts to UK Grid system
ptsOS = pts@coords
现在关于epsg:27700的事情是,它是一个以米为单位的正方形网格,因此使用该网格。 如果需要转换回lat-long, spTransform
再次使用spTransform
。
世界其他地方还有其他方格坐标系,因此不要在澳大利亚使用!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.