可以使用in.out
功能從mgcv
包僅選擇多邊形內部的點。你可以用它來繪製伊利諾伊州境內的點。下面的示例在邊界伊利諾伊州的矩形內添加了一個額外的點,但這不在伊利諾伊州的邊界內。
library(ggplot2)
library(mgcv)
test <- data.frame(lat=c(40, 35, 39), long=c(-89, -85, -91))
state = map_data("state")
# Limit points only to those inside Illinois
point.filter = in.out(as.matrix(state[state$region=="illinois", c("lat","long")]),
as.matrix(test))
ggplot() +
geom_polygon(data=state[state$region=="illinois", ],
aes(x=long, y=lat, group=group), fill="white", color="black") +
geom_point(data=test[point.filter, ], aes(x=long, y=lat), col="blue") +
geom_point(data=test, aes(x=long, y=lat), col="red", pch=1, size=3) +
coord_map(xlim=range(state[state$region=="illinois",]$long),
ylim=range(state[state$region=="illinois",]$lat))
您可以使用in.out
測試每一個點集是否是裏面幾個多邊形(例如,多個州)的至少一個,但在這種情況下,每個多邊形必須是由一排NA
隔開。下面是一個例子,我們測試一組點是否在連續的48個美國境內,但是使用數據框state
,每個狀態都有一個單獨的多邊形。我已經添加了兩個點,不屬於美國內部對於這個例子:
library(dplyr) # For bind_rows() function
# Add an NA row between each state
tmp=lapply(split(state[,c("lat","long","region")], state$region), function(x) {
bind_rows(list(x, data.frame(region=NA, lat=NA, long=NA)))
})
tmp = bind_rows(tmp)
# Points for testing
test <- data.frame(lat=c(40, 35, 39, -10, 20), long=c(-89, -85, -91, -89, 0))
point.filter = in.out(as.matrix(tmp[, c("lat","long")]),
as.matrix(test))
point.filter
[1] TRUE TRUE TRUE FALSE FALSE
只是好奇,爲什麼downvote? – eipi10
不是我。無論如何,謝謝你的答案!我希望解決方案會更簡單,但這將完成工作。 – moman822