Проблемы с созданием TopoJSON для использования с примером D3 Choropleth

Итак, я следовал этому руководству https://bl.ocks.org/mbostock/4060606. Простое копирование и вставка его кода позволяет мне увидеть эту функциональность в действии. Но хотелось бы сделать то же самое, но в масштабах государства, а не всей страны. Итак, я пошел на веб-сайт бюро переписи и скачал шейп-файл для округов Миссуи, но у меня возникли трудности с воссозданием файла TopoJSON Майка. На самом деле, я занимался этим несколько дней, возился с TopoJSON, но все примеры, которые я нашел, используют устаревшие инструменты командной строки topojson. Поскольку этого больше не существует, я был вынужден выяснить для себя, как генерировать в том же формате TopoJSON, но безуспешно. Я просто не могу преобразовать шейп-файл в тот же формат TopoJSON, который Майк использует в этом руководстве.

Итак, вот как я это делаю. Я получаю свой Shapefile с этого веб-сайта https://www.census.gov/geo/maps-data/data/cbf/cbf_counties.html и перейдите на вкладку «Перепись 2000 года» (потому что я не знаю, как еще получить с этого веб-сайта только округа штата Миссури), затем выбор и загрузка Миссури. Затем я разархивирую загруженный файл и перемещаю файлы .shp и .dbf в отдельную папку. Затем я запускаю эту команду для создания файла GeoJSON:

shp2json c029_d00 -o missouri_geo.json

Затем эта команда для создания файла TopoJSON

geo2topo missouri_geo.json > missouri_topo.json

Когда я сравниваю формат моего файла TopoJSON с файлом TopoJSON Майка, они в чем-то похожи, но в моем файле TopoJSON, похоже, отсутствует часть форматирования. Я понимаю, что поскольку мой файл сделан из шейп-файла только штата Миссури, в нем уже будут отсутствовать данные, но я думал, что мой файл TopoJSON будет иметь такие атрибуты, как атрибут 'id', содержащий коды FIPS для округов, но мой в файле этого нет. Я хочу понять процесс преобразования шейп-файла в файл TopoJSON, который можно использовать с кодом Майка из его примера, но я не могу этого понять.

Обратите внимание, мой код javascript и html точно такой же, как у Майка в его примере. В моем файле TopoJSON я изменил строку после "objects":{ на "counties", чтобы она соответствовала строке в коде javascript us.objects.counties. Когда я запускаю свой код и проверяю его, я не получаю никаких ошибок, но ничего не появляется. Я ничего не вижу в своем браузере.

Любая помощь горячо приветствуется.


person Michael    schedule 06.12.2017    source источник


Ответы (1)


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


Во-первых, загружаемые вами географические данные состоят из пар широта-долгота. Географические данные, используемые в примере, представляют собой предварительно спроецированные топозоны, размер которых соответствует декартовой плоскости 960x600. Вам также нужно будет предварительно спроектировать свои данные (аналогично картография из командной строки, часть 1), или спроецируйте свои данные на лету в своем блоке, используя geoPath и geoProjection. Майк использует геопроекцию в своем блоке, нулевую геопроекцию, геопроекцию по умолчанию для геоПути. Нулевая проекция просто берет координаты в json и использует их как координаты svg без преобразования.

Проблемы с проекцией, вероятно, являются наиболее распространенной причиной отсутствия признаков или ошибок. Поскольку вы не указали проекцию, объекты, скорее всего, отображаются за пределами экрана. Поскольку континентальная часть США находится в западном полушарии, значения долготы отрицательны — США будут нарисованы слева от начала координат, т. е. за пределами экрана, поскольку вы используете нулевую проекцию.


Вторая потенциальная проблема для вас заключается в том, что ваши данные имеют другие атрибуты, чем в примере:

Я думал, что мой файл TopoJSON будет иметь такие атрибуты, как атрибут «id», который содержит коды FIPS для округов.

Атрибуты функции вашего топожсона:

"properties":{"AREA":0.140669542963654,
"PERIMETER":1.69104063251173,
"CO29_D00_":2,
"CO29_D00_I":1,
"STATE":"29",
"COUNTY":"045",
"NAME":"Clark",
"LSAD":"06",
"LSAD_TRANS":"County"}}

Получаются из шейп-файла:

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

Поскольку вы используете источник, отличный от Майка, атрибуты данных могут отличаться. Поскольку у источника нет идентификатора FIPS, вы не можете выполнить соединение между вашими негеографическими данными и вашими географическими объектами, как в примере. Однако есть не слишком сложное решение:

  • Создайте код FIPS на основе имеющихся у вас данных.

Из NOAA (самое краткое определение, которое я нашел):

Первые две цифры относятся к штату, а последние три обозначают округ или эквивалент округа. Таким образом, у каждого штата есть свой собственный 2-значный номер, а у каждого округа в штате есть свой собственный 3-значный номер, которые объединяются в 5-значный номер для уникальной идентификации каждого округа США. (источник)

У вас есть число, представляющее штат и округ — можно с уверенностью сказать, что это ваш код округа FIPS в сочетании. Вы можете комбинировать их при создании своего гео/топойсона, вы можете создать новое свойство непосредственно перед рисованием функций геоджсона:

var features = topojson.feature(us, us.objects.counties).features;
features.forEach(function(d) {
   d.FIPS = "" + d.properties.STATE + d.properties.COUNTY;
})

или вы можете объединить строку и округ при заполнении функции:

.attr("fill", function(d) { return color(d.rate = unemployment.get(
""+d.properties.STATE+d.properties.COUNTY)); })

Вот как это может выглядеть.

person Andrew Reid    schedule 07.12.2017
comment
Большое спасибо за то, что нашли время, чтобы ответить на этот вопрос так подробно, как вы это сделали. Очевидно, я очень новичок в этом, поэтому, когда я впервые попытался это сделать, много информации, которую я нашел при создании геопроекции, прошло мимо моей головы. Но я думаю, что начинаю понимать, как Майк использовал geoProjection, чтобы получить topoJSON именно так, как он хотел. - person Michael; 08.12.2017
comment
На самом деле я нашел руководство по картографии из командной строки вскоре после того, как разместил этот вопрос, и в нем я нашел это link, который я использовал для создания геопроекции для Миссури. После создания файла topoJSON и объединения строки и округа при заполнении функции, как вы сделали, я теперь могу успешно просматривать данные по безработице для Миссури. Большое спасибо, это было действительно полезно. - person Michael; 08.12.2017
comment
Рад, что смог помочь. - person Andrew Reid; 08.12.2017