Uzamsal çokgenin ızgara ile kaplanması ve hangi ızgara elemanına özel koordinatların R [kapalı] kullanılarak yerleştirildiğini kontrol etme


32

İnsan nasıl olabilir Ar kullanmak için

  1. 200 metrelik kareler / alt çokgenler içinde bir shapefile bölmek ,
  2. Bu tabloyu (her karenin kimlik numarası dahil) aşağıdaki orijinal haritaya çizin ve
  3. hangi kareye özgü coğrafi koordinatların bulunduğunu değerlendirir .

Ben CBS'de bir acemiyim ve bu belki de temel bir sorudur, ancak bunu R'de nasıl yapacağınıza ilişkin bir eğitim bulamadım.

Şimdiye kadar yaptığım şey, bir NYC şekli dosyası yüklemek ve bazı örnek coğrafi koordinatları çizmek.

Aşağıdaki verilerle bunun için nasıl bir örnek (R kodu) arıyorum.

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

görüntü tanımını buraya girin


Yanıtlar:


36

İşte bir SpatialGridnesneyi kullanarak bir örnek :

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

Şimdi over, hücre kimliklerini elde etmek için uygulanan -metod komutunu kullanabilirsiniz:

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

Şekil dosyasını ve ızgarayı hücre kimlikleriyle çizmek için:

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

spplot1

veya renk / renk tuşu olmadan:

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


Bu bana bir cevap gibi görünüyor, ancak farklı bir şey arıyorsanız diye. Stackoverflow'ta r etiketini deneyin stackoverflow.com/search?q=R+tag
Brad Nesom

@rcs bu kod aynen yapmaya çalıştığım şeye benziyor ama benim şekil dosyam farklı bir projeksiyonda: proj4string (DK_reg1) [1] "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" bu projeksiyonun bu şekil dosyalarının 1000 eşit büyüklükteki ızgara hücresine nasıl kırılabileceği konusunda herhangi bir önerisi olan var mı? ve ardından rastgele 100 tanesini seçip vurgulamak ister misiniz?
Ben Del Toro

9

Soruda sağlanan New York veri kümesi artık yüklenemez. Sf paketini kullanarak bir çözüm göstermek için sf paketindeki nc veri kümesini kullanıyorum:

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)

görüntü tanımını buraya girin


Teşekkürler. Web sayfasındaki değişiklikleri gidermek için sorumdaki bağlantıyı güncelledim. Şimdi tekrar çalışması gerekiyor.
majom

sfPaketi kullanmaya gerçekten ihtiyacım var . Bu harika!
philiporlando

Yalnızca devlet poligonuyla kesişen ızgara hücrelerini çizmenin kolay bir yolu var mı?
philiporlando

st_intersection (grid_50, nc) yapmalı
sebdalgarno

Aynı çoğaltmak için bir yol var mı, ama her ızgara ortasındaki noktaları, bu yüzden ızgara ortasına kadar en / uzun bir ızgara çiziliyor @sebdalgarno
Vijay Ramesh

2

R raster paketine bakmadıysanız, vektör GIS nesnelerine dönüştürmek için araçlara sahiptir, böylece a) 200x200m hücreli bir raster (ızgara) oluşturabilir ve b) onu bir çokgen setine dönüştürebilirsiniz bir tür mantıksal kimliği. Oradan noktalar ve poligon ızgarasının kesişmesine yardımcı olmak için sp paketine bakardım. Bu http://cran.r-project.org/web/packages/sp/vignettes/over.pdf sayfası iyi bir başlangıç ​​olabilir. Sp paketi belgelerinde dolaşarak SpatialGrid sınıfı ile başlayabilir ve sadece raster kısmını atlayabilirsiniz.


-1

"GIS evreni" karmaşıktır ve verilerinizin uyumlu olması gereken birçok standarda sahiptir. Tüm "GIS araçları", GIS standartlarına göre birlikte çalışır . Tüm "ciddi GIS verileri" bugün (2014) bir veri tabanında depolanmaktadır .

GIS bağlamında R'yi "diğer FOSS araçlarıyla " kullanmanın en iyi yolu , SQL'e gömülüdür. En iyi araçlar PostgreSQL 9.X ( PL / R'ye bakınız ) ve PostGIS'dir .


Sen cevapla:

  • Şekil dosyalarını almak / vermek için: shp2pgsqlvepgsql2shp tuşlarını kullanın .
  • To "200 metre kareler / alt çokgenler bir şekil dosyası bölme": bkz ST_SnapToGrid(), ST_AsRaster()vb Biz daha iyi bir "reçete" ifade edilmeye ihtiyaçlarınızı anlamamıza gerek yoktur.
  • "coğrafi koordinatların bulunduğunu" söylüyorsun diyebilirsin ... belki ST_Centroid()karelerden (?) ... "Daha matematiksel olarak" ifade edebilirsin, ben de anlıyorum.

... Belki herhangi bir raster dönüştürmeye ihtiyacınız yoktur, sadece regurlar örneklenmiş noktaların bir matrisidir.


İlkel bir yol, normal bir harici derleyicide PL / R'siz R'yi kullanmaktır : sadece çokgenlerinizi dönüştürün ve şekli veya WKT olarak dışa aktarın (bkz. ST_AsText), Sonra verileri awk veya başka bir filtre ile R formatına dönüştürün.


1
Yardımın için teşekkürler. Ancak, tamamen R'ye ve mevcut paketlere dayanan bir çözümü şiddetle tercih ederim. Şekil dosyasını 200m * 200m point.in.polygonalt poligonlara böldüğümde hangi koordinatların hangi poligonlarda olduğunu kontrol edebilirim . Benim sorunum orjinal şekil dosyasını bu alt çokgenlere bölmektir.
majom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.