在R中找到点向量和多边形之间的最近距离
Finding the nearest distances between a vector of points and a polygon in R
我有一个 lat/long 坐标的数据框和一个表示海岸线的多边形。我正在尝试找出每个点与最近的海岸线要素之间的距离。我想最终得到一个输出数据框,其中包含原始 lat/long 值的列和一个新的距离列。
在网上阅读了类似问题的答案后,我曾尝试使用 gDistance
函数,但我认为我遗漏了一些步骤并且无法弄清楚。目前,我只得到一个距离值。我是 R 的新手,非常感谢任何人可能提供的任何帮助。
谢谢!
#Load data
Locs = structure(list(id = 1:5, Lat = c(29.59679167, 29.43586667, 29.37642222,29.52786111, 30.10603611), Long = c(-81.02547778, -80.92573889,
-80.97714167, -81.08721667, -80.94368611)), .Names = c("id","Lat", "Long"), class = "data.frame", row.names = c(NA, -5L))
#Extract lat/long coordinates
xy = Locs[,c("Lat","Long")]
#Create SpatialPointsDataFrame from xy data and change projection to metres
spdf = SpatialPointsDataFrame(coords=xy, data=xy, proj4string = CRS("+proj=aea +zone=17 ellps=WGS84"))
#Read in shapefile as a spatialdataframe object
coast = readOGR(dsn="land data", layer="coast")
#Transform to AEA (m) projection to match projection of points
land_poly = spTransform(coast, CRS("+proj=aea +zone=17 ellps=WGS84"))
#OR load map from map package (but unfortunately map objects do not work in gDistance)
library(maps)
library(mapdata)
coast2 = map('usa', col = "grey90", fill=TRUE)
#Calculate distance between each point and the nearest land feature
for(i in 1:dim(spdf)[1]){
g = gDistance(spdf[i,],land_poly)
}
编辑:使用下面的 AEF 代码更改(对于 for 循环步骤),我能够获得每一行的 gDistance 值,但是输出距离不正确(见下文)。根据 arcGIS,它们应该在 4-37 公里之间,而不是 >500 公里。对我在这里做错了什么有什么想法吗?我的陆地多边形和点都在同一个投影中。
g距离输出
id Lat Long dist_gDist
1 1 29.59679 -81.02548 516299.0
2 2 29.43587 -80.92574 516298.8
3 3 29.37642 -80.97714 516298.9
4 4 29.52786 -81.08722 516299.0
5 5 30.10604 -80.94369 516299.0
正确的距离(在 GIS 中计算)
id Lat Long dist_arc
1 1 29.59679 -81.02548 13.630
2 2 29.43587 -80.92574 15.039
3 3 29.37642 -80.97714 8.111
4 4 29.52786 -81.08722 4.784
5 5 30.10604 -80.94369 36.855
我认为您只能获得一个距离值,因为您在 for
循环的每次迭代中都覆盖了 g
。但是我不知道这是否是唯一的问题,因为没有合适的数据我无法重现您的问题。
尝试将最后一个循环更改为:
g = rep(NA, dim(spdf)[1])
for(i in 1:dim(spdf)[1]){
g[i] = gDistance(spdf[i,],land_poly)
}
我有一个 lat/long 坐标的数据框和一个表示海岸线的多边形。我正在尝试找出每个点与最近的海岸线要素之间的距离。我想最终得到一个输出数据框,其中包含原始 lat/long 值的列和一个新的距离列。
在网上阅读了类似问题的答案后,我曾尝试使用 gDistance
函数,但我认为我遗漏了一些步骤并且无法弄清楚。目前,我只得到一个距离值。我是 R 的新手,非常感谢任何人可能提供的任何帮助。
谢谢!
#Load data
Locs = structure(list(id = 1:5, Lat = c(29.59679167, 29.43586667, 29.37642222,29.52786111, 30.10603611), Long = c(-81.02547778, -80.92573889,
-80.97714167, -81.08721667, -80.94368611)), .Names = c("id","Lat", "Long"), class = "data.frame", row.names = c(NA, -5L))
#Extract lat/long coordinates
xy = Locs[,c("Lat","Long")]
#Create SpatialPointsDataFrame from xy data and change projection to metres
spdf = SpatialPointsDataFrame(coords=xy, data=xy, proj4string = CRS("+proj=aea +zone=17 ellps=WGS84"))
#Read in shapefile as a spatialdataframe object
coast = readOGR(dsn="land data", layer="coast")
#Transform to AEA (m) projection to match projection of points
land_poly = spTransform(coast, CRS("+proj=aea +zone=17 ellps=WGS84"))
#OR load map from map package (but unfortunately map objects do not work in gDistance)
library(maps)
library(mapdata)
coast2 = map('usa', col = "grey90", fill=TRUE)
#Calculate distance between each point and the nearest land feature
for(i in 1:dim(spdf)[1]){
g = gDistance(spdf[i,],land_poly)
}
编辑:使用下面的 AEF 代码更改(对于 for 循环步骤),我能够获得每一行的 gDistance 值,但是输出距离不正确(见下文)。根据 arcGIS,它们应该在 4-37 公里之间,而不是 >500 公里。对我在这里做错了什么有什么想法吗?我的陆地多边形和点都在同一个投影中。
g距离输出
id Lat Long dist_gDist
1 1 29.59679 -81.02548 516299.0
2 2 29.43587 -80.92574 516298.8
3 3 29.37642 -80.97714 516298.9
4 4 29.52786 -81.08722 516299.0
5 5 30.10604 -80.94369 516299.0
正确的距离(在 GIS 中计算)
id Lat Long dist_arc
1 1 29.59679 -81.02548 13.630
2 2 29.43587 -80.92574 15.039
3 3 29.37642 -80.97714 8.111
4 4 29.52786 -81.08722 4.784
5 5 30.10604 -80.94369 36.855
我认为您只能获得一个距离值,因为您在 for
循环的每次迭代中都覆盖了 g
。但是我不知道这是否是唯一的问题,因为没有合适的数据我无法重现您的问题。
尝试将最后一个循环更改为:
g = rep(NA, dim(spdf)[1])
for(i in 1:dim(spdf)[1]){
g[i] = gDistance(spdf[i,],land_poly)
}