返回半径为初始纬度和长度

时间:2016-12-14 14:23:38

标签: r

目前我在学校项目,我对R以及论坛和脚本一般都是新手

我有Lat_XLong_Y

我还有一个包含Lat_nLong_n列表的表格。

如何从表中返回距Lat_XLong_Y坐标100公里范围内的所有值?

1 个答案:

答案 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的解决方案更合适。但是,有时最好使用缓冲区,例如,如果你使用栅格。