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?

È stato utile?

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:

Wikipedia

Stessa domanda

Stessa domanda 2

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top