D3.js - Переход от path.area в версии 2 к версии 4

Я пытаюсь обновить d3-картограмму для работы с D3.js версии 4. Пока что все идет хорошо - я только что обновил все функции, чтобы они были записаны в сглаженном пространстве имен версии 4. Например,, вместо d3.geo.path(), его d3.geoPath(), Я также изменил несколько небольших вещей, чтобы код работал с последней версией TopoJSON. Например, вместо topojson.object(topology, geom).coordinates, его topojson.feature(topology, geom).geometry.coordinates,

Но я столкнулся с проблемой, которую не могу решить. Файл cartogram.js есть строка, которая читает var areas = objects.map(path.area), где objects это коллекция функций TopoJSON. path.area отличается в D3.js версий 2 и 4, и я не могу их согласовать. Если я буду консоль регистрации в каждой версии, это выглядит так:

  • Версия 2: function (n){return n&&e.hasOwnProperty(n.type)?e[n.type](n):t}
  • Версия 4: function (t){return U_(t,r(Ag)),Ag.result()}

В версии 4 регистрируется ошибка: Uncaught TypeError: r is not a function, Естественно, я уже погуглил ошибку вместе с различными описаниями того, что я пытаюсь сделать, но мне не повезло. Заранее благодарю за любую помощь.

1 ответ

Решение

Как подсказывает Марк, для отладки следует использовать неминифицированный код. Соответствующий неминифицированный код из path / index.js выглядит следующим образом:

path.area = function(object) {
  stream(object, projectionStream(pathArea));
  return pathArea.result();
};

Ваша ошибка говорит о том, что projectionStream не является функцией; это, вероятно, не определено. Поток проекции задается путем .projection, и, как указано в документации, указаннаяпроекция должна реализовывать проекцию.stream. (Эта ошибка не исполняется жадно, когда вы устанавливаете проекцию. Она лениво выбрасывается, когда вы пытаетесь использовать путь.)

Проблема здесь в том, что путь.projection D3 3.x поддерживал концепцию "резервной проекции", которая представляла собой простую функцию, принимающую массив долготы-широты в качестве входных данных и возвращающую массив xy в качестве выходных данных. D3 3.x неявно обернул бы это в объект проекции по умолчанию, чтобы добавить такие функции, как адаптивная выборка и антимедианское резание D3 4.0 удалил эту функцию, заставив вас быть явным: вы должны реализовать проекцию.stream, чтобы использовать d3.geoPath.

ИЗМЕНЕНИЯ:

"Резервные проекции" - когда вы передаете функцию, а не проекцию на путь. Проекция- больше не поддерживаются. Для географических проекций используйте d3.geoProjection или d3.geoProjectionMutator, чтобы определить собственную проекцию. Для произвольных преобразований геометрии реализуйте интерфейс потока; см. также d3.geoTransform.

Всякий раз, когда вы обращаетесь за помощью, я рекомендую ссылаться на живой пример, который демонстрирует вашу проблему, поскольку небольшой фрагмент кода и описания часто недостаточен для выявления проблемы. Здесь неясно, какую проекцию вы пытаетесь использовать с d3.geoPath. Для плоских преобразований вы, скорее всего, захотите использовать d3.geoTransform или d3.geoIdentity. Для сферически-плоских проекций вы захотите использовать d3.geoProjection или d3.geoProjectionMutator.

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