【问题标题】:How to check how many points are in a specific polygon?如何检查特定多边形中有多少点?
【发布时间】:2020-06-17 15:34:24
【问题描述】:

我对 R 很陌生,并且正在从事一个项目,我想在该项目中绘制纽约的热图,绘制不同出租车区的出租车/优步乘坐的接送地点。 我有一个包含 98k 行坐标的数据集,定义了纽约市 263 个不同的出租车区。此外,我有一个 df,其中包含 2010 年 7 月以来的所有取货地点,大约有 1450 万个地点。我想检查哪个位置位于哪个 Taxizone 中,并将每个 Taxizone 中开始的行程数相加,以将其绘制成热图。 这是我目前正在处理的代码,但列“TripsCountPerId”没有增加,我认为循环需要很长时间才能处理 1500 万行。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 是包含 2010 年 7 月纽约市行程的数据框,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")
  }
} 

【问题讨论】:

  • i 切换到外部循环并计算as.numeric(unlist(ZoneList[i,"lat"][[1]]))(例如,因为它们似乎只依赖于 i 和外部数据)每 i 一次(现在限制为 ~263)可能会降低实际C 成本。当然,这并没有解决更大的复杂性,甚至没有解决“原始问题”。
  • 您可能只需要遍历区域,而不需要遍历数据行。请说明point.in.polygon 来自哪个包。
  • 嗨@Axeman,我在我的问题中编辑了它。它来自 sp 包,但我愿意使用不同的包

标签: r loops ggplot2 polygon


【解决方案1】:

我想你只需要这个:

ZoneList <- list()
for (i in 1:2){
  ZoneList[[i]] <- sum(point.in.polygon(points$lat, points$long, square$lat[i],square$long[i]))
} 

point.in.polygon take 可以采用点向量,这可能比自己循环点要快得多。

【讨论】:

  • 非常感谢,我会尽快试用
猜你喜欢
  • 2014-10-10
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2015-05-16
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多