我知道我们可以使用matplotlib
创建简单的三维球体,documentation中包含此类球体的示例。
现在,我们还有一个warp
方法作为matplotlib模块的一部分,它的一个例子是here。
将圆柱形图像扭曲到球体。是否可以结合这些方法来创建3D可旋转地球?除非我对这个问题的思考方式有所不同,否则似乎能够做到这一点你必须获取图像的像素数据,然后使用沿着3D球体表面的sin和余弦表达式绘制每个像素。在第一个例子中创建。可以找到这些圆柱形地图的一些示例here
我知道通过maya
和blender
执行此操作的其他方法,但我试图保持在matplotlib
范围内,因为我想要创建此图,然后是能够使用数据数组将地理空间数据绘制到表面。
答案 0 :(得分:8)
有趣的问题。我试图基本遵循@Skeletor概述的思路,并映射图像,以便可以用plot_surface
显示:
import PIL
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
# load bluemarble with PIL
bm = PIL.Image.open('bluemarble.jpg')
# it's big, so I'll rescale it, convert to array, and divide by 256 to get RGB values that matplotlib accept
bm = np.array(bm.resize([d/5 for d in bm.size]))/256.
# coordinates of the image - don't know if this is entirely accurate, but probably close
lons = np.linspace(-180, 180, bm.shape[1]) * np.pi/180
lats = np.linspace(-90, 90, bm.shape[0])[::-1] * np.pi/180
# repeat code from one of the examples linked to in the question, except for specifying facecolors:
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.outer(np.cos(lons), np.cos(lats)).T
y = np.outer(np.sin(lons), np.cos(lats)).T
z = np.outer(np.ones(np.size(lons)), np.sin(lats)).T
ax.plot_surface(x, y, z, rstride=4, cstride=4, facecolors = bm)
plt.show()
答案 1 :(得分:3)
这是我几个小时前做的:
首先我们导入所需的库:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import imageio
其次,我们制作数字并将它们存储为png在我们的目录中:
请注意,我写了range(0,330,20)
for i in range(0,330,20):
my_map = Basemap(projection='ortho', lat_0=0, lon_0=i, resolution='l', area_thresh=1000.0)
my_map.bluemarble()
my_map.etopo()
name=str(i)
path='/path/to/your/directory/'+name
plt.savefig(path+'.png')
plt.show()
plt.clf()
plt.cla()
plt.close()
最后我们可以在动画GIF中加入所有图像:
images = []
for f in range(0,330,20):
images.append(imageio.imread("/path/to/your/directory/"+str(f)+".png"))
imageio.mimsave('movie.gif', images, duration=0.5)
答案 2 :(得分:0)
我可以想象以下解决方案: 使用numpy.roll,您可以在每次调用时将数组移动一列(更多)。因此,您可以将地球表面的图像加载为numpy数组作为模板,并将旋转后的图像导出为jpg。您可以如warp示例所示绘制。