Witaj wszystkich potencjalnych pomocników,

Mam obiekt SpatialPolygonDataFrame uzyskany z pakietu tigris i chciałbym użyć go jako wielokątnego okna w tworzeniu obiektu ppp. Oto, czego próbowałem:

# Needed packages
library(spatstat)
library(sf)

# Download geospatial data for Lee county in Alabama (home of the great Auburn University by the way!)
county <- tigris::county_subdivisions(state = "Alabama", county = "Lee")

# The polygon of Lee county is subdivided, so I convert it to a single polygon after converting it to an sf object
county_sf <- st_as_sf(county)
county_one <- st_union(county_sf)

# A quick plot of the object outputs what I am expecting
plot(county_one)

Lee County, AL

# Now I create a planar point pattern and I use county_one as the window
p <- ppp(x = -85.4, y = 32.5, window = as.owin((county_one)))

# But the plot here shows that the window is just a rectangle and not the polygon :(
plot(p)

ppp object

Dziękuję za pomoc.

4
SavedByJESUS 5 styczeń 2020, 07:39

2 odpowiedzi

Najlepsza odpowiedź

Uwaga: Edytowałem tę odpowiedź, aby zawierać pełne szczegóły.

Jak @Timsalabim wspomina jest to właśnie w sf, ale do tego czasu musisz Przejdź przez stare klasy sp, takie jak SpatialPolygons. Użyj czegoś podobnego do as_Spatial w sf, a następnie załaduj maptools i użyj as.owin lub as(x, "owin") Obiekt Spatial.

Ponadto można używać tylko współrzędnych w Platear (przewidywane) przestrzeń spatstat i nie koordynuje na zakrzywionej powierzchni Ziemi. Ty masz do projektu do odpowiedniego systemu koordynatorów płaskich. Może i epsg.io/6345> jest w tym przypadku użyteczne. Aby projektować do tego układu współrzędnych sf::st_transform(county_one, crs = 6345). Potem przekonwertujesz na Spatial, a następnie owin. Uwaga: Wybór odpowiedniej projekcji jest nauka, a ja nie wiem zbyt wiele, więc czy chcesz, jeśli chcesz Aby upewnić się, że nie otrzymasz zbytnianych wyników.

W szczególności z oryginalnym przykładem możesz zrobić:

# Needed packages
library(spatstat)
#> Loading required package: spatstat.data
#> Loading required package: nlme
#> Loading required package: rpart
#> 
#> spatstat 1.62-2       (nickname: 'Shape-shifting lizard') 
#> For an introduction to spatstat, type 'beginner'
library(sf)
#> Linking to GEOS 3.8.0, GDAL 3.0.2, PROJ 6.2.1
library(maptools)
#> Loading required package: sp
#> Checking rgeos availability: TRUE
library(tigris)
#> To enable 
#> caching of data, set `options(tigris_use_cache = TRUE)` in your R script or .Rprofile.
#> 
#> Attaching package: 'tigris'
#> The following object is masked from 'package:graphics':
#> 
#>     plot

county <- county_subdivisions(state = "Alabama", county = "Lee", class = "sf", progress_bar = FALSE)
county_one <- st_union(county)
plot(county_one)

county_flat <- st_transform(county_one, crs = 6345)
plot(county_flat)

county_owin <- as.owin(as_Spatial(county_flat))

100 losowych punktów w hrabstwie:

p <- runifpoint(100, win = county_owin)
plot(p)

7
Ege Rubak 6 styczeń 2020, 16:50

Wystarczy zarejestrować się tutaj, że metody przymusu dla klas SF są teraz zarejestrowane (jeśli to prawe słowo) przez pakiet SF. Nie rozumiem w pełni, że magia, która znajduje metody, ale działa.

library(sf)
library(spatstat)

> methods(as.owin)
 [1] as.owin.boxx                    as.owin.data.frame              as.owin.default                 as.owin.distfun                
 [5] as.owin.dppm                    as.owin.funxy                   as.owin.im                      as.owin.influence.ppm          
 [9] as.owin.kppm                    as.owin.layered                 as.owin.leverage.ppm            as.owin.linfun                 
[13] as.owin.linnet                  as.owin.lintess                 as.owin.lpp                     as.owin.lppm                   
[17] as.owin.msr                     as.owin.MULTIPOLYGON*           as.owin.nnfun                   as.owin.owin                   
[21] as.owin.POLYGON*                as.owin.ppm                     as.owin.ppp                     as.owin.psp                    
[25] as.owin.quad                    as.owin.quadratcount            as.owin.quadrattest             as.owin.rmhmodel               
[29] as.owin.sf*                     as.owin.sfc*                    as.owin.sfc_MULTIPOLYGON*       as.owin.sfc_POLYGON*           
[33] as.owin.SpatialGridDataFrame*   as.owin.SpatialPixelsDataFrame* as.owin.SpatialPolygons*        as.owin.tess                   
see '?methods' for accessing help and source code

Zastanawiając się więc, że prawidłowo przewiduje swoje dane (jak wspomniano o @ege Rubak), wywołanie as.owin bezpośrednio powinno pracować:

library(tigris)

county <- county_subdivisions(state = "Alabama", 
                              county = "Lee", 
                              class = "sf", 
                              progress_bar = FALSE)

county <- st_union(county)

county <- st_transform(county, crs = 6345)

window <- as.owin(county)

plot(window)

enter image description here

1
Blake 1 październik 2020, 15:22