目前我在学校项目,我对R以及论坛和脚本一般都是新手
我有Lat_X
和Long_Y
。
我还有一个包含Lat_n
和Long_n
列表的表格。
如何从表中返回距Lat_X
和Long_Y
坐标100公里范围内的所有值?
答案 0 :(得分:0)
您可以使用gBuffer
包中的rgeos
功能来创建圈子。请注意,您必须使用一些平面投影。
然后,您可以使用over
函数“分组”点。
示例:
library(sp)
library(rgeos)
# Initial data
lat_X = 10
long_Y = 10
Radius = 500000 # in meters
Points_dat <- data.frame(lon_n = c(8:15), lat_n = c(8:15))
### Solution with SP and rgeos packages
# First, prepare projected spatial objects
Origin <- SpatialPoints(data.frame(long_Y, lat_X),
proj4string = CRS("+proj=longlat +datum=WGS84"))
Points <- SpatialPoints(Points_dat, proj4string = CRS("+proj=longlat +datum=WGS84"))
# Reproject them into planar
Origin_t <- spTransform(Origin, CRS("+init=epsg:2393"))
Points_t <- spTransform(Points, CRS("+init=epsg:2393"))
# Construct buffer
Circle <- gBuffer(Origin_t, width=Radius, byid=TRUE)
# Plot_results
plot(Circle)
plot(Points_t, add=TRUE)
plot(Origin_t, add=TRUE, pch=16)
plot(Points_t[!is.na(over(Points_t, Circle)), ], pch=5, col=2, add=TRUE)
# Make subset
Points_subset <- Points_dat[!is.na(over(Points_t, Circle)), ]
Points_subset
结果:
lon_n lat_n
1 8 8
2 9 9
3 10 10
4 11 11
5 12 12
6 13 13
UPD:地球圈解决方案 初始数据与前一个示例中的相同。
library(geosphere)
# Distances calculation
distances <- distm(Points_dat, c(long_Y, lat_X), fun=distHaversine)
Points_subset_1 <- Points_dat[distances <= Radius,]
# Attach column with distances in meters
Points_subset_1$dist <- distances[distances <= Radius]
Points_subset_1
lon_n lat_n dist
1 8 8 312918.2
2 9 9 156352.6
3 10 10 0.0
4 11 11 156115.9
5 12 12 311971.1
6 13 13 467541.5
如果您需要实际距离,geosphere
的解决方案更合适。但是,有时最好使用缓冲区,例如,如果你使用栅格。