Sovrapponendo il poligono spaziale con la griglia e controllando in quali coordinate specifiche dell'elemento della griglia si trovano usando R [chiuso]


32

Come si può usare R per

  1. dividere un file di forma in quadrati / sotto-poligoni di 200 metri,
  2. tracciare questa griglia (incl. numeri ID per ogni quadrato) sulla mappa originale in basso, e
  3. valutare in quali coordinate geografiche specifiche si trovano .

Sono un principiante in GIS e questa è forse una domanda di base, ma non ho trovato un tutorial su come farlo in R.

Quello che ho fatto finora è stato caricare uno shapefile di New York e tracciare delle coordinate geografiche esemplari.

Sto cercando un esempio (codice R) come farlo con i dati di seguito.

# 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")

inserisci qui la descrizione dell'immagine


Risposte:


36

Ecco un esempio usando un SpatialGridoggetto:

### 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
# ...

Ora puoi usare il overmetodo implementato per ottenere gli ID cella:

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

Per tracciare lo shapefile e la griglia con gli ID cella:

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

spplot1

o senza chiave colore / colore:

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


Questa mi sembra una risposta, ma nel caso tu stia cercando qualcosa di diverso. Prova il tag r in stackoverflow stackoverflow.com/search?q=R+tag
Brad Nesom

@rcs questo codice sembra proprio quello che sto cercando di fare ma il mio shapefile è in una proiezione diversa: proj4string (DK_reg1) [1] "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" qualcuno ha qualche suggerimento su come suddividere questi shapefile di questa proiezione in 1000 celle della griglia di uguali dimensioni? e quindi selezionarne a caso 100 ed evidenziarle?
I Del Toro,

9

Il set di dati di New York fornito nella domanda non è più disponibile per il download. Uso il set di dati nc dal pacchetto sf per dimostrare una soluzione usando il pacchetto 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)

inserisci qui la descrizione dell'immagine


Grazie. Ho aggiornato il link nella mia domanda per correggere le modifiche sulla loro pagina web. Ora dovrebbe funzionare di nuovo.
maggio

Ho davvero bisogno di iniziare a usare il sfpacchetto. Questo e spettacolare!
philiporlando,

Esiste un modo semplice per tracciare solo le celle della griglia che si intersecano con il poligono di stato?
philiporlando,

st_intersection (grid_50, nc) dovrebbe farlo
sebdalgarno

C'è un modo per replicare lo stesso, ma i punti al centro di ogni griglia, quindi una griglia viene disegnata con il lat / long come il centro della griglia @sebdalgarno
Vijay Ramesh

2

Se non hai guardato il pacchetto R raster, ha strumenti per convertire in / da oggetti GIS vettoriali, quindi dovresti essere in grado di a) creare un raster (griglia) con celle 200x200m eb) convertirlo in un insieme di poligoni con un id logico di qualche tipo. Da lì guarderei il pacchetto sp per aiutare a intersecare i punti e la griglia poligonale. Questa pagina http://cran.r-project.org/web/packages/sp/vignettes/over.pdf potrebbe essere un buon inizio. Girovagando tra i documenti del pacchetto sp potresti essere in grado di iniziare con la classe SpatialGrid e saltare completamente la parte raster.


-1

L '"universo GIS" è complesso e ha molti standard che i tuoi dati devono essere conformi. Tutti gli "strumenti GIS" interagiscono secondo gli standard GIS . Tutti i "dati GIS seri" oggi (2014) sono archiviati in un database .

Il modo migliore per "usare R" in un contesto GIS, con altri strumenti FOSS , è incorporato in SQL. Gli strumenti migliori sono PostgreSQL 9.X (vedi PL / R ) e PostGIS .


Tu rispondi:

  • Per importare / esportare file di forme: usare shp2pgsqlepgsql2shp .
  • Per "dividere un file di forma in 200 metri quadrati / sub-poligoni": si veda ST_SnapToGrid(), ST_AsRaster()ecc Abbiamo bisogno di comprendere meglio le esigenze per esprimere in una "ricetta".
  • dici che hai bisogno di "coordinate geografiche localizzate" .. forse ST_Centroid()dei quadrati (?) ... Puoi esprimere "più matematicamente" così capisco.

... Forse non hai bisogno di alcuna conversione raster, ma solo una matrice di punti campionati da rigeneranti.


Un modo primitivo è usare R senza PL / R , in un normale compilatore esterno: converti solo i tuoi poligoni ed esporta come forma o come WKT (vedi ST_AsText), quindi converti i dati con awk o un altro filtro nel formato R.


1
Grazie per l'aiuto. Tuttavia, preferirei fortemente una soluzione che si basa completamente su R e pacchetti esistenti. Quando sono in grado di dividere il file di forma in subpolygons 200m * 200m posso verificare con point.in.polygonquali coordinate si trovano in quali poligoni. Il mio problema è dividere lo shapefile originale in quei sub-poligoni.
Maj
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.