从一个点开始,距离在一定范围内的点

3

我一直在尝试正确使用git,实际上它已经运行了,但距离计算有误:

  • 1- 我有一组点
  • 2- 我有一个点,需要找到所有距离它200米的点
  • 3- 正常情况下,应该返回6个点,但只返回了4个点
library(sf)
library(geosphere)#My points
x<-c(2.3009132,2.2999853,2.2995872,2.2985374,2.2991502,2.2984043,2.3054471,2.3009132,2.3048155,2.3014964)
y<-c(48.8511847,48.8505062,48.8502346,48.8495305,48.8499405,48.8494376,48.8542721,48.8511847,48.853842,48.8515819)​
y<-c(48.8511847,48.8505062,48.8502346,48.8495305,48.8499405,48.8494376,48.8542721,48.8511847,48.853842,48.8515819)
df<-data.frame(x=x,y=y)
#Transforming to SF object 
sdf<-st_transform(st_as_sf(df, coords = c("x", "y"), 
                           crs = 4326, agr = "constant"),3857)
#My point to which I need to calculte
pnt<- st_transform( 
    st_sfc(st_point(x = c(2.3009132, 48.8511847)), crs = 4326), 3857)
#A buffer of 200m arround my point
buffer <- st_buffer(pnt,200)
#getting points within the buffer
intr <- st_intersects(sdf, buffer, sparse=F)
#transforming back to lon/lat
sdf <- st_transform(sdf,4326)

#getting the selected points
sdf<-sdf[which(unlist(intr)),]

#Only 4 points were found
> sdf
Simple feature collection with 4 features and 0 fields
geometry type:  POINT
dimension:      XY
bbox:           xmin: 256033.2 ymin: 6249533 xmax: 256201.4 ymax: 6249715
epsg (SRID):    3857
proj4string:    +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs
                  geometry
1 POINT (256136.5 6249648)
2 POINT (256033.2 6249533)
3 POINT (256136.5 6249648)
4 POINT (256201.4 6249715)

#To verify I have calculated the distance to my point
t_sdf<-df%>% mutate(d = by(df, 1:nrow(df), function(row) {
+     distHaversine(c(row$x, row$y), c(2.3009132, 48.8511847), r = 6378137)
+ }))
#6 points are less than 200m to my point
> t_sdf %>% arrange(d)
          x        y         d
1  2.300913 48.85118   0.00000
2  2.300913 48.85118   0.00000
3  2.301496 48.85158  61.48172
4  2.299985 48.85051 101.61024
5  2.299587 48.85023 143.59844
6  2.299150 48.84994 189.36954
.....
2个回答

4

一定组点之间的直线(欧几里得)距离在不同的投影中会有所变化。

正如这里所讨论的,3857不是进行距离计算的好选择。如果我们使用一个建立在点所处地区(也许是EPSG:27561 - NTF (Paris) / Lambert Nord France)的投影,则可以得到预期的结果。

sdf <- st_as_sf(df, coords = c("x", "y"), 
                crs = 4326, agr = "constant")
sdf_proj <- st_transform(sdf, 3857)
sdf_France_proj <- st_transform(sdf, 27561)

大圆距离

> st_distance(pnt, sdf, by_element = T) %>% sort()
Units: [m]
 [1]   0.00000   0.00000  61.50611 101.64007 143.64481 189.43485 253.46142 267.67954 411.50933 478.11306

Mercator(3857)欧几里得距离

> st_distance(pnt_proj, sdf_proj, by_element = T) %>% sort()
Units: [m]
 [1]   0.00000   0.00000  93.43522 154.41781 218.22699 287.78463 385.04306 406.64205 625.14635 726.33083

法国投影(27561)欧几里得距离

> st_distance(pnt_France_proj, sdf_France_proj, by_element = T) %>% sort()
Units: [m]
 [1]   0.00000   0.00000  61.50289 101.63477 143.63731 189.42497 253.44822 267.66559 411.48772 478.08794

以下是带有缓冲区的图表:

library(gridExtra)

buffer_proj <- st_buffer(pnt_proj, 200)
buffer_France_proj <- st_buffer(pnt_France_proj, 200)

proj <- ggplot() + g
eom_sf(data = buffer_proj, fill = "blue", alpha = 0.5) + 
  geom_sf(data = sdf_proj, color = "red") + 
  ggtitle("Mercator (3857)")

France_proj <- ggplot() + 
  geom_sf(data = buffer_France_proj, fill = "blue", alpha = 0.5) + 
  geom_sf(data = sdf_proj, color = "red") + 
  ggtitle("France proj (27561)")

grid.arrange(proj, France_proj, ncol = 1)

enter image description here


谢谢,这正是导致问题的原因。 - undefined
1
我们实际上在你之前的帖子中讨论过这个问题。请查看我在这里的回答底部 - 看一下mutate()函数:https://stackoverflow.com/questions/59250592/distance-between-all-the-points-to-the-first-point/59250811#59250811 - undefined
我认为你不需要先对点进行排序。你只需要找到每条街道上的第一个点,计算它与其他所有点之间的距离,然后按照距离进行排序即可。但是我可能对你的问题有误解。如果是这样的话,我建议你创建一个新的帖子,并详细解释一下。 - undefined
实际上,我有多条街道,是否有一种自动获取第一个点的方法? 实际上,在所有的sf对象中,可以通过st_bbox(df)访问边界框。 - undefined
1
可能这是一个解决方案,但是没有更详细地了解你的数据,很难确定。我认为你应该创建一个新帖子,包括更多实际数据。在评论中讨论这个问题太复杂了,而且会有更多人看到。 - undefined
显示剩余2条评论

2
我不知道您是如何计算到达您的点的距离的。但是,当您使用提供的数据进行计算时,只有4个点落在圆内。也许您可以使用QGIS或ArcGIS来验证这一点。但是,以下是在圆内的4个点的外观:

enter image description here


distHaversine函数计算两点之间的最短距离(即“大圆距离”或“直线距离”),我还测试了distGeo和其他函数,它们都给出了相同的结果。 - undefined
2
就我所知,我已经使用一个单独实现的哈弗赛恩距离计算方法,将这些数据转化为直线距离,并得到了与问题中的 OP 相同的结果。顺便说一下,当查看数据时,我也得到了与这个答案相同的结果。 - undefined
1
非常奇怪。但需要注意的是,当我绘制数据时,尽管所有单位都是以米为单位(units=m),但x轴和y轴却是以纬度和经度表示的。我已经在上面编辑了我的图片。 - undefined
1
也许尝试使用不同的投影方式。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接