Как я могу считать пассажиров на станции метро?

Привет, это мой первый вопрос о stackoverflow, надеюсь, я все делаю правильно. Я хочу посчитать пассажиров на станции метро. У меня есть четыре вектора с долготой и широтой пассажиров и станции. Остановки изображаю кругами радиусом 20 метров, а пассажиров маркерами. Теперь я хочу знать, сколько маркеров в кругах. Я уже пытался суммировать маркеры с помощью markerClusterOption, но маркеры за пределами кругов добавляются к маркерам в круге, и я просто хочу суммировать маркеры внутри круга. Моя цель - просто сложить количество маркеров внутри кругов.

library(leaflet)
#lat and long of the Subway stations
SubwayStation_long<-c(174.764164,174.764290)
SubwayStation_lat<-c(-36.877022,-36.877844)
#lat and long of the Passengers
Passagier_long<-c(174.764,
                  174.764436,
                  174.764336,
                  174.764044,
                  174.764034,
                  174.763,
                  174.7641,
                  174.7645,
                  174.764290,
                  174.764068,
                  174.764352,
                  174.764467)
Passagier_lat<-c(-36.877,
                 -36.8770099,
                 -36.8770199,
                 -36.8770189,
                 -36.8770189,
                 -36.876,
                 -36.8779,
                 -36.8778,
                 -36.877844,
                 -36.877102,
                 -36.877814,
                 -36.877900)


tiles = getAllLeafletTiles()
tiles = tiles[c(1,3,27)]
map <- leaflet() 
for (provider in tiles) {
  map <- map %>% addProviderTiles(provider, group = provider)
}

map <- addLayersControl(
  map,
  baseGroups    = tiles,c("Station","Passengers"),
  options       = layersControlOptions(collapsed = FALSE))
map <- addMeasure(map, primaryLengthUnit = "kilometers", primaryAreaUnit = "sqmeters", activeColor = "#3D535D", completedColor = "#006400")

map<-addCircles(map,SubwayStation_long,SubwayStation_lat, group = "Station",radius = 15)

map<-addMarkers(map,Passagier_long,Passagier_lat,group = "Passengers",
                           clusterOptions = markerClusterOptions(freezeAtZoom = FALSE))

map

вот пример

я хочу так


person review    schedule 27.03.2019    source источник
comment
ваша ссылка внизу не работает, похоже, для вашего локального рабочего стола. Есть ли другой способ поделиться изображением, возможно, используя интеграцию SO с imgur?   -  person r2evans    schedule 27.03.2019
comment
Что-то вроде этого? gis.stackexchange.com /вопросы/133625/   -  person Roman Luštrik    schedule 27.03.2019
comment
Я добавил скриншот, надеюсь, он работает.   -  person review    schedule 27.03.2019


Ответы (1)


R имеет пакет «геосфера» для расчета расстояний с учетом долготы и широты двух точек. Эта задача заключается в расчете того, какие пассажиры находятся в пределах 20 метров от каждой станции.

library(geosphere)
#create dataframe of data, first column longitude, second latitude 
subway<-data.frame(SubwayStation_long, SubwayStation_lat)
passagier<-data.frame(Passagier_long, Passagier_lat)

#proceed row by row and caluclate the distance between the station and each passenger
#return TRUE if the distance is within 20 meters
#first column of output goes with first row of station data.
within20m<-apply(subway, 1, function(x){distGeo(x, passagier)<20})

#number within 20 meters of each station
colSums(within20m)

Пример вывода инструкции применения.

       [,1]  [,2]
 [1,]  TRUE FALSE
 [2,] FALSE FALSE
 [3,]  TRUE FALSE
 [4,]  TRUE FALSE
 [5,]  TRUE FALSE
 [6,] FALSE FALSE
 [7,] FALSE  TRUE
 [8,] FALSE  TRUE
 [9,] FALSE  TRUE
[10,]  TRUE FALSE
[11,] FALSE  TRUE
[12,] FALSE  TRUE

Это должно обеспечить приемлемую производительность для разумного количества станций и пассажиров. Если у вас большое количество станций и большое количество пассажиров, это решение будет иметь проблемы с производительностью, и вам потребуются другие инструменты и методы.

person Dave2e    schedule 27.03.2019
comment
Спасибо за быстрый ответ! Это хорошая идея, но у меня много станций и пассажиров. - person review; 28.03.2019
comment
Если это так, то я бы предложил использовать метод алгоритма «разделяй и властвуй», чтобы свести проблему к ряду управляемых проблем. - person Dave2e; 28.03.2019