Когда я впервые прочитал это, я попытался решить основную проблему в комментариях (для которой я немного пропустил отметку, так как предполагал, что код для отображения карты выглядел немного иначе, чем это было вероятно - яизвиняюсь за неправильно прочитанное).Однако на втором экзамене я понял, что, хотя вопрос является проблемой x, y , попытка решения приводит к некоторым интересным вопросам о D3 и топойсону, которые не сразу ясны - но основная проблема остается смешаннойспроецированные и непроецированные данные, поэтому я попытаюсь обратиться к x и y здесь:
Topojson
Topojson по сути является методом хранения геойсонаобъекты или классы объектов путем кодирования топологии и, необязательно, квантованных целочисленных координат с дельта-кодированием.Сам Топойсон не меняет базовые координаты, он меняет их представление.
Чтобы использовать топойсон с D3, нам нужно преобразовать его обратно в geojson, так как D3 geoPaths принимает только geojson - topojson.feature () возвращает geojson.
Базовый источникБоли
Окончательная проблема не возникает из топойсона вообще.У вас есть два источника topojon, которые используют разные системы координат:
США использует двухмерное декартово пространство координат (объекты, спроецированные с проекцией Альберса).Несжатые координаты являются пикселями SVG.
Nielsen JSON использует координатное пространство широты / долготы (точки на трехмерном глобусе).Несжатые координаты не являются декартовыми (если не применять прямую проекцию Плато Карри: long = x, lat = y).
Когда Json в США пропущен через topojson.feature()
, возвращенный геойсон будет иметь значения x, y в пределах ограничительной рамки примерно [0,0], [960 600] (в этомдело).Когда любой непроецированный топойсон (Nielsen json для примера) пропускается через topojson.feature()
, возвращаемый геойсон будет иметь длинные значения lat в ограничивающей рамке [-180,90], [180, -90] - то есть он будет иметьдопустимые пары long / lat.
Эти базовые и отличающиеся системы координат являются проблемой, а не представлением координат в топойсоне.
Объединение Topojson
Я не уверен в деталях того, как вы соединили их.Топойсон разбивает геойсон на составные части - дуги и объекты (которые ссылаются на дуги и содержат свойства объектов).На дуги ссылаются численно - если вы не изменили индексы, то вы не можете просто использовать:
statesJSON.objects.nielsen_dma = dmaJSON.objects.nielsen_dma
Но даже если вы действительно изменили индексы дуг и добавили дуги, которые не 'В состояниях JSON, но в dmaJSON вы все равно столкнетесь с проблемами.Это потому, что мы все еще используем разные системы координат.
Преобразование, которое использует топойсон, состоит из масштабирования и преобразования - проецируемые данные используют проекцию Альберса, непроецированные данные не используют проекцию, но могут бытьприведен к x, y с помощью проекции Плато-Карри (long = x, lat = y).Но Плато Карри имеет прямые широты (это равноугольная проекция), а Альберс имеет изогнутые широты (это коническая проекция).Следовательно, формы идентичных элементов в каждой системе координат будут разными.Направления также будут разными в каждой системе координат (восток не направлен вправо в большинстве мест на Альберсе).Вы не можете изменить форму и направление с помощью translate и scale.
Различные преобразования Топойсона
Я на 99% уверен, что это потому, что два файла json используютразличные значения преобразования, и, следовательно, позиции / координаты преобразуются в разных масштабах.
Очень редко будет использоваться два файла topojson, которые имеют одинаковые значения преобразования, также с ограничительной рамкой.Преобразование критично только для воспроизведения исходных координат, которые использовались для создания топойсона.Его значения имеют значение только для преобразования закодированных координат топойсона обратно в исходные (геойсон) координаты.Преобразование является специфическим для координат этого топойсона.
В конечном счете, преобразование не имеет значения при использовании D3: исходные координаты, использованные для создания топойсона, - это то, что фактически используется D3, до topojson.feature()
.Преобразование по существу несущественно - если оно постоянно для кодирования и декодирования.
Как это исправить?
У вас есть проецируемый файл (СШАjson), для которого вы не знаете проекцию, которая использовалась для его создания.Не зная прогноза, использованного для его создания, вы не можете применить тот же прогноз к данным Nielsen. Даже если вы можете запустить данные Nielsen через d3 geoProjection, чтобы оно перекрывало данные США (которые используют нулевую проекцию) - вы не должны этого делать.Различные системы координат громоздки при масштабировании, панорамировании или установке таких вещей, как центрирование координат - для обработки непроецированных и спроецированных данных требуется отдельный код, по сути, дублирующий код
Это означает, что вам нужно найти новые данныеИсточник для США.К счастью, есть много онлайн-источников, например, два: чрезмерный размер для сети или разумный размер для сети .Вы можете преобразовать в topojson, если хотите, с mapshaper.org (и упростить файл тоже).
С геоджоном / топойсоном для США, который не проецируется (пары long / lat), теперь у вас есть два файла, которыеиспользовать одну и ту же систему координат.Преобразование топойсона будет различным для каждого (если работать с топойсоном для обоих), это несущественно, важно то, что лежащие в основе координаты находятся в одном координатном пространстве, а не то, что их квантованное представление в топойсоне использует одно и то же преобразование.
Вот базовый пример использования геоджона непроецированных штатов США (из второго связанного геоджона, преобразованного в топойсон):
https://bl.ocks.org/andrew-reid/178445c6acd84aa3b43525076f277157