Saltar al contenido

Composición: ¿cómo hacer un mapamundi diurno y nocturno?

Clara, miembro de este equipo, nos ha hecho el favor de redactar este tutorial ya que controla perfectamente el tema.

Solución:

Primero déjame nombrar tus mapas correctamente (cambiaste los mapas de día y de noche):

night= Import["http://eoimages.gsfc.nasa.gov/images/imagerecords/55000/55167/earth_lights_lrg.jpg"];
day= Import["http://eoimages.gsfc.nasa.gov/images/imagerecords/57000/57752/land_shallow_topo_2048.tif"];

Las imágenes tienen diferentes tamaños:

ImageDimensions[day]

(*
==> 2048, 1024
*)

ImageDimensions[night]

(*
==> 2400, 1200
*)

entonces, reescalé la imagen nocturna. Los artefactos (si los hay) probablemente serán menos visibles allí.

night = ImageResize[night, ImageDimensions[day]];

Ahora bien, para el cálculo de la máscara no necesitamos utilizar fuentes externas. AstronomicalData servirá:

mask =
 Rasterize[
  RegionPlot[
   AstronomicalData["Sun", "Altitude", 2012, 6, 21, lat, long] <
     0, long, -180, 180, lat, -90, 90, Frame -> None, 
   PlotRange -> Full, PlotStyle -> Black, PlotRangePadding -> 0, 
   AspectRatio -> (#2/#1 & @@ ImageDimensions[day])],
  ImageSize -> ImageDimensions[day]
  ]

gráficos matemáticos

Entonces, robando el ImageCompose idea de Yu-Sung:

pl=ImageCompose[night, SetAlphaChannel[day, mask]]

gráficos matemáticos

Tomando prestado y adaptando algo de código del Texture página del documento:

Show[
 Graphics3D[White, Tube[0, 0, -1.4, 0, 0, 1.4, .04]],
 SphericalPlot3D[1 , u, 0, Pi, v, 0, 2 Pi, Mesh -> None, 
  TextureCoordinateFunction -> (#5, 1 - #4 &), 
  PlotStyle -> Texture[Show[pl, ImageSize -> 1000]], 
  Lighting -> "Neutral", Axes -> False, RotationAction -> "Clip"], 
 Lighting -> "Neutral", Boxed -> False, 
 Method -> "ShrinkWrap" -> True
]

gráficos matemáticos

Sí, la idea básica está aquí: Demostración: Reloj mundial diurno y nocturno

Ahora, para usar las imágenes, cree un canal alfa usando la curva día-noche calculada, llamada curva “terminadora” (rásterícela en escala de grises), y componga dos imágenes usando ImageCompose con los canales alfa generados (SetAlphaChannel a la segunda imagen).

Prueba el siguiente código:

a = Image[ConstantArray[255, 0, 0, 200, 300]];
b = Image[ConstantArray[0, 255, 0, 200, 300]];

(* This is just a made-up mask. Don't mind the Plot[] part *)
mask = Rasterize[
  Plot[Sin[x], x, -Pi/2, 3 Pi/2, PlotRangePadding->0,
    Filling->-1, FillingStyle->Black, Frame->False, 
    Axes->False, ImageSize->300, 200, AspectRatio->2/3],
  "Image", ColorSpace->"GrayScale"];

ImageCompose[a, SetAlphaChannel[b, mask]]

Deberías obtener una imagen con verde y rojo. mixed como a continuación. Ahora puedes reemplazar a y b con tus texturas de día y de noche.

máscara

Tengo que decirte que aunque el código allí calcula una aproximación bastante cercana a la curva terminadora real, no es exacta. Para calcularlo con precisión (o en base a datos reales), consulte: NOAA: Day Night Terminator

El siguiente código y salida es para las imágenes reales (nuevamente, la máscara es falsa):

day = ImageResize[day, 2048, 1024]; (* Match the dimensions *)

mask = Rasterize[
   Plot[Sin[x], x, -Pi/2, 3 Pi/2, PlotRangePadding -> 0, 
    Filling -> -1, FillingStyle -> Black, Frame -> False, 
    Axes -> False, ImageSize -> 2048, 1024, 
    AspectRatio -> 1024/2048], "Image", ColorSpace -> "GrayScale"];

ImageCompose[night, SetAlphaChannel[day, mask]]

producción

Desde la versión 10.0, las funciones DayHemisphere[], NightHemisphere[]y DayNightTerminator[] ahora están integrados y se pueden usar con GeoGraphics[]. Estos tres pueden tomar una fecha específica y, de lo contrario, se establecerán de manera predeterminada Now. Ahora se pueden hacer cosas como esta:

GeoGraphics[GeoStyling[GrayLevel[0, 2/3]], NightHemisphere[], 
            GeoBackground -> GeoStyling["Satellite"], GeoProjection -> "Equirectangular",
            GeoRange -> "World"]

mapa de dia y noche

que luego se puede utilizar como un adecuado Texture[] si quisiera

Comentarios y puntuaciones de la guía

Más adelante puedes encontrar las referencias de otros programadores, tú además eres capaz insertar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *