Überlagern eines räumlichen Polygons mit einem Gitter und Prüfen, in welchen Gitterelementen sich spezifische Koordinaten befinden, mit R [closed]


32

Wie kann man R verwenden, um

  1. Teilen eines Shapefiles in 200-Meter-Quadrate / Unterpolygone,
  2. Zeichnen Sie dieses Raster (inkl. ID-Nummern für jedes Quadrat) über die Originalkarte unten und
  3. Auswerten, in welchem ​​Quadrat sich bestimmte geografische Koordinaten befinden .

Ich bin ein Anfänger in GIS und dies ist vielleicht eine grundlegende Frage, aber ich habe kein Tutorial dazu in R gefunden.

Bisher habe ich ein Shapefile von NYC geladen und einige beispielhafte geografische Koordinaten aufgezeichnet.

Ich suche ein Beispiel (R-Code), wie das mit den Daten unten geht.

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

Bildbeschreibung hier eingeben


Antworten:


36

Hier ist ein Beispiel mit einem SpatialGridObjekt:

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

Jetzt können Sie die implementierte overMethode -method verwenden, um die Zellen-IDs abzurufen:

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

So zeichnen Sie das Shapefile und das Raster mit den Zellen-IDs:

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

spplot1

oder ohne Farbe / Farbschlüssel:

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


Das sieht nach einer Antwort für mich aus, aber für den Fall, dass Sie etwas anderes suchen. Probieren Sie das r-Tag in stackoverflow stackoverflow.com/search?q=R+tag
Brad Nesom

@rcs Dieser Code sieht genauso aus wie das, was ich versuche, aber mein Shapefile befindet sich in einer anderen Projektion: proj4string (DK_reg1) [1] "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" Hat jemand Vorschläge, wie man diese Shapefiles dieser Projektion in 1000 gleich große Gitterzellen aufteilt? und dann zufällig 100 davon auswählen und hervorheben?
I Del Toro

9

Der in der Frage angegebene New York-Datensatz steht nicht mehr zum Download zur Verfügung. Ich verwende den nc-Datensatz aus dem sf-Paket, um eine Lösung mit dem sf-Paket zu demonstrieren:

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)

Bildbeschreibung hier eingeben


Vielen Dank. Ich habe den Link in meiner Frage aktualisiert, um die Änderungen auf der Webseite zu korrigieren. Jetzt sollte es wieder funktionieren.
Majom

Ich muss wirklich anfangen, das sfPaket zu benutzen . Das ist fantastisch!
philiporlando

Gibt es eine einfache Möglichkeit, nur die Gitterzellen zu zeichnen, die sich mit dem Zustandspolygon schneiden?
philiporlando

st_intersection (grid_50, nc) sollte es tun
sebdalgarno

Gibt es eine Möglichkeit, dasselbe zu replizieren, aber die Punkte in der Mitte jedes Gitters, so dass ein Gitter mit dem Lat / Long als Mittelpunkt des Gitters gezeichnet wird? @Sebdalgarno
Vijay Ramesh

2

Wenn Sie sich das R-Rasterpaket nicht angesehen haben, verfügt es über Tools zum Konvertieren in / aus Vektor-GIS-Objekten, sodass Sie a) ein Raster (Raster) mit 200 x 200 m Zellen erstellen und b) es in eine Gruppe von Polygonen mit konvertieren können eine logische ID irgendeiner Art. Von dort aus würde ich mir das sp-Paket ansehen, um beim Schneiden der Punkte und des Polygonrasters zu helfen. Diese http://cran.r-project.org/web/packages/sp/vignettes/over.pdf Seite könnte ein guter Anfang sein. Wenn Sie durch die sp-Paketdokumente wandern, können Sie möglicherweise mit der SpatialGrid-Klasse beginnen und den Raster-Teil einfach vollständig überspringen.


-1

Das "GIS-Universum" ist komplex und hat viele Standards, denen Ihre Daten entsprechen müssen. Alle "GIS-Tools" arbeiten nach GIS-Standards zusammen . Alle "seriösen GIS-Daten" von heute (2014) werden in einer Datenbank gespeichert .

Die beste Möglichkeit, R in einem GIS-Kontext mit anderen FOSS- Tools zu verwenden, ist die Einbettung in SQL. Die besten Tools sind PostgreSQL 9.X (siehe PL / R ) und PostGIS .


Du antwortest:

  • So importieren / exportieren Sie Formdateien: Verwenden Sie shp2pgsqlundpgsql2shp .
  • Um „aufzuteilen eine Formdatei in 200 Metern Quadrate / Subpolygone“: siehe ST_SnapToGrid(), ST_AsRaster()etc. Wir müssen besser verstehen , Ihre Bedürfnisse in ein „Rezept“ zum Ausdruck bringen.
  • Sie sagen, dass "geografische Koordinaten gefunden werden müssen" .. vielleicht ST_Centroid()von den Quadraten (?) ... Sie können "mehr mathematisch" ausdrücken, damit ich verstehe.

... Möglicherweise benötigen Sie keine Rasterkonvertierung, sondern nur eine Matrix von Punkten mit Regurlar-Abtastung.


Ein primitiver Weg ist die Verwendung von R ohne PL / R in einem üblichen externen Compiler: Konvertieren Sie nur Ihre Polygone und exportieren Sie sie als Form oder als WKT (siehe ST_AsText). Konvertieren Sie dann Daten mit awk oder einem anderen Filter in das R-Format.


1
Danke für Ihre Hilfe. Ich würde jedoch eine Lösung vorziehen, die sich vollständig auf R und vorhandene Pakete stützt. Wenn ich die Formdatei in 200 mx 200 m Teilpolygone aufteilen kann, kann ich überprüfen, mit point.in.polygonwelchen Koordinaten sich welche Polygone befinden. Mein Problem ist, das ursprüngliche Shapefile in diese Unterpolygone aufzuteilen.
9.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.