Рассчитать положение Y по широте в градусах на проекции Меркатора - PullRequest
4 голосов
/ 10 октября 2009

Я пытаюсь вычислить позицию Y на карте с проекцией Меркатора, учитывая широту в градусах. Вот что мне нужно:

//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 ???;
}

Я пробовал все виды вещей, которые я нашел в Интернете (включая википедию и стекопоток), но ничего из этого не помогло мне. Я, вероятно, делаю что-то глупое, но я не могу понять, что. Кто-нибудь может спасти мое здравомыслие?

1 Ответ

4 голосов
/ 10 октября 2009
public double CalculateY(double mapHeight, double latitudeInDegrees)
{
    return Math.Log(Math.Tan(latitudeInDegrees / 360d * Math.PI + Math.PI / 4));
}

Не помню масштаб y с mapHeight (вы должны знать максимальное и минимальное значение latitudeInDegrees для taht)

Цитата из Википедии:

На широтах выше 70 ° северной широты или юг, проекция Меркатора практически непригоден для использования.

Вы должны написать код, подобный этому:

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);
}

Для получения дополнительной информации:

Википедия

Тот же вопрос

Тот же вопрос 2

...