Calcolare la posizione Y dalla latitudine in gradi di proiezione mercator
-
20-09-2019 - |
Domanda
Sto cercando di calcolare la posizione Y su una mappa con la proiezione di Mercatore data la latitudine in gradi. Ecco cosa ho bisogno:
//mapHeight might be 600 (pixels), for example
//latitudeInDegrees ranges from -90 to 90
public double CalculateY(double mapHeight, double latitudeInDegrees)
{
//what on earth do I do here to calculate the Y offset on the map?
return ???;
}
Ho provato un sacco di cose che ho trovato on-line (tra cui Wikipedia e StackOverflow), ma nessuna di queste ha funzionato per me. Probabilmente sto facendo qualcosa di stupido, ma io non riesco a capire cosa. Qualcuno può salvare la mia sanità mentale?
Soluzione
public double CalculateY(double mapHeight, double latitudeInDegrees)
{
return Math.Log(Math.Tan(latitudeInDegrees / 360d * Math.PI + Math.PI / 4));
}
Non ricordo scala y con mapHeight (si dovrebbe conoscere il valore massimo e minimo di latitudeInDegrees per taht)
Citazione da Wikipedia:
A latitudini superiori a 70 ° nord o a sud, la proiezione di Mercatore è praticamente inutilizzabile.
Si dovrebbe scrivere il codice in questo modo:
private double CalculateYRelative(double latitudeInDegrees)
{
return Math.Log(Math.Tan(latitudeInDegrees / 360d * Math.PI + Math.PI / 4));
}
...
minY = CalculateYRelative(MinLatitudeInDegrees);
maxY = CalculateYRelative(MaxLatitudeInDegrees);
...
public double CalculateY(double mapHeight, double latitudeInDegrees)
{
return mapHeight*
(CalculateYRelative(latitudeInDegrees) - minY) / (maxY - minY);
}
Per ulteriori informazioni: