PROG0392 - Mercator projection

no tags 

The Mercator projection is a cylindrical map projection presented by the Flemish geographer and cartographer Gerardus Mercator in 1569. In this projection, the angles between the different directions on the map are equal to the angles between the directions on the earth's surface. This includes that all meridians are vertical, and all parallels mutually perpendicular.

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