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.