我有一個sf
對象,其中包含通過.shp
文件獲取的城市區域的多邊形信息(選區)。對於給定的經緯度對,我想確定它屬於哪個分區。我在想我可以利用sf::st_contains()
,但我無法以正確的格式獲取緯度/經度。如何通過sf找到點屬於哪個多邊形
3
A
回答
0
在lon/lat上使用st_point()
,那麼它可以與其他sf
函數一起使用。
例子:
find_precinct <- function(precincts, point) {
precincts %>%
filter(st_contains(geometry, point) == 1) %>%
`[[`("WARDS_PREC")
}
ggmap::geocode("nicollet mall, st paul") %>%
rowwise() %>%
mutate(point = c(lon, lat) %>%
st_point() %>%
list(),
precinct = find_precinct(msvc_precincts, point)
)
+1
任何方式以矢量化的方式做到這一點,即不是'rowwise'? – RoyalTS
1
反應遲緩,正在尋找一個答案自己。
結束了與此:
library(sf)
library(tidyverse)
nc = st_read(system.file("shape/nc.shp", package="sf"),
stringsAsFactors = FALSE)
d <-
data_frame(lon = runif(1e3, -84.5, -75.5),
lat = runif(1e3, 34, 36.6),
somevariable = rnorm(1e3, 1000, 100))
geo_inside <- function(lon, lat, map, variable) {
variable <- enquo(variable)
# slow if lots of lons and lats or big sf - needs improvement
pt <-
tibble::data_frame(x = lon,
y = lat) %>%
st_as_sf(coords = c("x", "y"), crs = st_crs(map))
pt %>% st_join(map) %>% pull(!!variable)
}
d <-
d %>%
mutate(county = geo_inside(lon, lat, nc, NAME))
glimpse(d)
Observations: 1,000
Variables: 4
$ lon <dbl> -79.68728, -79.06104, -83.92082, -76.36866, -75.8635...
$ lat <dbl> 36.11349, 35.67239, 35.08802, 35.78083, 36.55786, 34...
$ somevariable <dbl> 910.9803, 1010.6816, 919.3937, 924.0845, 1154.0975, ...
$ county <chr> "Guilford", "Chatham", "Cherokee", "Tyrrell", NA, NA...
d %>%
ggplot() +
geom_sf(data = nc) +
geom_point(aes(lon, lat, colour = county)) +
theme(legend.position = "none")
不滿意雖然速度快,但似乎做的工作。
Einar
0
這可以是「向量化的」。這裏有一個例子:
library(sf)
library(tidyverse)
新加坡shape文件:
singapore <- st_read("~/data/master-plan-2014-subzone-boundary-no-sea-shp/MP14_SUBZONE_NO_SEA_PL.shp", quiet=TRUE, stringsAsFactors=FALSE)
singapore <- st_transform(singapore, 4326)
回收中心的CSV:
centers <- read_csv("~/data/recycl.csv")
glimpse(centers)
## Observations: 407
## Variables: 10
## $ lng <dbl> 104.0055, 103.7677, 103.7456, 103.7361, 103.8106, 103.962...
## $ lat <dbl> 1.316764, 1.296245, 1.319204, 1.380412, 1.286512, 1.33355...
## $ inc_crc <chr> "F8907D68D7EB64A1", "ED1F74DC805CEC8B", "F48D575631DCFECB...
## $ name <chr> "RENEW (Recycling Nation's Electronic Waste)", "RENEW (Re...
## $ block_house_num <chr> "10", "84", "698", "3", "2", "1", "1", "1", "357", "50", ...
## $ bldg_name <chr> "Changi Water Reclamation Plant", "Clementi Woods", "Comm...
## $ floor <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ post_code <int> 498785, 126811, 608784, 689814, 159047, 486036, 39393, 55...
## $ street <chr> "Changi East Close", "West Coast Road , Clementi Woods Co...
## $ unit <chr> "(Lobby)", "#B1-01 (Management Office)", "(School foyer)"...
打開^^到一個簡單的對象特點:
map2(centers$lng, centers$lat, ~st_point(c(.x, .y))) %>%
st_sfc(crs = 4326) %>%
st_sf(centers[,-(1:2)], .) -> centers_sf
這可能比行方式更快OP但我會讓別人有樂趣的標杆:
bind_cols(
centers,
singapore[as.numeric(st_within(centers_sf, singapore)),]
) %>%
select(lng, lat, inc_crc, subzone_name=SUBZONE_N) %>%
mutate(subzone_name = str_to_title(subzone_name))
## # A tibble: 407 x 4
## lng lat inc_crc subzone_name
## <dbl> <dbl> <chr> <chr>
## 1 104.0055 1.316764 F8907D68D7EB64A1 Changi Airport
## 2 103.7677 1.296245 ED1F74DC805CEC8B Clementi Woods
## 3 103.7456 1.319204 F48D575631DCFECB Teban Gardens
## 4 103.7361 1.380412 1F910E0086FD4798 Peng Siang
## 5 103.8106 1.286512 55A0B9E7CBD34AFE Alexandra Hill
## 6 103.9624 1.333555 C664D09D9CD5325F Xilin
## 7 103.8542 1.292778 411F79EAAECFE609 City Hall
## 8 103.8712 1.375876 F4516742CFD4228E Serangoon North Ind Estate
## 9 103.8175 1.293319 B05B32DF52D922E7 Alexandra North
## 10 103.9199 1.335878 58E9EAF06206C772 Bedok Reservoir
## # ... with 397 more rows
相關問題
- 1. 兩個多邊形之間的點如何找到它屬於哪個?
- 2. 找到哪個多邊形地址在
- 3. 如何在多邊形內找到點?
- 4. MongoDB如何查找哪個多邊形包含指定的點?
- 5. 找到地圖中的點在哪個多邊形中
- 6. CGAL:找到一個點屬於哪個面/三角形?
- 7. 如何確定多邊形邊的哪一側位於多邊形內部,哪個位於外部?
- 8. 不屬於多邊形的點
- 9. 如何通過kineticjs中的某個點拉線/多邊形?
- 10. Python:找到點是否位於多邊形的邊界上
- 11. 用於多個多邊形的點多邊形算法
- 12. 我如何找到從一個點到該多邊形的多邊形上的最短點(不是距離)
- 13. 如何在不規則多邊形內找到一個點
- 14. 如何找到遠離某個多邊形的所有點?
- 15. 如何通過C++找出當前用戶屬於哪個組?
- 16. 如何找到一個點位於一條線或多邊形內
- 17. 給定一組多邊形和一系列點,找出哪些多邊形是位於的點
- 18. 通過屬性查找多邊形Google地圖引擎
- 19. 如何找到節點在drupal中屬於哪個菜單
- 20. 通過LDAP搜索找到哪個組x用戶屬於PHP
- 21. PostGIS:通過邊界過濾多邊形
- 22. 如何找到多邊形的中心?
- 23. 如何找到,如果點在內部多邊形d3.js
- 24. 如何使用sf :: st_centroid來計算多邊形的質心?
- 25. 如何使用boost /?在多邊形中找到自交點?
- 26. 如何從一組線中找到包圍點的多邊形?
- 27. 確定哪些多邊形的點是從一個大組多邊形
- 28. 如何找到位於多邊形凸包的輪廓上的所有點(Matlab)
- 29. 如何找出多邊形中邊,面,頂點的數量
- 30. 如何找到在谷歌地圖選擇哪個多邊形api
我發現好運氣使用'SP :: point.in.polygon'(雖然只是'sp',不能以'sf')。 – r2evans
如果您提供了一些示例數據,那麼也可以更容易地幫助您 – SymbolixAU
,在兩個'sf'對象上使用'sf :: st_join()'。您可以指定'join'函數爲'st_within'來獲取多邊形中的點,並且它也會返回一個'sf'對象。 – SymbolixAU