6 votos

¿Convertir un rango de coordenadas de 360 grados en un rango de longitud de +/-180 en R?

Estoy trabajando con datos sobre las corrientes superficiales del mar de ftp://podaac-ftp.jpl.nasa.gov/allData/oscar/preview/L4/oscar_third_deg Los datos tienen las latitudes y longitudes guardadas en el siguiente formato:

latitude  Size:481
units: degrees-north
long_name: Latitude
longitude  Size:1201
units: degrees-east
long_name: Longitude

head(lon)
[1] 20.00000 20.33333 20.66667 21.00000 21.33333 21.66667
tail(lon)
[1] 418.3333 418.6667 419.0000 419.3333 419.6667 420.0000

¿Cómo puedo convertir esto en unidades de latitud-longitud en R?

El objeto lon va de 20 a 420 mientras que yo quiero que vaya de -180 a 180.

He visto Convertir las coordenadas Norte y Este en longitud y latitud en R en Stack Overflow pero no soy capaz de adaptarlo a mi configuración.

x <- nc_open("oscar_vel1992.nc")
# lon
lon <- ncvar_get(x,"longitude")
#lat
lat <- ncvar_get(x,"latitude")
z <-as.numeric(char2dms(lat))

7voto

Jay Bazuzi Puntos 194

Los datos van de 20 a 420, lo que supone incluir algunas zonas más de una vez porque lo dicen los metadatos:

NC_GLOBAL#NOTE2=Longitude extends from 20 E to 420 E to avoid a break in major ocean basins. Data repeats in overlap region.

Así que tenemos que dividir los datos en la sección de 20 a 360 y la sección de 360 a 380 y poner esa sección de 360 a 380 a la izquierda de la sección de 20 a 360. No necesitamos la sección de 380 a 420 porque se superpone.

Así que...

library(raster)

definir dos extensiones para cortar la trama. La extensión "Y" sólo tiene que ser mayor que la trama, así que voy hasta 90:

e1 = extent(c(xmin=20,xmax=360,ymin=-90,ymax=90))
e2 = extent(c(xmin=360, xmax=360+20, ymin=-90, ymax=90))

Cargue la trama - estoy cargando sólo la capa "vm", tendrá que repetir sobre las demás:

d = raster("./oscar_vel7001.nc",varname="vm")

Ahora dividimos los trozos que queremos utilizando las extensiones:

d1 = crop(d,e1)
d2 = crop(d,e2)

A continuación, desplaza el bit a la derecha para llenar el espacio de 0 a 20:

xmin(d2)=xmin(d2)-360
xmax(d2)=xmax(d2)-360

merge pegará las dos partes, dándonos una trama de 0 a 360, y rotate lo cambiará para que sea de -180 a 180:

dm = rotate(merge(d1,d2))
plot(d)
plot(dm)

muestra el mapa de superposición desplazado original y el mapa corregido de -180 a +180:

enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X