รูปหลายเหลี่ยมเชิงพื้นที่ซ้อนทับพร้อมกริดและการตรวจสอบว่าพิกัดตำแหน่งขององค์ประกอบกริดนั้นอยู่ที่ใดโดยใช้ R [ปิด]


32

วิธีหนึ่งสามารถใช้ Rเพื่อ

  1. แยก Shapefileใน 200 เมตรสี่เหลี่ยม / รูปหลายเหลี่ยมย่อย
  2. พล็อตกริดนี้ (รวมถึงหมายเลข ID สำหรับแต่ละช่อง) เหนือแผนที่ดั้งเดิมด้านล่างและ
  3. ประเมินว่าพิกัดทางภูมิศาสตร์เฉพาะของรูปสี่เหลี่ยมจัตุรัสตั้งอยู่ที่ไหน

ฉันเป็นผู้เริ่มต้นใน GIS และนี่อาจเป็นคำถามพื้นฐาน แต่ฉันไม่พบบทเรียนเกี่ยวกับวิธีการทำเช่นนี้ใน R

สิ่งที่ฉันทำไปแล้วคือการโหลดรูปร่างไฟล์ของ NYC และวางแผนพิกัดทางภูมิศาสตร์ที่เป็นแบบอย่าง

ฉันกำลังมองหาตัวอย่าง (รหัส R) วิธีการนี้ด้วยข้อมูลด้านล่าง

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

ป้อนคำอธิบายรูปภาพที่นี่


คำตอบ:


36

นี่คือตัวอย่างการใช้SpatialGridวัตถุ:

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

ตอนนี้คุณสามารถใช้วิธีการoverเพื่อรับรหัสเซลล์:

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

ในการพล็อต Shapefile และกริดด้วยเซลล์ ID:

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

spplot1

หรือไม่มีปุ่มสี / สี:

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


ดูเหมือนว่าคำตอบสำหรับฉัน แต่ในกรณีที่คุณกำลังมองหาบางอย่างที่แตกต่าง ลองใช้แท็ก r ใน stackoverflow stackoverflow.com/search?q=R+tag
Brad Nesom

@cs รหัสนี้ดูเหมือนกับสิ่งที่ฉันพยายามทำ แต่รูปร่างไฟล์ของฉันอยู่ในการฉายภาพที่แตกต่างกัน: proj4string (DK_reg1) [1] "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0" ไม่มีใครมีข้อเสนอแนะเกี่ยวกับวิธีที่จะทำลายรูปร่างของไฟล์นี้ของการฉายนี้ถึง 1,000 กริดเซลล์ขนาดเท่ากันหรือไม่ จากนั้นเลือก 100 รายการแบบสุ่มและไฮไลต์ได้อย่างไร
ฉัน Del Toro

9

ชุดข้อมูล New York ที่ระบุในคำถามนี้ไม่สามารถดาวน์โหลดได้อีกต่อไป ฉันใช้ชุดข้อมูล nc จากแพ็คเกจ sf เพื่อสาธิตวิธีใช้ 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)

ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณ ฉันอัปเดตลิงก์ในคำถามของฉันเพื่อแก้ไขการเปลี่ยนแปลงบนหน้าเว็บของพวกเขา ตอนนี้มันควรจะทำงานอีกครั้ง
majom

ฉันต้องเริ่มใช้sfแพ็คเกจจริงๆ นี่มันเจ๋งมาก!
philiporlando

มีวิธีง่าย ๆ ในการพล็อตเซลล์กริดที่ตัดกันกับรูปหลายเหลี่ยมของรัฐหรือไม่?
philiporlando

st_intersection (grid_50, nc) ควรทำมัน
sebdalgarno

มีวิธีการทำซ้ำเหมือนกันหรือไม่ แต่มีจุดอยู่ตรงกลางของแต่ละตารางดังนั้นตารางจะถูกวาดด้วย lat / ตราบใดที่ศูนย์กลางของกริด @sebdalgarno
Vijay Ramesh

2

หากคุณไม่ได้ดูแพ็คเกจ R raster จะมีเครื่องมือในการแปลงเป็น / จากวัตถุเวกเตอร์ GIS ดังนั้นคุณควรจะสามารถ) สร้างแรสเตอร์ (กริด) กับเซลล์ 200x200m และ b) แปลงเป็นชุดรูปหลายเหลี่ยมด้วย รหัสตรรกะบางชนิด จากนั้นฉันจะดูแพ็คเกจ sp เพื่อช่วยในการตัดกันจุดและตารางโพลีกอน นี้http://cran.r-project.org/web/packages/sp/vignettes/over.pdfหน้าอาจจะมีการเริ่มต้นที่ดี เดินผ่านเอกสารแพคเกจ sp คุณอาจเริ่มต้นด้วยคลาส SpatialGrid และข้ามส่วนแรสเตอร์ทั้งหมด


-1

"จักรวาล GIS" นั้นซับซ้อนและมีมาตรฐานมากมายที่ข้อมูลของคุณจะต้องเป็นไปตามมาตรฐาน ทั้งหมด "เครื่องมือ GIS" โดยทำงานร่วมGIS มาตรฐาน ทั้งหมด "ข้อมูล GIS ร้ายแรง" ในวันนี้ (2014) จะถูก เก็บไว้ในฐานข้อมูล

วิธีที่ดีที่สุดในการ "ใช้ R" ในบริบท GIS ด้วยเครื่องมือFOSSอื่น ๆจะถูกฝังลงใน SQL เครื่องมือที่ดีที่สุดคือPostgreSQL 9.X (ดูPL / R ) และPostGIS


คำตอบของคุณ:

  • ไปยังไฟล์รูปนำเข้า / ส่งออก: การใช้งานและshp2pgsqlpgsql2shp
  • ที่ "แยกไฟล์รูปทรงสี่เหลี่ยม 200 เมตร / ย่อยรูปหลายเหลี่ยม" ดูST_SnapToGrid(), ST_AsRaster()ฯลฯ เราจำเป็นต้องเข้าใจความต้องการของคุณจะแสดงเป็น "สูตร"
  • คุณบอกว่าต้องการ "พิกัดทางภูมิศาสตร์ตั้งอยู่" .. อาจจะเป็นST_Centroid()ของสี่เหลี่ยม (?) ... คุณสามารถแสดง "คณิตศาสตร์มากขึ้น" ดังนั้นฉันเข้าใจ

... บางทีคุณไม่จำเป็นต้องมีการแปลงแรสเตอร์ใด ๆ มีเพียงเมทริกซ์ของคะแนนตัวอย่าง Regurlar


วิธีดั้งเดิมคือใช้ R โดยไม่มีPL / Rในคอมไพเลอร์ภายนอกตามปกติของคุณ: แปลงรูปหลายเหลี่ยมและส่งออกเป็นรูปร่างหรือเป็น WKT (ดูST_AsText) จากนั้นแปลงข้อมูลด้วยawkหรือตัวกรองอื่นเป็นรูปแบบ R


1
ขอบคุณสำหรับความช่วยเหลือของคุณ. อย่างไรก็ตามฉันต้องการโซลูชันที่อาศัย R และแพ็คเกจที่มีอยู่อย่างสมบูรณ์ เมื่อฉันสามารถแยกไฟล์รูปร่างใน subpolygons 200m * 200m ฉันสามารถตรวจสอบpoint.in.polygonว่าพิกัดใดอยู่ในรูปหลายเหลี่ยม ปัญหาของฉันคือการแยก shapefile ดั้งเดิมใน sub-polygons เหล่านั้น
majom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.