Submit | All submissions | Best solutions | Back to list |
PROG0392 - Mercator projection |
The Mercator projection is very important for shipping, as a line of constant course (rhumb line) is a straight line on the map. Although the projection was used frequently in the past, and still is, especially in shipping, it is now considered less suitable for more common world maps in atlases and the like. No projection can display the earth on a flat surface without causing deformations. In the Mercator projection surface deformations occur, in which areas are stretched as they are farther from the equator; the poles are even infinitely magnified. According to this projection Greenland is about as large as the continent of Africa, while in reality it is about 17 times smaller, i.e. the size of the Arabian Peninsula. Another disadvantage is that the shortest route between two points, the great circle, is not a straight line in this map projection.
The projection converts degrees longitude $\lambda$ and degrees latitude $\phi$ to a $(x,y)$ co-ordinate on a rectangle of $360 \times 180$ as follows: $$x=(\lambda-\lambda_0+180 \pmod{360}) - 180$$ $$y=15\cdot ln \left( \frac{1+sin(\phi)}{1-sin(\phi)} \right)$$ In which $\lambda_0$ equals the degrees longitude of the point in the center of the map with the co-ordinates $(0,0)$. Furthermore, $x\pmod{360}$ equals the rest after the division of $x$ by 360 and the function $ln$ takes the logarithm with the natural basis. The aim of this assignment is to write a program that takes the 3 values $\lambda$, $\lambda_0$ and $\phi$ as input and calculates the $x,y$ co-ordinates.
To solve this exercise you need functions from the math module. These functions are not available by default in a Python program, but you can make them readily available by placing the next line on top of your code.
import math
Which functions are available in the math module, can be seen by entering the following commands in an interactive Python session:
>>> import math >>> help(math)
Or by visiting http://docs.python.org/3.2/library/math.html.
The sine of $\frac{\pi}{2}$ can be calculated by means of the following code fragment:
import math angle = math.pi value = math.sin(angle / 2) print(value)
Note that the sine function needs the angle in radians, which means $\phi$ must be converted to radian (for which there is also a function in the math module).
Input
3 real numbers $\lambda_0$, $\lambda$ and $\phi$, representing respectively the degrees of longitude of the point in the middle, the degrees of longitude and the degrees of latitude of the point needing to be calculated.
Output
The x and y co-ordinate of the point in question on a rectangle of $360 \times 180$ of which the point with co-ordinates $(x, y)$ lies in the middle of the rectangle.
Example
Input:
0 10 45
Output:
x: 10.0 y: 26.44120761058629
De mercatorprojectie is een kaartprojectie die genoemd is naar de Vlaamse cartograaf Gerardus Mercator, die deze projectie in 1569 introduceerde. Bij deze projectie zijn de hoeken tussen verschillende richtingen op de kaart gelijk aan de hoeken tussen die richtingen op het aardoppervlak. Dit betekent onder andere dat alle meridianen er verticaal, en alle parallellen onderling loodrecht staan.
De mercatorprojectie is van groot belang voor de scheepvaart, omdat een lijn van constante kompaskoers (loxodroom) op de kaart een rechte lijn is. Hoewel de projectie daarom, zeker in het verleden, veelvuldig is toegepast en in de scheepvaart nog steeds, wordt zij tegenwoordig voor meer algemene wereldkaarten in atlassen en dergelijke minder geschikt geacht. Geen enkele projectie kan de Aarde weergeven op een plat vlak zonder vervormingen weer te geven. Bij de mercatorprojectie treden oppervlaktevervormingen op, waarbij gebieden groter worden weergegeven naarmate ze verder van de evenaar liggen; op de polen zelf treedt zelfs een oneindige vergroting op. Volgens deze projectie is Groenland ongeveer even groot als het continent Afrika, terwijl het in werkelijkheid zo'n 17 maal kleiner is, dat wil zeggen: zo groot als het Arabisch schiereiland. Een ander nadeel is dat de kortste route tussen twee punten, de orthodroom, geen rechte lijn is bij deze kaartprojectie.
De projectie zet een lengtegraad $\lambda$ en een breedtegraad $\phi$ als volgt om naar een $(x,y)$ coördinaat op een rechthoek van $360 \times 180$: $$x=(\lambda-\lambda_0+180 \pmod{360}) - 180$$ $$y=15\cdot ln \left( \frac{1+sin(\phi)}{1-sin(\phi)} \right)$$ Hierbij is $\lambda_0$ gelijk aan de lengtegraad van het punt in het midden van de kaart, het punt met coördinaat $(0,0)$. Verder is het zo dat $x\pmod{360}$ gelijk is aan de rest na deling door 360 van $x$ en de functie $ln$ neemt het logaritme met de natuurlijke basis. De bedoeling van deze opgave is om een programma te schrijven dat de 3 waardes $\lambda$, $\lambda_0$ en $\phi$ als input neemt, en de $x,y$ coördinaten berekent.
Om deze oefening op te lossen heb je functies uit de math module nodig. Deze functies zijn niet standaard beschikbaar in een Python programma, maar je kan ze gemakkelijk beschikbaar maken door de volgende regel bovenaan je programmacode te plaatsen.
import math
Welke functies er allemaal voorhanden zijn in de math module, kan je bekijken door de volgende commando's uit te voeren in een interactieve Pythonsessie:
>>> import math >>> help(math)
Of door te kijken op http://docs.python.org/3.2/library/math.html.
De sinus van $\frac{\pi}{2}$ kan bijvoorbeeld met behulp van volgend codefragment berekend worden:
import math hoek = math.pi waarde = math.sin(hoek / 2) print(waarde)
Let er ook op dat de sinusfunctie de hoek in radialen nodig heeft. $\phi$ moet dus omgezet worden naar radialen (hiervoor bestaat ook een functie in de math module).
Invoer
3 reële getallen $\lambda_0$, $\lambda$ en $\phi$ die respectievelijk de lengtegraad van het punt in het midden, de lengtegraad van het te berekenen punt en de breedtegraad van het te berekenen punt voorstellen
Uitvoer
De x en y coördinaat van het berekende punt op een rechthoek van $360 \times 180$ waarbij het punt met coördinaat $(x, y)$ in het midden van de rechthoek ligt.
Voorbeeld
Invoer:
0 10 45
Uitvoer:
x: 10.0 y: 26.44120761058629
Added by: | Peter Dawyndt |
Date: | 2013-06-03 |
Time limit: | 10s |
Source limit: | 50000B |
Memory limit: | 1536MB |
Cluster: | Cube (Intel G860) |
Languages: | PY_NBC |
Resource: | None |