2015-02-26 4 views
8

मैं एक इंटरेक्टिव मानचित्र बनाना चाहता हूं जो शहर की सार्वजनिक परिवहन लाइनों को दिखा रहा हो। मैं आर में पत्रक का उपयोग करके ऐसा करने की कोशिश कर रहा हूं (लेकिन मैं विकल्प, सुझावों के लिए खुला हूं?)पत्रक का उपयोग कर आर में जीटीएफएस डेटा की एक इंटरैक्टिव साजिश कैसे बनाएं?

डेटा: परिवहन प्रणाली का डेटा जीटीएफएस प्रारूप में है, जो पाठ फ़ाइलों (.txt) में व्यवस्थित है, जो मैं एक डेटा फ्रेम के रूप में आर में पढ़ा *

समस्या:। मैं कैसे प्रत्येक पाली लाइन (चर shape_id) की आईडी से संकेत मिलता है तो साजिश वास्तव में एक पारगमन लाइन के मार्ग का अनुसरण करेगा नहीं मिल रहा। इसके बजाय, यह एक यादृच्छिक अनुक्रम में बिंदुओं को जोड़ रहा है।

यहाँ मैं, क्या कोशिश की है अब तक सफलता नहीं मिली है:

# Download GTFS data of the Victoria Regional Transit System 
    tf <- tempfile() 
    td <- tempdir() 
    ftp.path <- "http://www.gtfs-data-exchange.com/agency/bc-transit-victoria-regional-transit-system/latest.zip" 
    download.file(ftp.path, tf) 

# Read text file to a data frame 
    zipfile <- unzip(tf , exdir = td) 
    shape <- read.csv(zipfile[9]) 

# Create base map 
    basemap <- leaflet() %>% addTiles() 


# Add transit layer 
    basemap %>% addPolylines(lng=shape$shape_pt_lon, lat=shape$shape_pt_lat, 
          fill = FALSE, 
          layerId =shape$shape_id) 

मैं इस पर अपनी टिप्पणी के लिए खुशी होगी।

* मुझे पता है कि यह डेटा एक जीआईएस सॉफ़्टवेयर (उदा। क्यूजीआईएस) में एक आकारफाइल बनाने के लिए आयात करना संभव है और फिर readOGR के साथ आर में आकारफाइल को पढ़ना संभव है। Robin Lovelace has shown how to do this। लेकिन, मैं एक शुद्ध आर समाधान की तलाश में हूँ। ;)

ps। Kyle Walker has written a great intro to interactive maps in R using Leaflet। दुर्भाग्यवश, वह अपने ट्यूटोरियल में पॉली लाइनों को कवर नहीं करता है।

उत्तर

9

आपकी समस्या विधि में से एक नहीं है लेकिन डेटा: नोट करें कि आप 8 एमबी डाउनलोड करते हैं और उस लाइन फ़ाइल को आप चमकदार के माध्यम से लिफाफे में लोड करने का प्रयास करते हैं, वह 5 एमबी है। एक सामान्य सिद्धांत के रूप में, आपको हमेशा छोटे डेटासेट के साथ नए तरीकों का प्रयास करना चाहिए, उन्हें स्केल करने से पहले। समस्या का निदान करने और इसे हल करने के लिए मैं यही करता हूं।

चरण 1: का अन्वेषण और डेटा

pkgs <- c("leaflet", "shiny" # packages we'll use 
    , "maps" # to test antiquated 'maps' data type 
    , "maptools" # to convert 'maps' data type to Spatial* data 
) 
lapply(pkgs, "library", character.only = TRUE) 


class(shape) 
## [1] "data.frame" 

head(shape) 

## shape_id shape_pt_lon shape_pt_lat shape_pt_sequence 
## 1 1-39-220 -123.4194  48.49065     0 
## 2 1-39-220 -123.4195  48.49083     1 
## 3 1-39-220 -123.4195  48.49088     2 
## 4 1-39-220 -123.4196  48.49123     3 
## 5 1-39-220 -123.4197  48.49160     4 
## 6 1-39-220 -123.4196  48.49209     5 

object.size(shape)/1000000 # 5 MB!!! 

## 5.538232 bytes 

summary(shape$shape_id) 
shape$shape_id <- as.character(shape$shape_id) 
ids <- unique(shape$shape_id) 
shape_orig <- shape 
shape <- shape[shape$shape_id == ids[1],] # subset the data 

स्टेज 2 सबसेट: एक स्थानिक * वस्तु

इस नक्शे से data.frame वस्तुओं की तरह है करने के लिए कनवर्ट करें?

state.map <- map("state", plot = FALSE, fill = TRUE) 
str(state.map) 

## List of 4 
## $ x : num [1:15599] -87.5 -87.5 -87.5 -87.5 -87.6 ... 
## $ y : num [1:15599] 30.4 30.4 30.4 30.3 30.3 ... 
## $ range: num [1:4] -124.7 -67 25.1 49.4 
## $ names: chr [1:63] "alabama" "arizona" "arkansas" "california" ... 
## - attr(*, "class")= chr "map" 

हाँ, यह समान है, इसलिए हम यह कन्वर्ट करने के लिए map2Spatial* उपयोग कर सकते हैं:

shape_map <- list(x = shape$shape_pt_lon, y = shape$shape_pt_lat) 
shape_lines <- map2SpatialLines(shape_map, IDs = ids[1]) 
plot(shape_lines) # success - this plots a single line! 

line

स्टेज 3: सभी लाइनों एक साथ

एक for पाश में शामिल हों यह अच्छी तरह से करेंगे। ध्यान दें कि हम केवल पहली 10 लाइनों का उपयोग करते हैं।सभी लाइनों के लिए 2:length(ids) का उपयोग करें:

for(i in 2:10){ 
    shape <- shape_orig[shape_orig$shape_id == ids[i],] 
    shape_map <- list(x = shape$shape_pt_lon, y = shape$shape_pt_lat) 
    shape_temp <- map2SpatialLines(shape_map, IDs = ids[i]) 
    shape_lines <- spRbind(shape_lines, shape_temp) 
} 

स्टेज 4: प्लॉट

वस्तु का प्रयोग कोड में थोड़ा छोटा बनाता है - यह इस मामले में पहले 10 लाइनों साजिश होगा:

leaflet() %>% 
    addTiles() %>% 
    addPolylines(data = shape_lines) 

first-10

निष्कर्ष

आपको सही आईडी के साथ साजिश के लिए एक स्थानिक * डेटा प्रकार में परिवर्तित करने से पहले डेटा के साथ खेलना और इसे कुशल बनाना होगा। maptools::map2Spatial*, unique() और एक चालाक for लूप समस्या को हल कर सकता है।

+0

यह महान रॉबिन काम करता है। धन्यवाद। मैं आपके द्वारा वर्णित 'डेटा समस्या' के बारे में सोच रहा था। क्योंकि, अंत में, जब मैं सभी ट्रांजिट मार्गों को मैप करने के लिए अपना समाधान लागू करता हूं, तो आपका कोड 5 एमबी (आकार_लाइन) की वस्तु को भी लिखता है। –

+0

यह सच है कि, लेकिन परीक्षण और पुनरुत्पादन के प्रयोजनों के लिए, समस्याओं को उनके सबसे छोटे/सरल रूप में कम किया जाना चाहिए – RobinLovelace

संबंधित मुद्दे