आर में बहुभुज के लिए स्थानिक बिंदु डेटा से जुड़ें


21

मैं बिंदु डेटा और बहुभुज डेटा के बीच एक स्थानिक जुड़ाव करने की कोशिश कर रहा हूं।

मेरे पास डेटा है जो मेरी सीएसवी फ़ाइल ए में एक घटना के स्थानिक निर्देशांक को इंगित करता है और एक और फ़ाइल है, आकृति बी, जिसमें बहुभुज के रूप में एक क्षेत्र की सीमाएं हैं।

head(A)
  month   longitude latitude lsoa_code                   crime_type
1 2014-09 -1.550626 53.59740 E01007359        Anti-social behaviour
2 2014-09 -1.550626 53.59740 E01007359                 Public order
3 2014-09 -1.865236 53.93678 E01010646        Anti-social behaviour

head(B@data)
  code      name                                  altname
0 E05004934 Longfield, New Barn and Southfleet    <NA>
1 E05000448                   Lewisham Central    <NA>
2 E05003149                            Hawcoat    <NA>

मैं अपने क्षेत्र में होने वाले अपराध की घटनाओं को मैप करने के लिए अपराध डेटा ए से मेरी आकृति बी में शामिल होना चाहता हूं। दुर्भाग्य से मैं ए में शामिल codeकोड के आधार पर अलग-अलग इकाइयों को संदर्भित करता है एक विशेषता प्रदर्शन नहीं कर सकता ।

मैंने कई ट्यूटोरियल और पोस्ट पढ़े हैं, लेकिन जवाब नहीं मिला। मैंने कोशिश की:

joined = over(A, B)

और overlay, लेकिन वह पूरा नहीं किया जो मैं चाहता था।

क्या ऐसा करने का कोई तरीका है जो सीधे जुड़ता है या ए से दूसरे प्रारूप में एक मध्यवर्ती परिवर्तन की आवश्यकता होगी?

वैचारिक रूप से मैं ए के उन बिंदुओं का चयन करना चाहता हूं codeजो बी के क्षेत्रों में आते हैं ("आर्कगिस में स्थानिक स्थान के आधार पर शामिल होने के समान")।

क्या किसी के पास यह मुद्दा था और इसे हल किया?


क्या आपने point.in.polygon()पैकेज में देखा है sp?

@ arvi1000 मेरे पास है और फिर से यह कोशिश करूंगा। point.in.polygonइस बारे में मेरा विचार था कि क्या यह चर को संरक्षित करेगा monthऔर crime_type। क्या आप इसके बारे में जानते हैं?
बेन्हैरोन

मैंने कुछ अधिक के साथ कोशिश की है point.in.polyऔर अंत में उन बिंदुओं को चुना है जो प्रासंगिक बहुभुज में आते हैं। धन्यवाद।
बेन्हेरोन

तब शायद आपको अपने सवाल का जवाब अपने हल से देना चाहिए। याद रखें, अच्छे उत्तर इस साइट के बारे में क्या हैं।
धीरे

जवाबों:


8

SpatialEco पैकेज में point.in.poly फ़ंक्शन उन बिंदुओं का एक SpatialPointsDataFrame ऑब्जेक्ट देता है, जो एक sp बहुभुज ऑब्जेक्ट को इंटरसेक्ट करता है और वैकल्पिक रूप से बहुभुज विशेषताओं को जोड़ता है।

पहले आवश्यक पैकेजों को जोड़ने और कुछ उदाहरण डेटा बनाने की सुविधा देता है।

require(spatialEco)
require(sp)
data(meuse)
coordinates(meuse) = ~x+y
sr1=Polygons(list(Polygon(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409,
  180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676,
  332618, 332413, 332349)))),'1')
sr2=Polygons(list(Polygon(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=Polygons(list(Polygon(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=Polygons(list(Polygon(cbind(c(180304, 180403,179632,179420,180304),
  c(332791, 333204, 333635, 333058, 332791)))),'4')
sr=SpatialPolygons(list(sr1,sr2,sr3,sr4))
srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4'), PIDS=1:4, y=runif(4)))

अब, डेटा पर एक त्वरित नज़र डालते हैं और उसे प्लॉट करते हैं।

head(srdf@data)  # polygons
head(meuse@data) # points
plot(srdf)
points(meuse, pch=20)

अंत में, हम बहुभुज के साथ बिंदुओं को काट सकते हैं। इस परिणाम के साथ एक SpatialPointsDataFrame ऑब्जेक्ट होगा, इस मामले में, दो अतिरिक्त विशेषताएँ (PIDS, y) जो srdf बहुभुज डेटा में निहित थीं।

  pts.poly <- point.in.poly(meuse, srdf)
    head(pts.poly@data)

यदि बहुभुज डेटा में कोई विशिष्ट पहचान स्तंभ नहीं है तो आप आसानी से एक जोड़ सकते हैं।

srdf@data$poly.ids <- 1:nrow(srdf) 

एक बार जब हमारे पास अंक और बहुभुज सम्‍मिलित हो जाते हैं, तो हम अद्वितीय बहुभुज आईडी का उपयोग करके अंक एकत्र कर सकते हैं जो बहुभुज डेटा में एक विशेषता थी।

# Number of points in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=length)

# Mean lead in each polygon
tapply(pts.poly@data$lead, pts.poly@data$PIDS, FUN=mean)

@ arvi1000, हाँ, लेकिन sp :: point.in.polygon एक तार्किक पैदा करता है। SpatialEco: point.in.poly ओवर के लिए एक आवरण है, लेकिन एक SpatialPointsDataFrame देता है और बहुभुज विशेषताओं के संबंध में कुछ कदमों को शॉर्टकट करता है, बहुत अधिक रेखापुंज की तरह: प्रतिच्छेद rgeos / gIntersect के लिए करता है।
जेफरी इवांस

sp::point.in.polygonवास्तव में एक संख्यात्मक मान लौटाता है (0 = बिंदु बाहर, 1 = अंदर, 2 = किनारे पर, 3 = शीर्ष पर)। कुछ परिस्थितियों के लिए सही बात हो सकती है। सोचा था कि यह यहाँ नोट करने के लिए उपयोगी था, क्योंकि यह संबंधित शब्दों के लिए एक शीर्ष Google परिणाम है
arvi1000

27

over()पैकेज से spथोड़ा भ्रमित हो सकता है लेकिन अच्छी तरह से काम करता है। मैं मान रहा हूँ कि आप पहले से ही "ए" स्थानिक बना चुके हैं coordinates(A) <- ~longitude+latitude:

# Overlay points and extract just the code column: 
a.data <- over(A, B[,"code"])

एक बिंदु स्थानिक वस्तु के बजाय, यह आपको एक ही नहीं के साथ एक डेटा फ्रेम देता है। A से पंक्तियाँ और B से प्रत्येक प्रतिच्छेद बहुभुज से एक एकल चर "कोड"।

# Add that data back to A:
A$bcode <- a.data$code

मैंने over()बहुभुज के कोने पर बिंदुओं के साथ मुद्दों को पाया है, हालांकि मुझे लगता है कि यह सबसे आसान समाधान है जो मैंने अब तक पाया है।
JMT2080AD

आपके पास क्या मुद्दे हैं?
सिंबांगु जुएल

बहिष्करण। मुझे इसे और तलाशने की जरूरत है। मैं आपको आज बाद में कुछ डेटा दूँगा और अगर आपकी रुचि है तो हम इसे एक साथ देख सकते हैं। मैं गलत हो सकता हूं, लेकिन मुझे पूरा यकीन है कि एल्गोरिथ्म में कुछ विकृतियां हैं जिनका ध्यान रखने की जरूरत है, कम से कम मेरे डेटा के लिए।
JMT2080AD

कोई बात नहीं। यह मेरे डेटा के साथ कुछ होना चाहिए। यह प्रायोगिक सेट ठीक काम करता है। r-fiddle.org/#/fiddle?id=m5sTjE4N&version=1
JMT2080AD

1
यह स्वीकृत उत्तर की तुलना में बहुत अधिक सरल दृष्टिकोण है, और इसमें rgdal के अलावा अन्य अतिरिक्त पैकेज स्थापित करने की आवश्यकता नहीं है।
ब्रायस फ्रैंक

0

यहाँ समाधान की तरह एक सपना है:

library(spdplyr)

ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
pop <- read_excel("data/SAPE20DT7-mid-2017-parlicon-syoa-estimates-unformatted.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/populationestimimates/datasets/parministraryconstituencymidyearpopestestimates

मुझे जियोसन से डाउनलोड की गई आकार की फ़ाइलों को रूपांतरित करना था: https://geoportal.statistics.gov.uk/datasets/westminster-parunningary-constituencies-de-201-2018-uk-bbc/data?page=1

आप ऐसा कर सकते हैं:

uk_constituencies <- readOGR("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC.shp")
uk_constituencies # this is in tmerc format. we need to convert it to WGS84 required by geoJson format.

# First Convert to Longitude / Latitude with WGS84 Coordinate System
wgs84 = '+proj=longlat +datum=WGS84'
uk_constituencies_trans <- spTransform(uk_constituencies, CRS(wgs84))

# Convert from Spatial Dataframe to GeoJSON
uk_constituencies_json <- geojson_json(uk_constituencies_trans)

# Save as GeoJSON file on the file system.
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_Constituencies_December_2018_UK_BGC/uk_country.geojson",
                                      what = "sp")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.