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]
]
Entonces, robando el ImageCompose
idea de Yu-Sung:
pl=ImageCompose[night, SetAlphaChannel[day, mask]]
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
]
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.
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]]
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"]
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.