R - สร้าง boundingbox แปลงเป็นรูปหลายเหลี่ยมและพล็อต


11

ฉันมี และNE lat lng SW lat lngเป้าหมายของฉันง่ายมากฉันใช้ RStudio และฉันต้องการสร้างกล่องกระโดดจากสองด้านบนและด้านล่างจากนั้นสร้างรูปหลายเหลี่ยมและฉันต้องการเพิ่มจุดสุ่มลงในรูปหลายเหลี่ยมสี่เหลี่ยมจัตุรัส ฉันมี NELat / Lng และ SW-Lat / Lng ในไฟล์ csv ที่ฉันสามารถนำเข้าสู่ data.frame

ฉันแค่ต้องการคำแนะนำเล็กน้อยในการเริ่มต้นฉันยังใหม่กับภาษา R มันแตกต่างจากที่ฉันคุ้นเคย

จนถึงตอนนี้ฉันมีสิ่งนี้:

coords = cbind(78.46801, 19.53407)
coordsmax = cbind(78.83157, 19.74557 )
sp = SpatialPoints(coordsmax)
sp2 = SpatialPoints(coords)

r1 = rbind(coords, coordsmax[1, ])  # join
P1 = Polygon(r1)
Ps1 = Polygons(list(P1), ID = "a")
plot(Ps1)

ฉันเพิ่งเห็นตัวอย่างจากที่อื่น แต่ฉันไม่สามารถพล็อตรูปหลายเหลี่ยม 4 มุมได้


คุณมีพิกัดที่ซ้ำกันเพียงครั้งเดียวใน r1 นั่นหมายความว่าเป็น 'r1 = rbind (coords, coordsmax) `??
mdsumner

ใช่แก้ไขแล้ว มันยังคงใช้งานไม่ได้
user134611

การทำงานกับปัญหาอย่างรอบคอบครั้งเดียวเป็นวิธีที่ดีในการหาทางออก ฉันคิดว่ามันเป็นข้อผิดพลาดที่รูปหลายเหลี่ยม () ไม่ได้เกิดข้อผิดพลาดเมื่อให้พิกัดเพียงสองหรือหนึ่งตำแหน่งฉันได้ระบุไว้ในประเด็น sp สำหรับคุณ q ห้องสมุด (แรสเตอร์); SPs1 <- ตาม (ขอบเขต (r1), "SpatialPolygons"); พล็อต (SPs1)
mdsumner

ฉันขอโทษที่ฉันต้องใช้ฟังก์ชันคำตอบของ stackexchange แต่ชื่อเสียงของฉันไม่สูงพอที่จะแสดงความคิดเห็น @ dof1985 คุณใช้ (x_min, y_min), (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) เป็นพิกัดเพื่อสร้างรูปหลายเหลี่ยม ฉันลองเหมือนกัน แต่ล้มเหลว จากนั้นฉันดูตัวอย่างและตรวจสอบให้ดียิ่งขึ้นว่าคุณใช้แทน (x_min, y_min), (x_max, y_min), ... กำลังติดตาม (x_min, y_min), (x_min, y_max), ... นี่อาจเป็น เหตุผลข้อผิดพลาดของฉัน? โปรดแก้ไขตัวอย่างของคุณ :)
ExploreR

คำตอบ:


7

โค้ดของคุณมีการเปลี่ยนแปลงเล็กน้อย:

ก่อนอื่นให้สังเกตว่าฉันทิ้งการสร้างคะแนน SpatialPointsคุณสามารถสร้างรูปหลายเหลี่ยมโดยไม่ต้องใช้ของ แม้ว่าในกรณีที่มีหลายจุดที่เกี่ยวข้องมันจะเป็นการดีกว่าถ้าสร้างรูปหลายเหลี่ยมจากจุด

ประการที่สองฉันเขียนพิกัด 5 คู่ในเมทริกซ์ด้านล่างแต่ละคู่พิกัดยืนตรงมุมหนึ่งของกล่องขอบเขตของคุณและอันดับที่ห้าซ้ำจุดแรก เมทริกซ์ประกอบด้วย: [ (x_min, y_min) , (x_max, y_min), (x_max, y_max), (x_max, y_min), (x_min, y_min) ]

ในที่สุดฉันใช้SpatialPolygonsกับespg:4326การสร้างวัตถุที่สามารถพล็อตภายในบริบททางภูมิศาสตร์

library(sp)

coords = matrix(c(78.46801, 19.53407,
               78.46801, 19.74557,
               78.83157, 19.74557,
               78.83157, 19.53407,
               78.46801, 19.53407), 
             ncol = 2, byrow = TRUE)


P1 = Polygon(coords)
Ps1 = SpatialPolygons(list(Polygons(list(P1), ID = "a")), proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"))
plot(Ps1, axes = TRUE)

นี่คือสิ่งที่เกิดขึ้นถ้าฉันพล็อตรหัสของคุณ:

รูปหลายเหลี่ยมที่ดูเหมือนเส้น

และนี่คือหลังจากการแก้ไขรหัสนำเสนอที่นี่:

กล่องพันธะ


แค่นั้นแหละ! คุณสามารถแสดงความคิดเห็นเล็กน้อยในproj4String? คุณกำลังกำหนดลักษณะของละติจูดและระยะยาวผ่านมันได้หรือไม่
user134611

กด?is.projectedปุ่ม R-console เพื่อดูวิธีproj4stringใช้ ใช่มันถูกใช้เพื่อกำหนดคลาส CRS ให้กับวัตถุอวกาศ
dof1985

21

คุณสามารถซ้อนextentฟังก์ชันจากไลบรารีแรสเตอร์asเพื่อสร้างวัตถุ SpatialPolygons

library(sp)
e <- as(raster::extent(78.46801, 78.83157, 19.53407, 19.74557), "SpatialPolygons")
proj4string(e) <- "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
plot(e)

2
นี่เป็นวิธีที่ดีกว่าคำตอบของฉัน
dof1985
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.