python图像旋转,
用python实现旋转地球
原始资料
本文只讲最简单最常见的地球正转。
首先你得有一张360度的地图。效果如下图。网上搜一下,有很多这样的图片,很容易获取。
它的特点是高度正好是宽度的一半,因为地球一周有360度,但从南极到北极只有180度。这张360度地图显示了地球在每个纬度和经度的表面效应。仔细观察会发现,南北极变形严重,而中间地带则类似于我们经常看到的地图。
我们称之为经纬度测绘。
基本原理
旋转的地球之所以看起来在旋转,只是因为上面显示的内容在变化。其实起点只是一个圆。我们所做的只是将经纬度图中的像素以合理的方式贴在圆上。然后将图片的帧连接成一个GIF动画。
映射方法是:
1.选择圆中的所有点。
2.计算每个点对应的经纬度。
3.从经纬度图中获取经纬度对应的xy坐标。
4.获取像素写入图片。
5.制作gif
计算过程是比较简单的球面几何,下面用代码解释。
1 获得圆内所有的点
这个比较简单。
img=Image.new(RGBA ,(300,300),黑色)
w=img.size[0]
h=img.size[1]
pxList=[]
pyList=[]
foriinrange(w):
forjinrange(h):
r=math . sqrt((I-w/2)* * 2(j-h/2)* * 2)
ifr150:
pxList.append(i)
pylist . append(j)2 计算经纬度
首先,从平面坐标获得三维坐标。
在球面上的任意一点,都有x2 y2 z2=1的规律。
利用这个原理,我们可以得到圆上每个点的Z值。
根据x,y,z,y,z计算球面的经纬度
为了使计算速度尽可能快,这里使用了numpy。
defcalcSphereXY2XYZ(px,py,maxHeight,longOffset):
v0x=np.array(px)
v0y=np.array
v03=np.subtract(v0x,maxHeight)
v04=np.subtract(v0y,maxHeight)
v1x=np.true_divide(v03,maxHeight)
v1y=np.true_divide(v04,maxHeight)
v07=np.pow
er(v1x,2)
v08=np.power(v1y,2)
v09=np.add(v07,v08)
v0a=np.subtract(1,v09)
v1z=np.power(v0a,1/2)#z
#print('z:',max(v1z),min(v1z))
v1lat=np.multiply(v1y,math.pi/2)#lat
v0lon=np.arctan2(v1z,-v1x)
v1lon=np.add(v0lon,longOffset)#long
v2lon=np.fmod(v1lon,math.pi*2)#long
returnv2lon,v1lat3 获取经纬度对应的xy坐标
就是一个简单的坐标映射
defcalcShpereLatLong2XY(vlon,vlat,width,height):4 获得像素点,并写入图片v3x0=np.multiply(vlon,width/2/math.pi)
v3y0=np.multiply(vlat,height/math.pi)
v3y1=np.add(v3y0,height/2)
v3x2=v3x0.astype(np.integer)
v3y2=v3y1.astype(np.integer)
returnv3x2,v3y2
首先,载入经纬度贴图的素材并转为numpy格式
imgBack=Image.open('EARTH_small.bmp')注意转换后的XY是反的,取点并直接赋值即可width=imgBack.size[0]
height=imgBack.size[1]
imgBack=imgBack.convert('RGBA')
arrayBack=np.array(imgBack)
color=arrayBack[npy,npx]5 GIF制作foriinrange(len(pxList)):
x=pxList[i]
y=pyList[i]
cc=color[i]
#print(cc)
cc=tuple(cc)
img.putpixel((x,y),cc)
使用的是imageio库
frames=[]更多Python知识,请关注Python视频教程!!foriinrange(0,360,10):
a=-i*math.pi/180
img=getPic(a)
str1='temp%03d.png'%i
img.save(str1)
im=imageio.imread(str1)
frames.append(im)
#img.show()
imageio.mimsave('earth.gif',frames,'GIF',duration=0.25)
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。