Nakładanie wielokąta przestrzennego z siatką i sprawdzanie, w których lokalizacjach współrzędne są określone za pomocą R [zamknięty]

32

Jak można użyć R do

  1. podziel plik kształtu na 200 metrów kwadratowych / sub-wielokątów,
  2. narysuj tę siatkę (w tym numery identyfikacyjne każdego kwadratu) na oryginalnej mapie poniżej, oraz
  3. ocenić, w którym kwadracie znajdują się współrzędne geograficzne .

Jestem początkującym w GIS i jest to może podstawowe pytanie, ale nie znalazłem samouczka, jak to zrobić w R.

Do tej pory robiłem ładowanie pliku kształtu NYC i wykreślanie przykładowych współrzędnych geograficznych.

Szukam przykładu (kod R), jak to zrobić z danymi poniżej.

# Load packages 
library(maptools)

# Download shapefile for NYC
# OLD URL (no longer working)
# shpurl <- "http://www.nyc.gov/html/dcp/download/bytes/nybb_13a.zip"
shpurl <- "https://www1.nyc.gov/assets/planning/download/zip/data-maps/open-data/nybb_13a.zip"

tmp    <- tempfile(fileext=".zip")
download.file(shpurl, destfile=tmp)
files <- unzip(tmp, exdir=getwd())

# Load & plot shapefile
shp <- readShapePoly(files[grep(".shp$", files)])
plot(shp)

# Define coordinates 
points_of_interest <- data.frame(y=c(919500, 959500, 1019500, 1049500, 1029500, 989500), 
                 x =c(130600, 150600, 180600, 198000, 248000, 218000),
                 id  =c("A"), stringsAsFactors=F)

# Plot coordinates
points(points_of_interest$y, points_of_interest$x, pch=19, col="red")

wprowadź opis zdjęcia tutaj

majom
źródło
Zobacz także stackoverflow.com/q/17801398/287948
Peter Krauss

Odpowiedzi:

36

Oto przykład z użyciem SpatialGridobiektu:

### read shapefile
library("rgdal")
shp <- readOGR("nybb_13a", "nybb")

proj4string(shp)  # units us-ft
# [1] "+proj=lcc +lat_1=40.66666666666666 +lat_2=41.03333333333333 
# +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000 +y_0=0 +datum=NAD83
# +units=us-ft +no_defs +ellps=GRS80 +towgs84=0,0,0"

### define coordinates and convert to SpatialPointsDataFrame
poi <- data.frame(x=c(919500, 959500, 1019500, 1049500, 1029500, 989500),
                  y=c(130600, 150600, 180600, 198000, 248000, 218000),
                  id="A", stringsAsFactors=F)
coordinates(poi) <- ~ x + y
proj4string(poi) <- proj4string(shp)

### define SpatialGrid object
bb <- bbox(shp)
cs <- c(3.28084, 3.28084)*6000  # cell size 6km x 6km (for illustration)
                                # 1 ft = 3.28084 m
cc <- bb[, 1] + (cs/2)  # cell offset
cd <- ceiling(diff(t(bb))/cs)  # number of cells per direction
grd <- GridTopology(cellcentre.offset=cc, cellsize=cs, cells.dim=cd)
grd
# cellcentre.offset 923018 129964
# cellsize           19685  19685
# cells.dim              8      8

sp_grd <- SpatialGridDataFrame(grd,
                               data=data.frame(id=1:prod(cd)),
                               proj4string=CRS(proj4string(shp)))
summary(sp_grd)
# Object of class SpatialGridDataFrame
# Coordinates:
#      min     max
# x 913175 1070655
# y 120122  277602
# Is projected: TRUE
# ...

Teraz możesz użyć zaimplementowanej metody overdo uzyskania identyfikatorów komórek:

over(poi, sp_grd)
#   id
# 1 57
# 2 51
# 3 38
# 4 39
# 5 14
# 6 28

Aby wydrukować plik kształtu i siatkę z identyfikatorami komórek:

library("lattice")
spplot(sp_grd, "id",
       panel = function(...) {
         panel.gridplot(..., border="black")
         sp.polygons(shp)
         sp.points(poi, cex=1.5)
         panel.text(...)
       })

spplot1

lub bez koloru / klucza koloru:

library("lattice")
spplot(sp_grd, "id", colorkey=FALSE,
       panel = function(...) {
         panel.gridplot(..., border="black", col.regions="white")
         sp.polygons(shp)
         sp.points(poi, cex=1.5)
         panel.text(..., col="red")
       })

spplot2

rcs
źródło
To dla mnie wygląda na odpowiedź, ale na wypadek, gdybyś szukał czegoś innego. Wypróbuj tag r w stackoverflow stackoverflow.com/search?q=R+tag
Brad Nesom
@rcs ten kod wygląda dokładnie tak, jak próbuję to zrobić, ale mój plik kształtu jest w innej projekcji: proj4string (DK_reg1) [1] "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" czy ktoś ma jakieś sugestie, jak rozbić te pliki kształtu tej projekcji na 1000 równych komórek siatki? a następnie losowo wybierz 100 z nich i wyróżnij je?
I Del Toro,
9

Zestaw danych z Nowego Jorku podany w pytaniu nie jest już dostępny do pobrania. Korzystam z zestawu danych nc z pakietu sf, aby zademonstrować rozwiązanie za pomocą pakietu sf:

library(sf)
library(ggplot2)

# read nc polygon data and transform to UTM 
nc <- st_read(system.file('shape/nc.shp', package = 'sf')) %>%
  st_transform(32617)

# random sample of 5 points
pts <- st_sample(nc, size = 5) %>% st_sf

# create 50km grid - here you can substitute 200 for 50000
grid_50 <- st_make_grid(nc, cellsize = c(50000, 50000)) %>% 
  st_sf(grid_id = 1:length(.))

# create labels for each grid_id
grid_lab <- st_centroid(grid_50) %>% cbind(st_coordinates(.))

# view the sampled points, polygons and grid
ggplot() +
  geom_sf(data = nc, fill = 'white', lwd = 0.05) +
  geom_sf(data = pts, color = 'red', size = 1.7) + 
  geom_sf(data = grid_50, fill = 'transparent', lwd = 0.3) +
  geom_text(data = grid_lab, aes(x = X, y = Y, label = grid_id), size = 2) +
  coord_sf(datum = NA)  +
  labs(x = "") +
  labs(y = "")

# which grid square is each point in?
pts %>% st_join(grid_50, join = st_intersects) %>% as.data.frame

#>   grid_id                 geometry
#> 1      55 POINT (359040.7 3925435)
#> 2      96   POINT (717024 4007464)
#> 3      91 POINT (478906.6 4037308)
#> 4      40 POINT (449671.6 3901418)
#> 5      30 POINT (808971.4 3830231)

wprowadź opis zdjęcia tutaj

sebdalgarno
źródło
Dzięki. Zaktualizowałem link w moim pytaniu, aby przywrócić zmiany na ich stronie internetowej. Teraz powinno znów działać.
majom
Naprawdę muszę zacząć korzystać z sfpakietu. To jest niesamowite!
philiporlando
Czy istnieje prosty sposób na wykreślenie tylko komórek siatki, które przecinają się z wielokątem stanu?
philiporlando
st_intersection (grid_50, nc) powinien to zrobić
Sebdalgarno
Czy istnieje sposób, aby powtórzyć to samo, ale punkty w środku każdej siatki, więc siatka jest rysowana z łaciną / długością jako środek siatki @sebdalgarno
Vijay Ramesh
2

Jeśli nie spojrzałeś na pakiet rastrowy R, ma on narzędzia do konwersji na / z wektorowych obiektów GIS, więc powinieneś być w stanie a) utworzyć raster (siatkę) z komórkami 200x200m ib) przekonwertować go na zestaw wielokątów z jakiś logiczny identyfikator. Stamtąd patrzyłbym na pakiet sp, aby pomóc w przecięciu punktów i siatki wielokątów. Ta http://cran.r-project.org/web/packages/sp/vignettes/over.pdf strona może być dobrym początkiem. Wędrując po dokumentach pakietu sp, możesz zacząć od klasy SpatialGrid i po prostu całkowicie pominąć część rastrową.

Cokrzys
źródło
-1

„Wszechświat GIS” jest złożony i ma wiele standardów, że dane muszą być zgodne. Wszystkie „narzędzia GIS” współpracują ze standardami GIS . Wszystkie „poważne dane GIS” dzisiaj (2014) są przechowywane w bazie danych .

Najlepszym sposobem „użycia R” w kontekście GIS, z innymi narzędziami FOSS , jest osadzenie w SQL. Najlepsze narzędzia to PostgreSQL 9.X (patrz PL / R ) i PostGIS .


Ty odpowiedz:

  • Aby importować / eksportować pliki kształtów: użyj shp2pgsqlipgsql2shp .
  • Aby „podzielić plik kształtu w 200 metrowych kwadratów / sub-wielokątów”: patrz ST_SnapToGrid(), ST_AsRaster()itp Musimy lepiej zrozumieć Twoje potrzeby, aby wyrazić w „receptury”.
  • mówisz, że potrzebujesz „współrzędnych geograficznych”… być może ST_Centroid()kwadratów (?)… Możesz wyrazić „bardziej matematycznie”, więc rozumiem.

... Być może nie potrzebujesz żadnej konwersji rastrowej, tylko matrycę punktów próbkowanych regurlarowo.


Prymitywnym sposobem jest użycie R bez PL / R w zwykłym zewnętrznym kompilatorze: konwertuj tylko wielokąty i eksportuj jako kształt lub jako WKT (patrz ST_AsText), a następnie konwertuj dane z awk lub innym filtrem do formatu R.

Peter Krauss
źródło
1
Dzięki za pomoc. Jednak zdecydowanie wolałbym rozwiązanie, które całkowicie opiera się na R i istniejących pakietach. Kiedy jestem w stanie podzielić plik kształtu na subpoligony 200m * 200m, mogę sprawdzić, z point.in.polygonktórymi współrzędnymi są poszczególne wielokąty. Moim problemem jest podzielenie oryginalnego pliku kształtu na te pod-wielokąty.
majom