2015-02-23 72 views
1

我有一個事件位置(經度,緯度)的大型數據框。看到下面的示例:R地圖 - 在地圖上繪製點時過濾器座標輸出

events <- structure(list(lat = c(45.464944, 40.559207, 45.956775, 44.782831, 45.810287, 35.913357, 43.423855, 45.2359, 45.526025, 41.91371, 46.340833, 40.696482, 42.367164, 41.913701, 41.89167, 46.046206, 41.108316, 45.514132, 45.688118, 37.090387, 43.446555, 41.913712, 46.614833, 45.368825, 41.892168), lon = c(9.163453, 8.321587, 12.983347, 10.886471, 9.077844, 10.560439, 6.768272, 9.23176, 9.375761, 12.466994, 6.889444, 17.316925, 13.352248, 12.466992, 12.516713, 14.497758, 16.871019, 12.056176, 9.176543, 15.293506, 6.77119, 12.466993, 15.194904, 11.110711, 12.516085)), .Names = c("lat", "lon"), row.names = c(NA, 25L), class = "data.frame") 

我想只繪製發生在特定國家(例如,意大利)的事件。

以下地塊的所有事件:

library(rworldmap) 
library(maps) 
par(mar=c(0,0,0,0)) 
plot(getMap(resolution="low"), xlim = c(14,14), ylim = c(36.8,47)) 
points(x=events$lon, y=events$lat, pch = 19, col ='red' , cex = 0.6) 

我怎樣才能篩選出屬於國家的邊界​​以外的事件?預先感謝您的幫助和支持。

+0

看看'SP :: over'。你可以用它來過濾只有特定多邊形中的點。 – hrbrmstr 2015-02-23 11:47:49

回答

3

分配多邊形映射到對象:

m = getMap(resolution="low") 

轉換事件爲sp對象 - 第一經度,緯度,然後:

pts = SpatialPoints(events[c(2,1)]) 

分配CRS:

proj4string(pts) = proj4string(m) 

情節點在任何多邊形內:

內意大利
points(pts[m,], pch = 3) 

選擇點:

it = m[m$ISO_A2 == "IT",] 
points(pts[it,], col = 'blue') 

(這使用sp::over,但幕後)

+0

謝謝。我花了整個下午嘗試'sp :: over',但總是錯過了相關的參數,我最終無處可去。這一步一步的解決方案簡單而高效。太好了! – Sal 2015-02-23 16:08:53

+0

'over'在'sp'的CRAN頁面上有一個小插曲,以補充它的文檔有點簡潔。主要的用例是空間選擇(參見上文)和聚合,兩者都可以重複使用。 – 2015-02-23 16:54:40

+0

只是想對@EdzerPebesma說+1 ......這個星期花了很多Google搜索終於偶然發現了這個簡潔的答案,這對於像我這樣的R新手來說也是有意義的。 – 2015-08-19 20:46:12