Запутанные пути при использовании D3 и topojson?

Небольшое предупреждение: все еще новичок в D3.

Прямо сейчас я слежу за руководством Майка Бостока Let's Make a Map, но вместо Великобритании, я использую карту избирательных округов в Альберте, Канада. После изменения кода Bostock для загрузки моего собственного TopoJSON с данными Альберты, появляется вот что.

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

Следует отметить, что в консоли JS появляется сообщение об ошибке: Error: Invalid value for <path> attribute, что заставляет меня сомневаться, есть ли что-то не так в данных TopoJSON, однако, когда я загружаю те же данные в Mapshaper, карта отображается без ошибок.

Таким образом, я как бы застрял и не уверен, что делать дальше. Любая помощь / направление приветствуются, спасибо!


person JoshApos    schedule 28.03.2015    source источник
comment
Что-то не так с вашими геоданными. Похоже, это уже спроектировано? Я загрузил его в QGIS, и хотя данные выглядят нормально, похоже, что для них уже применена проекция. Я нашел некоторые данные об избирательных округах Альберты на странице selectionalberta.ab.ca/Public%20Website/ 112.htm, и когда я загружаю оттуда шейп-файл, они не пересекаются. Не уверен, что произошло, но какая бы обработка ни была произведена до того, как вы отобразили, она вызвала некоторые проблемы. Кроме того, попробуйте стилизовать путь с помощью fill: none и stroke: black, чтобы он выглядел аккуратнее.   -  person Ben Lyall    schedule 30.03.2015
comment
@Ben: так как ваш комментарий является конструктивным ответом, давайте опубликуем его в качестве ответа, мы все могли бы +1 и / или конструктивно поработать. Я также присоединяюсь к вашим утверждениям, такой шаблон сломанных путей svg (уже обсуждавшийся в канале topojson stackoverflow) появляется либо из-за сломанных путей в данных, либо из-за противоречивых прогнозов.   -  person Hugolpz    schedule 31.03.2015


Ответы (1)


Что-то не так с вашими геоданными. Похоже, это уже спроектировано? Я загрузил его в QGIS, и хотя данные выглядят нормально, похоже, что для них уже применена проекция. Я нашел некоторые данные об избирательных округах Альберты по адресу http://www.electionsalberta.ab.ca/Public%20Website/112.htm, и когда я загружаю оттуда шейп-файл, они не перекрываются. Не уверен, что произошло, но какая бы обработка ни была произведена до того, как вы отобразили, она вызвала некоторые проблемы. Также попробуйте стилизовать путь с помощью fill: none и stroke: black, чтобы он выглядел аккуратнее.

Обновлять:

В zip-архиве, предоставленном Elections Alberta, есть файл .prj, содержащий проекцию, которая, как вы подозреваете, является NAD83, Alberta Transverse Mercator. Mapshaper и другие демонстрировали вам этот спроецированный файл, а затем создавали топологию спроецированного файла.

Чтобы создать «непроектированный» файл, я загрузил предоставленный zip-архив в QGIS как векторный слой, а затем сохранил его как новый слой, но в процессе изменил Систему координат (CRS, другими словами, проекцию) на WGS 84.

Затем я использовал topojson для преобразования сохраненного результата в файл topojson.

Я создал суть / блок, чтобы вы могли использовать свой код и мой обновленный файл. Вы можете проверить это на странице http://bl.ocks.org/benlyall/4f2e4ed1e8f4bdb8457c.

Все, что я действительно сделал, - это сохранил файл с другой системой координат, отличной от QGIS, а затем загрузил его на существующую страницу. Надеюсь, это немного поможет.

Чтобы ответить на пару вопросов из ваших комментариев:

  1. Файл уже был спроектирован организацией Elections Alberta, но потенциально может быть спроецирован в любой момент процесса. Вы можете конвертировать между проекциями в любой момент, и на самом деле вы это делаете, когда применяете проекцию в своем javascript. Проекция просто преобразует координаты одной системы в координаты другой системы. В вашем случае мы переходим от NAD83 / поперечной проекции Меркатора в Альберте к WGS 84 обратно к проекции Меркатора. Для получения дополнительной информации о NAD83 / Alberta TM посетите http://georepository.com/crs_3403/NAD83-CSRS-Alberta-10-TM-Resource.html

  2. Mapshaper и topojson читали ваш шейп-файл и отображали его для вас. Вероятно, это выглядело для вас нормально, поскольку именно так выглядит этот регион, когда вы видите его на карте. Из этого не сразу ясно, что исходные данные были спроецированы. Я определил, что было несоответствие, загрузив ваши topojson данные в QGIS с прогнозом WGS 84 (поскольку это обычно то, с чего мы начинаем), а затем загрузил данные о выборах в Альберте (которые включают файл .prj) и увидел, что совпадений не было. . Это немного примечательно, что один из них был спроектирован иначе, чем другой. Поскольку вы спрашивали о переполнении стека, я подумал, что данные о выборах в Альберте, вероятно, правильные. Тогда я начал смотреть в ваш topojson файл и увидел, что там огромные координаты, т.е. за пределами - / + 180, - / + 90, что означает, что он, вероятно, был спроектирован до создания.

    d3 может загружать уже спроектированные topojson данные, передавая null прогноз согласно http://bl.ocks.org/mbostock/5557726, но в этом случае он ожидает, что координаты в вашем topojson файле будут пикселями, и если вы посмотрите на свой topojson файл, они слишком велики, чтобы считаться значениями пикселей, поэтому они не будут так не работает.

  3. Я только что сделал

    ogr2ogr -t_srs crs:84 alberta_wgs84 EDs_Act2010_FINAL.shp
    

    и затем я преобразовал это, используя topojson, и он загрузился правильно, в соответствии с моим повторно спроецированным файлом QGIS. Так что я не уверен, что пошло не так с вашим при этом преобразовании. Не имеет значения, как выполняется повторное проецирование, просто так оно и есть. Вы определенно были на правильном пути.

person Ben Lyall    schedule 31.03.2015
comment
Хм, странно, что сайт Elections Alberta - это тот же источник, из которого я получил исходные шейп-файлы. Я собираюсь подробнее изучить методы, которые я использовал для преобразования из SHP ›Geo› Topo. Знаете ли вы какие-либо источники, которые подробно объясняют методы преобразования шейп-файлов в TopoJSON? - person JoshApos; 03.04.2015
comment
bost.ocks.org/mike/map кажется хорошим началом, и официальная документы по адресу github.com/mbostock/topojson/wiki/Command-Line-Reference тоже должно немного помочь. - person Ben Lyall; 04.04.2015
comment
Я прошел через процесс повторного преобразования шейп-файла в GeoJSON в TopoJSON, следуя документации, насколько я могу судить, но получаю тот же результат, что и раньше. Я не совсем понимаю, что имеется в виду, когда говорится, что геоданные уже спроецированы. В какой момент будет применена проекция, если не в исходных данных, которые я скачал, и как мне это исправить? Кроме того, как я могу узнать, какой прогноз был применен? Спасибо за свет, который вы пролили! - person JoshApos; 13.04.2015
comment
В дополнение к этому, почему TopoJSON может правильно отображаться при использовании таких инструментов, как mapshaper.org и QGIS, если ошибка находится в самих геоданных? - person JoshApos; 14.04.2015
comment
Хорошо, я поигрался с геоданными и обнаружил, что карта Альберты, предоставленная через Elections Alberta, использует систему координат NAD83 / Alberta 10-TM, в отличие от WGS 84, которая нужна D3. Я не в себе, но у меня достаточно базовых знаний, чтобы предположить, что это означает, что мне нужно преобразовать CRS исходного шейп-файла в WGS 84. Я попытался сделать это, добавив -t_srs crs:84 при использовании ogr2ogr в терминале для преобразования моего шейп-файла в GeoJSON, но, похоже, это не сработало. Имеет ли это какое-то значение для вас, я на правильном пути? - person JoshApos; 14.04.2015
comment
Я обновил свой ответ так, как я это сделал. Я уверен, что есть способ сделать это с помощью ogr2ogr, но я использовал QGIS для достижения того же результата. - person Ben Lyall; 15.04.2015
comment
Спасибо, Бен, теперь у меня все работает. Конкретный ключ был тем, что я только что пробовал, добавляя -t_srs crs:84 при преобразовании шейп-файла в GeoJSON с помощью ogr2ogr, но я забыл вручную перевести карту во фрейме svg и подумал, что это просто еще одна ошибка. Ваши ответы и обновления действительно помогли лучше понять, что происходит, большое спасибо! - person JoshApos; 15.04.2015