Trazar datos de mapas cilíndricos sobre una esfera 3D en Python

Supongamos que tengo una imagen con un mapa cilíndrico de un planeta, digamos uno de estos:

http://www.johnstonsarchive.net/spaceart/cylmaps.html

Y quiero trazarlo sobre una esfera 3D para recuperar la figura original del planeta.

¿Hay alguna manera de hacerlo usando un paquete de Python como matplotlib, mayavi, mapa base o similar?

Actualización : esta es la nueva versión que usa Cartopy, ya que el mapa base es EOL . A continuación se muestra la respuesta original.

import matplotlib.pyplot as plt import cartopy.crs as ccrs img = plt.imread("/tmp/venuscyl4.tif") plt.figure(figsize=(3, 3)) ax = plt.axes(projection=ccrs.Orthographic(-10, 45)) ax.gridlines(color='black', linestyle='dotted') ax.imshow(img, origin="upper", extent=(-180, 180, -90, 90), transform=ccrs.PlateCarree()) # Important plt.show() 

Mapa de Venus utilizando Cartopy


Gracias a la respuesta de Raphael Roth, finalmente encontré lo que estaba buscando: el método de mapa base warpimage .

Aquí hay un ejemplo muy mínimo. Usando este mapa cilíndrico de Venus , y basado en el ejemplo simple del libro de cocina :

 from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt import numpy as np # set up orthographic map projection with # perspective of satellite looking down at 50N, 100W. # use low resolution coastlines. # don't plot features that are smaller than 1000 square km. bmap = Basemap(projection='ortho', lat_0 = 50, lon_0 = -100, resolution = 'l', area_thresh = 1000.) # plot surface bmap.warpimage(image='venuscyl4.jpg') # draw the edge of the map projection region (the projection limb) bmap.drawmapboundary() # draw lat/lon grid lines every 30 degrees. bmap.drawmeridians(np.arange(0, 360, 30)) bmap.drawparallels(np.arange(-90, 90, 30)) plt.show() 

produce la siguiente salida:

Mapa de la esfera de venus

El kit de herramientas de mapa base es ideal para esta tarea.

El problema parece ser que realmente no tiene los datos, es decir, algo como lat, lon, valor para cada píxel. El problema también es que para una imagen dada, normalmente no conoce la proyección que se utilizó para crear la imagen, por lo tanto, no puede hacer la transformación inversa para obtener los datos originales.

Si solo desea trazar una imagen de la Tierra, use la función bluemarble () del kit de herramientas de mapa base:

http://wiki.scipy.org/Cookbook/Matplotlib/Maps