Как проверить, сколько точек находится в заданном многоугольнике c? - PullRequest
2 голосов
/ 17 июня 2020

Я новичок в R и работаю над проектом, в котором я хочу нарисовать тепловую карту Нью-Йорка, отображающую пункты посадки из такси / Uber в разных зонах такси. У меня есть набор данных из 98 тыс. Строк с координатами, определяющих 263 различных зоны такси Нью-Йорка C. Кроме того, у меня есть df, содержащий все пункты выдачи с июля 2010 года, а это около 14,5 миллионов пунктов. Я хочу проверить, какое Location находится в какой Taxizone, и просуммировать количество поездок, начатых в каждой Taxizone, чтобы нанести это на тепловую карту. Это код, над которым я сейчас работаю, но столбец «TripsCountPerId» не увеличивается, и я думаю, что l oop займет очень много времени для 15 миллионов строк. Функция point.in.polygon взята из пакета sp. Вероятно, существуют другие функции, выполняющие аналогичные действия, и я готов их использовать.

for (row in 1:nrow(tlc1007)) {    
  point.x = tlc1007[row,"latPu"]
  point.y = tlc1007[row, "longPu"]
  for (i in 1:nrow(ZoneList)){
    if (point.in.polygon(point.x,point.y,as.numeric(unlist(ZoneList[i,"lat"][[1]])),as.numeric(unlist(ZoneList[i,"long"][[1]])))){
      ZoneList$TripsCountPerId[i]  <- ZoneList$TripsCountPerId[i] +1
    }
    if (i%%100000==0){
      print(paste(i," rows checked"))
    }
  }
} 

tlc1007 - это фрейм данных, содержащий поездки в Нью-Йорке C в июле 2010 года, а ZoneList содержит координаты для каждой Taxizone . Я создал столбец TripsCountPerId, чтобы иметь сумму поездок для каждой Taxizone, потому что с этого момента я могу легче построить карту.

Для вашего понимания я попытался построить простой пример, который немного отличается:

library(sp)
library(dplyr)

lat <- c(0,2)
long <- c(0,2)
square <- as.data.frame(cbind(lat,long))
point1 <- c(1,1)
point2 <- c(1,3)
points <- as.data.frame(rbind(point1,point2)) %>% 
  rename("lat"="V1","long"="V2")


for (row in 1:2) {     
  point.x = points[row,"lat"]
  point.y = points[row, "long"]
  for (i in 1:2){
    if (point.in.polygon(point.x,point.y, square$lat[i],square$long[i])){
      print("TRUE") 
    } else {
      print("FALSE")
  }
} 

1 Ответ

1 голос
/ 18 июня 2020
• 1000
...