यदि पॉलीगॉन शेपफाइल के भीतर अंक गिरते हैं, तो जाँच करना


19

Zillow का एक सेट है शेपफ़ाइलें प्रमुख अमेरिकी शहरों के विभिन्न इलाकों के लिए। मैं जाँच करना चाहता था कि क्या कुछ इमारतें आर का उपयोग करके कुछ पड़ोस में मौजूद थीं:

library(rgeos)
library(sp)
library(rgdal)

df <- data.frame(Latitude =c(47.591351, 47.62212,47.595152),
                 Longitude = c(-122.332271,-122.353985,-122.331639),
                 names = c("Safeco Field", "Key Arena", "Century Link"))
coordinates(df) <- ~ Latitude + Longitude

wa.map <- readOGR("ZillowNeighborhoods-WA.shp", layer="ZillowNeighborhoods-WA")

sodo <- wa.map[wa.map$CITY == "Seattle"  & wa.map$NAME == "Industrial District", ]

मैं बिना किसी मुद्दे के साजिश कर सकता हूं

plot(sodo)
points(df$Latitude ~ df$Longitude, col = "red", cex = 1)

यहाँ छवि विवरण दर्ज करें

मैं proj4शेपफाइल से अपने डेटा.फ्रेम से स्ट्रिंग का मिलान करता हूं

CRSobj <- CRS("+proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0 ")
df@proj4string <- CRSobj

over(df, sodo)

यह बस मुझे NAमूल्यों का एक गुच्छा देता है । मैंने इसका उत्तर देने की कोशिश की है

spp <- SpatialPoints(df)
spp@proj4string <- CRSobj
over(spp, sodo)

लेकिन अभी भी केवल NAमूल्य प्राप्त करते हैं। किसी भी विचार मुझे और क्या प्रयास करना चाहिए?

जवाबों:


20

स्थानिक data.frameसही ढंग से नहीं बना है। यह काम कर सकता है:

library(rgeos)
library(sp)
library(rgdal)

wa.map <- readOGR("ZillowNeighborhoods-WA.shp", layer="ZillowNeighborhoods-WA")

sodo <- wa.map[wa.map$CITY == "Seattle"  & wa.map$NAME == "Industrial District", ]

# Don't use df as name, it is an R function
# Better to set longitudes as the first column and latitudes as the second
dat <- data.frame(Longitude = c(-122.332271,-122.353985,-122.331639),
                  Latitude =c(47.591351, 47.62212,47.595152),
                  names = c("Safeco Field", "Key Arena", "Century Link"))
# Assignment modified according
coordinates(dat) <- ~ Longitude + Latitude
# Set the projection of the SpatialPointsDataFrame using the projection of the shapefile
proj4string(dat) <- proj4string(sodo)

over(dat, sodo)
#  STATE COUNTY    CITY                NAME REGIONID
#1    WA   King Seattle Industrial District   271892
#2  <NA>   <NA>    <NA>                <NA>       NA
#3  <NA>   <NA>    <NA>                <NA>       NA

over(sodo, dat)
#           names
#122 Safeco Field

7

मैं बस एक ही काम कर रहा हूं। पास्कल का जवाब लगभग इसे कवर करता है लेकिन आपको नीचे दो अतिरिक्त चरणों की आवश्यकता हो सकती है।

#After you create your list of latlongs you must set the proj4string to longlat
proj4string(dat) <- CRS("+proj=longlat")

#Before you re-set the proj4string to the one from sodo you must actually convert #your coordinates to the new projection
dat <- spTransform(dat, proj4string(sodo))

यह मेरे लिए स्पष्ट नहीं है कि किन मामलों में इन अतिरिक्त चरणों की आवश्यकता है। मेरे लिए user32309 द्वारा उत्तर का हल काफी अच्छा था।
djhurio

3
यह इस बात पर निर्भर करता है कि आपका डेटा किस प्रारूप में है। यदि इसका प्रक्षेपण A में है और आप केवल यह घोषणा करना चाहते हैं कि आप proj4string का उपयोग करते हैं और आपको अच्छा होना चाहिए। लेकिन अगर इसके प्रक्षेपण बी में और आपको एक्टुलेली को प्रक्षेपण ए में बदलने की आवश्यकता है तो आपको स्पांट्रफॉर्म का उपयोग करने की आवश्यकता है।
जॉन करी

2

मैंने इस पोस्ट में स्वीकृत उत्तर के लिए एक समान दृष्टिकोण का उपयोग किया लेकिन वास्तव में कभी भी इससे संतुष्ट नहीं था इसलिए मैंने विकल्पों पर ध्यान दिया और पाया एसएफ लाइब्रेरी ।

और इस लाइब्रेरी का उपयोग करके आप इस तरह कोड लिख सकते हैं:

library(sf)
# Shapefile from ABS: 
# https://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/1270.0.55.004July%202016?OpenDocument
map = read_sf("data/ABS/shapes/SUA_2016_AUST.shp")

pnts_sf <- st_as_sf(pnts, coords = c('y', 'x'), crs = st_crs(map))

pnts <- pnts_sf %>% mutate(
  intersection = as.integer(st_intersects(geometry, map))
  , area = if_else(is.na(intersection), '', map$SUA_NAME16[intersection])
) 

pnts

आउटपुट:

         geometry intersection area    
*     <POINT [°]>        <int> <chr>   
1 (138.62 -34.92)           79 Adelaide
2 (138.58 -34.93)           79 Adelaide
3 (138.52 -34.95)           79 Adelaide
4 (152.71 -27.63)           60 Brisbane
5 (153.01 -27.57)           60 Brisbane
6  (150.73 -33.9)           31 Sydney  
7 (150.99 -33.92)           31 Sydney 

मैंने इस कोड को एक अन्य पोस्ट पर पोस्ट किया था जो एक समान प्रश्न था, यहां पहचानें : बहुभुज की पहचान करें जिसमें आर sf पैकेज के साथ बिंदु हो

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.