Animerade akvarell karta för Cycle Tour/tävlingen videor (6 / 9 steg)
Steg 6: Rita banan
Rita en bana måste vi konvertera GPS-koordinater till något som vi kan relatera till x, y-koordinaterna för en bild. Eftersom bilden som genererade vi bygger på Mercator projektion, har någon vågrät/lodrät linje i det en tillhörande latitud eller longitud.
Subtrahera lat, gör lon i nordvästra hörnet från varje koordinat effektivt den Northwest koordinaten korrelerar med pixel (0,0).
Värdena måste skalas så att en koordinat i sydvästra hörnet är korrelerat till (X resolutionen, Y-upplösning) pixel. För att göra detta vi bestämma lat, lon punkt (i förhållande till det nordvästra hörnet) som en procentandel av bildens lat, lon utbud och multiplicera med upplösningen i den riktningen. Lat, lon utbud helt enkelt (norra gränsen - södra gränsen, öst gränsar - västra gränsen).
### Rita sökvägen bilden ###
def drawTraceMask(trace,xResolution,yResolution,traceBoundaries,zoom,filename):
importera bild
importera ImageDraw
# Få XY antal NW och SE hörnrutor
xy_nw = deg2num(traceBoundaries["north"],traceBoundaries["west"],zoom)
xy_se = deg2num(traceBoundaries["south"],traceBoundaries["east"],zoom)
# få lat, lon hörn
# (sedan returnerar funktionen NW hörnet av en bricka,
# behöver vi lat, lon X + 1, Y + 1 för SE hörn)
NW = num2deg(xy_nw[0],xy_nw[1],zoom)
SE = num2deg(xy_se[0]+1,xy_se[1]+1,zoom)
# Bild gränserna är faktiskt annorlunda, eftersom
# de är gränserna för kakel, inte tracen
# definiera de nya gränserna
mapBoundaries = {}
mapBoundaries = ["norra"] NW [0]
mapBoundaries = ["söderut"] SE [0]
mapBoundaries = ["väst"] NW [1]
mapBoundaries = ["österut"] SE [1]
# Offset så att NW hörnet är 0,0
latOffset =-(mapBoundaries["north"])
latDivisor = mapBoundaries ["norra"]-mapBoundaries ["söderut"]
lonOffset =-(mapBoundaries["west"])
lonDivisor = mapBoundaries ["österut"]-mapBoundaries ["väst"]
ut = Image.new ("RGB", (x-upplösning, yResolution))
Rita = ImageDraw.Draw(out)
firstRun = sant
för lat, lon i spår:
# Konvertera nollställt lat, lon i x, y koordinater
# Detta behöver korrigering för norra halvklotet
x = abs (int (x-upplösning * ((lon + lonOffset)/lonDivisor)))
y = abs (int (yResolution * ((lat + latOffset)/latDivisor)))
om firstRun:
firstRun = False
annat:
Draw.line((x,y,xPrev,yPrev),Fill="White",width=10)
xPrev = x
yPrev = y
del draw
out.Save(OS.Path.Join(OS.CurDir,filename))