2013-06-26 3 views
3

Все, Я пытаюсь создать карту с «Великими кругами», подобную тому, что сделал Натан Яу в этом posting. Тем не менее, я пытаюсь сделать это для всего мира, и все они попадают в одно место. Кажется, у меня проблемы с секцией цикла. Если я просто использую один лат/длинный комбо, все работает. Как только я пристроить мой стол больше я получаю ошибки (Error in .pointsToMatrix(p1): Неверная длина для вектора, должен быть 2) Я 100% Newb на R и хотел бы некоторую помощьСоздание отличной карты кругов с R

lat.txt

LAT,LONG 
39.164141,-121.640625 

R команды

library(maps) 
library(geosphere) 
lat_me <- 45.213004 
lon_me <- -68.906250 
map("world", col="#f2f2f2", plot = TRUE, fill=TRUE, bg="white") 
data <- read.csv("/Users/blah/R/latlon/lat.csv",sep=",", header=TRUE) 
for (i in 1:length(data)) { 
    inter <- gcIntermediate(c(data$LONG, data$LAT), c(lon_me, lat_me), n=50, addStartEnd=TRUE) 
    lines(inter,col="red") 
} 
+0

Извините, что было на самом деле просто вырезать + паста из R. Символы + просто графически представляют цикл «для». Я считаю, что – breadly

+0

Я предлагаю вам не использовать цикл, поскольку 'gcIntermediate' уже векторизован. – Andrie

+0

@ Andrie Можете ли вы немного разобраться? Я делаю свое исследование прямо сейчас, почему я, что я мог бы сделать вместо этого, но для этого я следовал примеру, данному Натан. - – breadly

ответ

6

Я вижу, что вы проиндексировать ваш цикл с i но не стоит включать в себя, что в любом месте внутри цикла. Я предполагаю, что вы хотите перебрать строки своих данных. Поэтому измените диапазон индексов на 1: nrow (data) и включите индекс для строки, которую вы хотите сделать для каждого i.

for(i in 1:nrow(data)){ 
inter <- gcIntermediate(c(data$LONG[i], data$LAT[i]), 
         c(lon_me, lat_me), 
         n=50, 
         addStartEnd=TRUE) 
... 
} 
+0

Wow ... это наверняка работал. Это решило мой точный вопрос отлично – breadly

+0

@ bread555, добро пожаловать в S.O. Если этот ответ решит ваш вопрос, обязательно укажите, нажав зеленую галочку рядом с вопросом. –

+0

@ RicardoSaporta Я, конечно же, буду ждать, чтобы увидеть, не пришло ли что-нибудь еще. Однако я выберу его сейчас. – breadly

4

gcIntermediate является vectorsied (как указывает @Andrie в комментариях), так что вам не нужен цикл:

me <- c(45.213004 , -68.906250 ) 

set.seed(123) 
pts <- data.frame(x = runif(4,-180,180) , y = runif(4,-90,90)) 
pts 
#   x   y 
#1 -76.47209 79.284111 
#2 103.78985 -81.799830 
#3 -32.76831 5.058988 
#4 137.88627 70.635428 

# Just supply the two column data.frame - no need for loops! 
# Also return as 'SpatialLines' object to make plotting easier 
inter <- gcIntermediate(pts , me , n=50 , addStartEnd=TRUE , sp = TRUE) 

map("world", col="#f2f2f2", plot = TRUE, fill=TRUE, bg="white") 
plot(inter ,add=T , col = "red" , lty = 2) 

enter image description here

+0

@ Simon0101 ничего себе. Спасибо за дальнейшее объяснение. Похоже, я собираюсь много искать этих терминов/команд, потому что я их раньше не видел. В частности, что вы подразумеваете, используя SpatialLines для упрощения построения графика? – breadly