Обзор нового интерфейса командной строки d3-geo.
[Это часть 1 руководства по созданию тематических карт. Прочтите Часть 2 здесь.]
В этом многоэтапном руководстве вы научитесь создавать тематическую карту из командной строки с помощью d3-geo, TopoJSON и ndjson-cli - бесплатных инструментов с открытым исходным кодом, написанных на JavaScript. Сделаем хороплет плотности населения Калифорнии. (Для дополнительной задачи замените свое состояние выбора!)


Первая часть этого руководства посвящена получению геометрии (многоугольников) и преобразованию этой геометрии в формат, которым можно легко управлять в командной строке и отображать в веб-браузере.
Соединенные штаты. Бюро переписи населения »регулярно издает шейп-файлы картографических границ . В отличие от TIGER - самого подробного и всеобъемлющего геометрического продукта Бюро переписи - файлы картографических границ представляют собой упрощенные представления… специально разработанные для мелкомасштабного тематического картографирования. Другими словами, они идеально подходят для скромного хороплета.
Бюро переписи, как нетрудно догадаться, также публикует данные своих десятилетних переписей, более частых Опросов американского сообщества и других опросов. Чтобы получить представление о большом количестве данных, которые предоставляет Бюро переписи, посетите American FactFinder или дружественный Census Reporter. Теперь мы должны выбрать несколько параметров:
- показатель (например, плотность населения)
- географический объект (например, переписной участок)
- источник (например, оценка ACS 2014 за 5 лет)
Сначала необходимо определить эти параметры, потому что геометрия должна соответствовать данным: если наши оценки численности населения относятся к переписным участкам, нам потребуются полигоны переписных участков. Говоря более тонко, год съемки должен соответствовать геометрии: хотя границы меняются относительно нечасто, они действительно меняются, особенно с небольшими объектами, такими как участки.
Бюро переписи населения услужливо дает рекомендации по отбору правильных данных. Участки переписи достаточно малы, чтобы составить подробную карту, но достаточно велики, чтобы с ними было легко работать. Мы будем использовать пятилетние оценки, которые рекомендуются для небольших компаний и предпочитают точность денежным единицам. 2014 год - это самый последний выпуск на момент написания.

Теперь нам нужен URL! Этот URL-адрес можно найти, выполнив серию щелчков мышью на веб-сайте Бюро переписи населения. Но забудьте об этом и просто просмотрите файлы картографических границ 2014 года здесь:
http://www2.census.gov/geo/tiger/GENZ2014/shp/
Учитывая код FIPS штата (06 для Калифорнии), теперь вы можете использовать curl для загрузки соответствующих полигонов переписных участков:
curl 'http://www2.census.gov/geo/tiger/GENZ2014/shp/cb_2014_06_tract_500k.zip' -o cb_2014_06_tract_500k.zip
Затем распакуйте архив, чтобы извлечь шейп-файл (.shp) и другой мусор:
unzip -o cb_2014_06_tract_500k.zip
(У вас уже должны быть установлены curl и unzip, поскольку они включены в большинство операционных систем. Вам также понадобятся node и npm; в macOS я рекомендую Homebrew Для установки программного обеспечения.)
Быстрый способ проверить, что находится в шейп-файле, - это посетить mapshaper.org и перетащить шейп-файл в свой браузер. Если вы сделаете это с загруженным cb_2014_06_tract_500k.shp, вы должны увидеть что-то вроде этого:

Как показывает Mapshaper, шейп-файлы можно просматривать прямо в браузере. Но с двоичными шейп-файлами может быть сложно работать, поэтому мы преобразуем их в GeoJSON: формат, удобный для чтения человеком. В моем парсере шейп-файлов для этой цели есть интерфейс командной строки shp2json. (Предупреждение: на npm есть несвязанный одноименный пакет.) Для установки:
npm install -g shapefile
Теперь используйте shp2json для преобразования в GeoJSON:
shp2json cb_2014_06_tract_500k.shp -o ca.json
Обратите внимание, что здесь также читается cb_2014_06_tract_500k.dbf, файл dBASE, определяющий свойства объекта в результирующем GeoJSON. Великолепный результат:

Теперь мы можем отобразить это в браузере, используя D3, но сначала мы должны применить географическую проекцию. Избегая дорогостоящих тригонометрических операций во время выполнения, результирующий GeoJSON отображается намного быстрее, особенно на мобильных устройствах. Предварительное проектирование также повышает эффективность упрощения, о чем мы поговорим в части 3. Чтобы установить интерфейс командной строки d3-geo-projection:
npm install -g d3-geo-projection
Теперь воспользуйтесь геопроектом:
geoproject 'd3.geoConicEqualArea().parallels([34, 40.5]).rotate([120, 0]).fitSize([960, 960], d)' < ca.json > ca-albers.json
Эта проекция d3.geoConicEqualArea называется Калифорния Альберс и, как следует из названия, подходит для показа Калифорнии. Это также равноплощадь, что настоятельно рекомендуется для картограмм, поскольку проекция не искажает данные. Если вы не уверены, какую проекцию использовать, попробуйте d3-stateplane или выполните поиск на spacereference.org.
проекция, которую вы указываете для геопроекта, является произвольным выражением JavaScript. Это означает, что вы можете использовать projection .fitSize, чтобы подогнать входную геометрию (представленную d) к желаемой ограничительной рамке 960 × 960!
Для предварительного просмотра спроецированной геометрии используйте geo2svg d3-geo-projection:
geo2svg -w 960 -h 960 < ca-albers.json > ca-albers.svg

Если вы следили за командной строкой, вы, надеюсь, узнали, как загрузить и подготовить геометрию из Бюро переписи населения США.
Во части 2 этого руководства я расскажу об использовании ndjson-cli для объединения геометрии с оценками населения из API Бюро переписи и для вычисления плотности населения.
В части 3 я расскажу об упрощении геометрии и объединении функций с помощью topojson-server, topojson-simpleify и topojson-client.
В части 4 я расскажу о реализации эффективных цветовых кодировок с помощью d3-scale и рендеринге хороплет в SVG с помощью d3-geo.
Готовы к большему? Перейти к части 2.
Вопросы или комментарии? Ответьте ниже или в Твиттере. Спасибо за чтение!