[英]Distances between two points calculated with geosphere::distm are different than distances plotted with leaflet
I have two data frames of lat long points. 我有两个经纬度长的数据框。 DatasetA is a set of locations.
DatasetA是一组位置。 Dataset B is a set of locations 50 miles away (longitudinally) from Dataset A.
数据集B是距数据集A 50英里(纵向)的一组位置。
I can plot the two data sets with no incident, as the code below shows. 我可以绘制两个数据集而不会发生任何事件,如下面的代码所示。 However, when I calculate the distance between the points of DatasetA and DatasetB (closest points), I get different distances:
但是,当我计算数据集A和数据集B的点(最近的点)之间的距离时,会得到不同的距离:
> points$Distance2radius
[1] 44.13807 41.92467 39.39219 36.55992 33.44940
I am having trouble understanding why these would be different. 我很难理解为什么这些会有所不同。 I would assume that using the Haversine formula in distm would account for any spherical impacts on the distance calculation.
我假设在distm中使用Haversine公式将说明对距离计算的任何球形影响。
Any help would be appreciated. 任何帮助,将不胜感激。
library(leaflet)
library(geosphere)
### Make a dataframe of some test points ###
## Center of the US
dc.lat <- c(38.0000)
dc.long <- c(-97.0000)
## Make the data frame
lats <- c(dc.lat - 10, dc.lat - 5, dc.lat, 5 + dc.lat, 10 + dc.lat)
points <- data.frame(cbind(dc.long, lats))
names(points) <- c("long" , "lat")
coordinates(points) <- ~ long + lat
## The radius we are interested in, in miles
radius <- 50
## Add points that are the radius miles away from the center
points.at.radius <- data.frame(points)
#points$lat <- points$lat + radius/110.54
points.at.radius$long <- points$long + radius / 69.2
coordinates(points.at.radius) <- ~ long + lat
## Get distances with distm
distances <- distm (points, points.at.radius,
fun = distHaversine) / 1609
# Find the closest pint and add this distance to the data set
points$Distance2radius <-
apply(distances , 1, min)
# Plot these points and the points that are 50 miles away
m <- leaflet() %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addCircleMarkers(data = points,
points$long,
points$lat,
color = "red") %>%
addPolygons(
data = gBuffer(
points,
width = radius / 69.2,
joinStyle = "ROUND",
byid = FALSE
),
color = "gray70",
group = "IWER area"
) %>%
addMarkers(data = points.at.radius,
points.at.radius$long,
points.at.radius$lat) %>% addPopups(
points$long,
points$lat,
47.597131,
points$Distance2radius,
options = popupOptions(closeButton = FALSE)
)
m # Print the map
Quite straightforward with geobuffer
. 使用
geobuffer
非常简单。
# Load libraries.
library(leaflet)
library(geosphere)
library(geobuffer)
# Set coordinates for center points.
coordinates <- data.frame(lon = -97,
lat = seq(28, 48, 5))
# Create SpatialPoints in the WGS84 spatial reference system,
# a.k.a. unprojected lon/lat.
points <- SpatialPoints(coords = coordinates,
proj4string = CRS("+init=epsg:4326"))
# Set radius as 50 miles.
radius <- 50 * 1609
# Created SpatialPolygons in the shape of an octagon.
buffered_points <- geobuffer::geobuffer_pts(xy = points,
dist_m = radius,
step_dg = 360 / 8)
> distm(points@coords[1,],
coordinates(buffered_points@polygons[[1]]@Polygons[[1]])) / 1609
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 50 50 50 50 50 50 50 50 50
You will find that this is the case for not only SpatialPolygon #1, but also for the other three objects.
您会发现不仅对于SpatialPolygon#1,对于其他三个对象都是如此。
leaflet() %>%
addTiles() %>%
addCircleMarkers(data = points,
color = "red") %>%
addPolygons(
data = buffered_points,
color = "gray70"
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.