簡體   English   中英

查找地圖中的點在哪個多邊形中

[英]Find in which polygon the points in a map are

我有一個shapefile城市,它為我提供了它的地圖,並完美地除以“正方形”。 我還可以使用ggplot2包中的fortify函數將這個shapefile轉換為簡單的ggplot2 到現在為止還挺好。

他們有一個數據集,其中包含12.000個地址,所有這些地址均來自該城市,並且每個地址的正確緯度和經度以及其他變量(例如收入/地址)。 但是我沒有的是每種地址屬於哪個正方形的信息。 當我繪制地圖時,一層帶有shapefile,另一層帶有代表收入的點,其濃度非常清楚。 但是我想要每個地址落入哪個位置的確切信息。

現在,我將嘗試用一些數據進行更多說明。 假設我們有這樣的東西:

lat <- 5:12
long <- c(9, 10, 11, 11, 12, 12, 13, 12)
square <- c("SQ1", "SQ1", "SQ2", "SQ2", "SQ2", "SQ3", "SQ3", "SQ3")
cbind(lat, long, square) 

(非常虛假的數據)

結果是:

     lat  long square
[1,] "5"  "9"  "SQ1" 
[2,] "6"  "10" "SQ1" 
[3,] "7"  "11" "SQ2" 
[4,] "8"  "11" "SQ2" 
[5,] "9"  "12" "SQ2" 
[6,] "10" "12" "SQ3" 
[7,] "11" "13" "SQ3" 
[8,] "12" "12" "SQ3"

如果我有一個觀測值,例如lat = 5.5long = 9.5 ,那么我知道這是一個落入方格1(“ SQ1”)的點,因為它位於經度和緯度的間隔內,因此成為該方格的邊界。 答:這就是我想在數據集中找到的內容。

我一直在尋找答案已有一段時間了,到目前為止我什么都沒有。 我真的相信某些軟件包必須已經執行了此操作,但是我還沒有找到它,或者我必須已經找到了類似的解決方案並且無法擴展到我的案例中。 希望我已經很好地解釋了。 有人建議嗎?

很高興得知您成功將大部分地址轉換為地理坐標。 現在,給出您的示例數據

lat <- 5:12
long <- c(9, 10, 11, 11, 12, 12, 13, 12)
square <- c("SQ1", "SQ1", "SQ2", "SQ2", "SQ2", "SQ3", "SQ3", "SQ3")
df <- cbind.data.frame(long, lat, square) 

R的空間數據表示形式,例如:

lst <- split(df[,-3], df[,3])
polys <- lapply(seq_along(lst), function(x) Polygons(list(Polygon(lst[[x]])), names(lst)[x]))
spolys <- SpatialPolygons(polys)
spoint <- SpatialPoints(cbind(long = 11.5, lat = 8))

plot(spolys)
plot(spoint, add=T, col="red")

您可以使用sp::over / %over%來查看,哪些點屬於哪個多邊形。 在上面的示例中,空間點#1落入空間多邊形SQ2:

spoint %over% spolys
# 1 
# 2 

或具有多個點,例如,空間點#1落入空間多邊形SQ2,而空間點#2落入空間多邊形SQ3:

spoints <- SpatialPoints(data.frame(long = c(11.5,12.5), lat = c(8,11)))
plot(spoints, add=T, col="blue")
spoints %over% spolys
# 1 2 
# 2 3

還要查看幫助?sp::over及其小插圖:當左側為“ SpatialPoints”類型,而右側為“ SpatialPolygons”類型時,則over

返回長度等於點數的數字矢量; 數字是點所在的y多邊形的索引(數字); NA表示該點不屬於多邊形; 如果一個點落在多個多邊形中,則記錄最后一個多邊形。

我還建議您查看https://gis.stackexchange.com中的此類問題。

這是另一種解決方案,僅使用來自sp point.in.polygon 唯一的麻煩是,此示例中的“多邊形”僅作為角點給出,因此必須將其轉換為所有四個點的坐標(因此,long的c()和rev(long)的坐標)。

df <- read.table(text="long lat square
9   5    SQ1
10   6    SQ1
11   7    SQ2
11   8    SQ2
12   9    SQ2
12  10    SQ3
13  11    SQ3
12  12    SQ3", header=TRUE)

dfsp <- split(df, df$square)
library(sp)

sapply(dfsp, function(x)point.in.polygon(9.5, 5.5, 
   c(x$long,rev(x$long)), rep(x$lat, each=2)))

給點(9.5,5.5)所屬的平方為1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM