Итак, я следую этому руководству 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
. Когда я запускаю свой код и проверяю его, я не получаю никаких ошибок, но ничего не появляется. Я ничего не вижу в своем браузере.
Буду признателен за любую оказанную помощь.
Есть несколько потенциальных проблем в копировании этой карты для одного состояния, и, похоже, вы столкнулись с некоторыми из них. Вам нужно будет отклониться от примера больше, чем у вас.
Во-первых, географические данные, которые вы загружаете, состоят из пар широты долготы - географические данные, используемые в этом примере, представляют собой предпроектированный топоизон, размер которого соответствует размеру декартовой плоскости 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"}}
Выводятся из шейп файла:
Поскольку вы используете другой источник, кроме Майка, атрибуты данных могут быть разными. Поскольку у источника нет идентификатора 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)); })
Вот что это могло бы выглядеть.