0

我在两个数据集中有很多地理坐标,并且想要运行最近邻搜索。我遇到了“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
4

2 回答 2

2

仅使用 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) ) }

{参见维基百科文章。)

现在您可以乘以您的经度值mtrs_degr_lat(51.5)/111100,然后您将调整比例,因此相对距离是正确的。如果将两者都转换为米,则可以获得绝对距离。在相对较小的范围内,由非直线坐标系引起的误差将非常小。

于 2012-08-07T21:52:09.477 回答
2

如果您阅读 R Spatial Task 视图,您可以找到所有关于 Spatial 对象的信息 - 这些是可以关联坐标参考系的点、网格、线或多边形。

一旦你有了这些,你就可以spTransform用来在坐标系之间进行转换。因此,要将具有 lat/lon 项目的数据框从 lat-long 转换为军械测量网格坐标:

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 的问题是它是以米为单位的方形网格,所以使用它。如果您需要再次转换回经纬度spTransform

世界其他地区还有其他方格坐标系,所以不要在澳大利亚使用这个!

于 2012-08-08T07:15:35.307 回答