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

1

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

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

shp2json c029_d00 -o missouri_geo.json

Затем эту команду сделать файл TopoJSON

geo2topo missouri_geo.json > missouri_topo.json

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

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

Буду признателен за любую оказанную помощь.

Теги:
d3.js
shapefile
topojson

1 ответ

1
Лучший ответ

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


Во-первых, географические данные, которые вы загружаете, состоят из пар широты долготы - географические данные, используемые в этом примере, представляют собой предпроектированный топоизон, размер которого соответствует размеру декартовой плоскости 960x600. Вам также потребуется либо предварительно спроектировать ваши данные (аналогично картографической части 1), либо запрограммировать ваши данные "на лету" в вашем блоке с помощью геопата и геопроекта. Майк использует geoProjection в своем блоке, null geoProjection, по умолчанию geoProjection для geoPath. Нулевой проектор просто берет координаты в 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"}}

Выводятся из шейп файла:

Изображение 174551

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

  • Создайте код FIPS из данных, которые у вас есть.

Из NOAA (наиболее сжатое определение я нашел):

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

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

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)); })

Вот что это могло бы выглядеть.

  • 0
    Большое спасибо, что нашли время ответить на это так же тщательно, как и вы. Очевидно, я очень новичок в этом, поэтому, когда я впервые попытался это сделать, у меня возникло много информации, которую я нашел при создании геопроекции. Но я думаю, что начинаю понимать, как Майк использовал geoProjection, чтобы получить topoJSON именно так, как он этого хотел.
  • 0
    На самом деле я нашел учебник по картографии из командной строки вскоре после того, как опубликовал этот вопрос, и в нем я нашел эту ссылку, которая является методом, который я использовал для создания geoProjection for Missouri. После генерации файла topoJSON и объединения строки и округа при заполнении этой функции, как вы это сделали, я теперь могу успешно просматривать данные о безработице в Миссури. Большое спасибо, это было действительно полезно.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню