มากกว่า

รวมข้อมูลจุดเชิงพื้นที่กับรูปหลายเหลี่ยมใน R

รวมข้อมูลจุดเชิงพื้นที่กับรูปหลายเหลี่ยมใน R


ฉันกำลังพยายามทำการรวมเชิงพื้นที่ระหว่างข้อมูลจุดและข้อมูลรูปหลายเหลี่ยม

ฉันมีข้อมูลที่ระบุพิกัดเชิงพื้นที่ของเหตุการณ์ในไฟล์ csv A ของฉัน และมีไฟล์อื่นคือไฟล์รูปร่าง B ที่มีขอบเขตของพื้นที่เป็นรูปหลายเหลี่ยม

head(A) เดือน ลองจิจูด ละติจูด lsoa_code crime_type 1 2014-09 -1.550626 53.59740 E01007359 พฤติกรรมต่อต้านสังคม 2 2014-09 -1.550626 53.59740 E01007359 ระเบียบสาธารณะ 3 2014-09 -1.865236 53.93678 E01010646 รหัสพฤติกรรมต่อต้านสังคม ([email protected]) ชื่อ altname 0 E05004934 Longfield, New Barn และ Southfleet  1 E05000448 Lewisham Central  2 E05003149 Hawcoat 

ฉันต้องการรวมข้อมูลอาชญากรรม A เข้ากับไฟล์รูปร่าง B ของฉันเพื่อทำแผนที่เหตุการณ์อาชญากรรมที่เกิดขึ้นในพื้นที่ของฉัน A น่าเสียดายที่ฉันไม่สามารถทำการเข้าร่วมตามแอตทริบิวต์ได้รหัสเนื่องจากรหัสใน A หมายถึงหน่วยที่แตกต่างจากรหัสใน B

ฉันได้อ่านบทช่วยสอนและโพสต์จำนวนหนึ่งแล้ว แต่ไม่พบคำตอบ ฉันเหนื่อย:

เข้าร่วม = เกิน (A, B)

และซ้อนทับแต่ทำไม่สำเร็จตามต้องการ

มีวิธีการรวมนี้โดยตรงหรือจำเป็นต้องมีการแปลงระดับกลางจาก A เป็นรูปแบบอื่นหรือไม่?

ตามแนวคิดแล้ว ฉันต้องการเลือกจุด A ที่ตกอยู่ในรหัสพื้นที่ของ B (คล้ายกับ "เข้าร่วมตามตำแหน่งเชิงพื้นที่ใน ArcGIS")

มีคนมีปัญหานี้และแก้ไขหรือไม่?


ฟังก์ชัน point.in.poly ในแพ็คเกจ spatialEco จะคืนค่าออบเจ็กต์ SpatialPointsDataFrame ของจุดที่ตัดกับวัตถุ sp polygon และเพิ่มแอตทริบิวต์ของรูปหลายเหลี่ยม

ขั้นแรกให้เพิ่มแพ็คเกจที่ต้องใช้และสร้างข้อมูลตัวอย่าง

ต้องการ (spatialEco) ต้องการ (sp) ข้อมูล (มิวส์) พิกัด (มิวส์) = ~x+y sr1=รูปหลายเหลี่ยม(รายการ(รูปหลายเหลี่ยม(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409, 180162, 180114 ), c(332349, 332057, 332342, 333250, 333558, 333676, 332618, 332413, 332349))))'1') sr2=รูปหลายเหลี่ยม(รายการ(รูปหลายเหลี่ยม(cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437, 179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683, 331133, 331623, 332152, 332357, 332373)))),'2') sr3=รูปหลายเหลี่ยม(รายการ(รูปหลายเหลี่ยม) (cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875, 179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110), c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004, 329783, 329665, 329720, 329933, 330478, 331062, 331086)))'3') sr4=รูปหลายเหลี่ยม(รายการ(รูปหลายเหลี่ยม(cbind(c(180304, 180403,179632,179420,180304), c (332791, 333204, 333635, 333058, 332791)))),'4') sr=SpatialPolygons(รายการ(sr1,sr2,sr3,sr4)) srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c() '1','2','3','4'), PIDS=1:4, y= รูนิฟ(4)))

ทีนี้มาดูข้อมูลและพล็อตข้อมูลกัน

หัว ([email protected]) # หัวรูปหลายเหลี่ยม ([email protected]) # จุดพล็อต (srdf) จุด (meuse, pch=20)

สุดท้าย เราสามารถตัดจุดด้วยรูปหลายเหลี่ยมได้ ผลลัพธ์จะเป็นออบเจ็กต์ SpatialPointsDataFrame โดยในกรณีนี้ แอตทริบิวต์พิเศษสองรายการ (PIDS, y) ที่มีอยู่ในข้อมูลรูปหลายเหลี่ยม srdf

pts.poly <- point.in.poly(meuse, srdf) หัว ([email protected])

หากไม่มีคอลัมน์ระบุเฉพาะในข้อมูลรูปหลายเหลี่ยม คุณสามารถเพิ่มคอลัมน์ได้อย่างง่ายดาย

[email protected]$poly.ids <- 1:nrow(srdf)

เมื่อเรามีจุดและรูปหลายเหลี่ยมที่ตัดกัน เราสามารถรวมจุดโดยใช้ ID รูปหลายเหลี่ยมที่ไม่ซ้ำกันซึ่งเป็นแอตทริบิวต์ในข้อมูลรูปหลายเหลี่ยม

# จำนวนคะแนนในแต่ละรูปหลายเหลี่ยม tapply([email protected]$lead, [email protected]$PIDS, FUN=length) # ตะกั่วเฉลี่ยในแต่ละรูปหลายเหลี่ยม tapply([email protected]$lead, [email protected] $PIDS สนุก=ค่าเฉลี่ย)

เกิน()จากแพ็คเกจspอาจทำให้สับสนเล็กน้อย แต่ใช้งานได้ดี ฉันคิดว่าคุณได้สร้าง "A" เชิงพื้นที่ด้วยพิกัด(A) <- ~ลองจิจูด+ละติจูด:

# ซ้อนทับจุดและแยกเฉพาะคอลัมน์รหัส: a.data <- over(A, B[,"code"])

แทนที่จะเป็นออบเจกต์เชิงพื้นที่แบบจุด สิ่งนี้จะให้ data frame แก่คุณโดยมีจำนวนไม่เท่ากัน แถวเป็น A และ "รหัส" ตัวแปรเดียวจากรูปหลายเหลี่ยมที่ตัดกันแต่ละรูปจาก B

# เพิ่มข้อมูลนั้นกลับไปที่ A: A$bcode <- a.data$code

นี่คือวิธีแก้ปัญหาเหมือน dplyr:

ห้องสมุด (spdplyr) ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson", what = "sp") ป๊อป <- read_excel("data/SAPE20DT7-mid-2017-parlicon-parlicon-syo xls",sheet = "data") pop <- janitor::clean_names(pop) ukcounties_pop <- ukcounties %>% inner_join(pop, by = c("pcon18nm" = "pcon11nm"))

ข้อมูลประชากรมาจาก: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parliamentaryconstituencymidyearpopulationestimates

ฉันต้องแปลงไฟล์รูปร่างที่ดาวน์โหลดจากเป็น geoJson: https://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies-december-2018-uk-bgc/data?page=1

คุณสามารถทำได้โดย:

uk_constituencies <- readOGR("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC.shp") uk_constituencies # อยู่ในรูปแบบ tmerc เราจำเป็นต้องแปลงเป็น WGS84 ที่กำหนดโดยรูปแบบ geoJson # ขั้นแรกให้แปลงเป็นลองจิจูด / ละติจูดด้วยระบบพิกัด WGS84 wgs84 = '+proj=longlat +datum=WGS84' uk_constituencies_trans <- spTransform(uk_constituencies, CRS(wgs84)) # แปลงจากดาต้าเฟรมเชิงพื้นที่เป็น GeoJSON uk_constituencies_json <- geojson_constitujsonencies () บันทึกเป็นไฟล์ GeoJSON บนระบบไฟล์ geojson_write(uk_constituencies_json, file = "data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson") #read back in: ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_DecConstituencies"

ดูวิดีโอ: Buffering