Коническая проекция Ламберта в d3

Я пытаюсь спроецировать набор точек ([long, lat] кортежи) поверх карты SVG моей родной Австрии:

https://commons.wikimedia.org/wiki/File:Austria-geographic_map-blank.svg

Описание файла SVG в Викимедиа дает название проекции и границы карты:

Конформная коническая проекция Ламберта, данные WGS84
Географические границы карты:

Запад: 17,2° W
Восток: 9,3° з.д.
Север: 49,2 ° с.ш.
Юг: 46.0° с.ш.

Наивный, как я, я думал, что этой информации будет достаточно, чтобы создать правильную проекцию с D3.

Вот что я попробовал первым:

    let gcc = d3.geoConicConformal()
        .fitSize([width, height], bbox)

куда bbox является полигоном GeoJSON, представляющим границы карты, как указано выше.

К сожалению, результат не является правильным прогнозом:

Теперь, читая документы D3, я могу догадаться, что мне нужно указать больше параметров для проекции, например, две стандартные параллели. К сожалению, я понятия не имею, что это такое, и пробовать различные значения вокруг западных и восточных границ карты не сработало. Я предполагаю, что они могут быть получены из того, что я знаю о карте, или, может быть, нет?

Во-вторых, меня смущает то, что проекция не только неправильно повернута, но и неправильно масштабирована - я подумал, используя .fitSize позаботится об этом.

Кто-нибудь может подсказать, как правильно настроить коническую проекцию Ламберта?

1 ответ

Решение

Fitsize будет правильно переводить и масштабировать карту, однако, с помощью конической проекции вам нужно повернуть, и, как вы заметили, установить параллели.

Parallels:

Имеется документированная коническая проекция карты Австрии Ламберта, ее спецификации можно найти здесь или здесь. Параллели, которые, вероятно, являются правильными, в этом случае [46,49], хотя карта, которую вы используете, может быть пользовательской проекцией.

вращение

Теперь вам нужно повернуть карту вдоль оси x по долготе. Конические карты обычно вращаются вдоль оси x и центрированы по оси y (см. Мой ответ здесь для графического объяснения почему (и как параллели меняют вашу проекцию)).

Вращение перемещает мир так, чтобы область интереса была выровнена правильно, так что центральный меридиан карты является вертикальным на вашей карте. Исходя из спецификаций проекции, отмеченных выше, центральный меридиан должен находиться под углом 13 градусов, 20 минут (13,333 градуса), хотя между этими двумя ссылками есть небольшое расхождение. Вращение по оси x установлено в отрицательном значении этого значения.

Используя эти параметры:

d3.geoConicConformal()
    .parallels([46,49])
    .rotate([-13.333,0])
    .fitSize([width,height],bbox)

Мне удалось очень хорошо сочетаться с моим топографическим топографом goto world:

введите описание изображения здесь

Возможно, что изображение svg использует параметры, которые немного отличаются от опубликованных параметров (округление, опечатки) или что параллели выбираются пользователем; тем не менее, это должно быть довольно плотно.

Другие вопросы по тегам