2015-05-26 2 views
2

У меня есть этот набор данных: https://www.dropbox.com/s/k06n9l05t25r6x2/newdata.csv?dl=0Как преобразовать данные точек, собранные с интервалом сетки, в набор данных с привязкой в ​​r?

(Sample)

"","row","col","flagrv" 
"1",2361,530,2 
"2",2378,531,2 
"3",2360,531,2 
"4",2355,531,2 
"5",2363,532,2 
"6",2359,532,2 
"7",2368,533,2 
"8",2367,533,2 
"10",2359,533,2 

А если я сюжет, используя этот код:

gs.pal <- colorRampPalette(c("blue", "green","yellow","orange","red"),bias=1,space="rgb") 
ggplot(data=ndata,aes(x=col,y=row,color=flagrv)) + 
    geom_point(size = 0.01)+ 
    scale_colour_gradientn(name = "Scale",colours = gs.pal(5))+ 
    xlab('Longitude')+ 
    ylab('Latitude')+ 
    theme_bw()+ 
    theme(line = element_blank())+ 
    theme(legend.position = c(.93,.20),panel.grid.major = element_line(colour = "#854440"))+ 
    ggsave("test.png",width=10, height=8,dpi=300) 

Получим эту цифру: enter image description here

Теперь, проблема в том, что у меня нет значений Lat-Long. Я хочу наложить границы штата, но не могу использовать пакет Maps. Кто-то предложил использовать gdal, но я не знаю, как это сделать. Не могли бы вы рассказать мне, как я могу сопоставить это в домен Lat-Long, чтобы я мог легко манипулировать им.

Edit:

я узнал от кого-то еще, что я могу использовать это:

gdal_translate -a_srs EPSG:4269 FILE.asc FILE.tif 
#

Ошибки для ответов 1

Error: unexpected ']' in "spdf = SpatialPointsDataFrame(coords, all_data[, c("flagrv"]" 

Затем я изменил код:

spdf = SpatialPointsDataFrame(coords, all_data[, c("flagrv")]) 

Но теперь у меня есть эта ошибка:

Error in validObject(.Object) : invalid class “SpatialPointsDataFrame” object: invalid object for slot "data" in class "SpatialPointsDataFrame": got class "integer", should be or extend class "data.frame" 

ответ

1

Не зная, по крайней мере, проекцию и датум набора данных (но, надеюсь, больше информации, такие как размер и степень), не существует простой способ сделать это. Если это производная карта, попробуйте найти то, что было использовано для ее создания. С помощью этой информации вы можете использовать функцию проецирования в растровом пакете для определения проекции набора данных.

EDIT (на основе дополнительной информации имеется рабочее решение): Вот рабочее решение, учитывая, что нижний левый угол набора данных имеет координату 24,55, -130, расстояние между рядами/col составляет 0,01 градуса и проекция равна n83. Обратите внимание, что предоставленная информация метаданных была неправильной, так как значение min lat не было 20 градусов, но могло быть оценено с самой южной точки (ключ запада) как 24.55.

#load dataset 
all_data=(read.csv('new_data.csv',header=T, stringsAsFactors=F)) 
res=0.01 #spacing of row and col coords pre-specified 
#origin_col_row=c(0, 0) 
origin_lat_lon=c(24.55, -130) 
all_data$row=(all_data$row)*res+origin_lat_lon[1] 
all_data$col=(all_data$col)*res+origin_lat_lon[2] 

#now that we have real lat/lon, we can just create a spatial dataframe 
library(rgdal) 
library(sp) 
coords = cbind(all_data$col, all_data$row) 
spdf = SpatialPointsDataFrame(coords, data=all_data) #sp = SpatialPoints(coords) 
proj4string(spdf) <- CRS("+init=epsg:4269") 

г, кажется, задушить пытается построить что много точек, поэтому проверить, если ответ имеет смысл, я сохранил набор данных, как шейп и график его на ArcGIS:

writeOGR(spdf,"D:/tmp_shapefile4.shp", "flagrv", driver="ESRI Shapefile") 

enter image description here

мне удалось построить его с помощью ggplot2 на код ниже, только будьте терпеливы, поскольку это занимает некоторое время, чтобы построить его:

df=as.data.frame(spdf) 
library(ggplot2) 
ggplot(data=df,aes(x=col,y=row,color=flagrv))+ 
    geom_point(size = 0.01)+ 
    xlab('Longitude')+ 
    ylab('Latitude') 

enter image description here

+0

Я получил эту информацию: Если это имеет смысл - gdal_translate -a_srs EPSG: 4269 FILE.asc FILE.tif – maximusdooku

+0

Это хорошо: это означает, что, основываясь на http://spatialreference.org, изображение имеет проекция NAD83 lat/lon. Проблема в том, что ваши X и Y, очевидно, не lat/lon.Я не вижу ясного способа сделать это, не переводя столбцы строк и столбцов в ваш файл csv в эквивалентные значения lat lon. Если вы это сделаете, вы можете превратить ваши данные в пространственный фрейм данных: проверьте точки и координаты в http://www.maths.lancs.ac.uk/~rowlings/Teaching/UseR2012/cheatsheet.html –

+0

Я конвертирую X/Ys в эквивалентные Lat-Longs? Не могли бы вы помочь с некоторым кодом. Я читаю эту ссылку. Если я смогу это сделать, я смогу сделать остальную часть материала, например, оверлейные границы состояний. – maximusdooku