Карта D3.js: как ее повернуть?

Я строю карту Филиппин с d3.js, и по странной причине карта выглядит повернутой слева, так что страна не выглядит так, как она есть на самом деле. Я пытался изменить поле projection.rotate, но, похоже, это не линия коррекции.

        var width = 1060,
        height = 860;

    var svg = d3.select("body").append("svg")
        .attr("width", width)
        .attr("height", height)
        .style("overflow", "auto");

    d3.json("ph.json", function(error, ph) {
      if (error) return console.error(error);

      var subunits = topojson.feature(ph, ph.objects.ph_subunits);

      var projection = d3.geo.albers();
      projection.rotate([-4 ,0]);
      projection.scale(3000);
      projection.center([122.427150, 12.499176]);
      projection.parallels([10, 15])
      projection.translate([width / 2, height / 2]);

      var path = d3.geo.path()
           .projection(projection)
           .pointRadius(2);
      svg.append("path")
        .datum(subunits)
        .attr("d", path);

    });

Это код.

Любая помощь будет отличной!

Спасибо!

1 ответ

Проекции Альберса могут быть немного хитрыми, если вы не знаете, какие преобразования лежат в основе.

Это проекция Альберса по умолчанию с ее параллелями, установленными на 10 и 15 .parallels([10,15]), как и в вашем вопросе, а шкала 100 (поворот и центр будут по умолчанию равны [0,0]):

Основные Альберс

Эта форма обусловлена ​​конической природой проекции. Если южные параллели выбраны, вогнутость обратная. Более экстремальные широты / параллели приведут к большему изгибу. Выбранные параллели должны проходить через интересующую вас область, так как область вблизи параллелей - это то, где искажение сведено к минимуму.

Если бы мы хотели сказать, сфокусируйтесь на Австралии (я приведу параллели, аналогичные приведенному выше, для демонстрации):

Австралия клип

Мы могли бы просто использовать географический центр Австралии в качестве центра проекции .projection.center([x,y]) и масштабировать до соответствующего уровня .projection.scale(1000):

Австралия

Единственное изменение состоит в том, что Австралия больше, она все еще искажена, как и в углу карты, и меньше. Он был смещен вверх / вниз и влево / вправо, а затем увеличен без других преобразований.

Как предполагает ваш вопрос, вращение - это решение проблемы показа областей, находящихся не вблизи основного меридиана.

Если мы повернем первую карту (которая совпадает со второй картой) на 100 градусов долготы .projection.rotate([100,0]), мы получаем:

Albers100Degrees

Мир развернулся на 100 градусов, и воображаемая линия, проведенная вертикально через центр карты, выравнивается с меридианом на -100 градусов долготы или 100 градусов на запад.

Если наша сфера интересов - Центральная Америка (для которой будут использоваться параллели, которые вы использовали - и я продолжал использовать -), то следующим шагом будет смещение центра карты вверх и вниз вдоль центрального меридиана проекции. Для Центральной Америки этот сдвиг может составить 20 градусов: .projection.center([0,20]), С соответствующим масштабом, скажем, 1000 результат будет выглядеть так:

окончательный

Таким образом, для Филиппин, используя ваши координаты центра [122.427150, 12.499176] и параллели, идеальная проекция Альберса может выглядеть следующим образом:

        projection.rotate([-122.427150,0])
              .center([0,12.499176])
              .scale(1200)
              .parallels([10,15]);

Который для меня принес: окончательный

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