Строить единый топойсон с двумя квантованными / преобразованными топойсонами? - PullRequest
0 голосов
/ 01 июня 2018

Фон

Я строю карту, которая отображает карту США.На этой карте я рисую тепловые круги, которые соответствуют топографии Nielsen DMA.

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

Ниже вы можете увидеть карту с тепловыми кругами DMA, а также границы DMA, построенные полностью из топографа Nielsen DMA.

screen shot 2018-05-31 at 4 37 19 pm

Проблема:

Проблема, с которой я столкнулся, заключается в попытке нарисовать линии государственной границы вместо этих линий DMA.Я ввел "https://unpkg.com/us-atlas@1/us/10m.json", который @mbostock предоставил нам. Когда рисуете государственную границу через topojson.feature(us, us.objects.states).features (я тоже пробовал topojson.mesh), вот когда все идет не так, как надо. Мне 99% уверен, что это потому, что два файла json используют разные значения transform, и поэтому позиции / координаты преобразуются в разных масштабах.

Вот два jsons: Nielsen DMA здесь и US здесь

Ниже показано, как отличается объект преобразования:

Объект преобразования из Атласа США

"transform": {
       "scale": [0.009995801851947097,0.005844667153098606],
       "translate":[-56.77775821661018,12.469025989284091]
}

Преобразование объекта из DMA topojson

"transform": {
        "scale": [0.00577894299429943, 0.002484260626062607],
        "translate": [-124.732975, 24.544237]
},

Вот что я сделал до сих пор.

Подход:

1.через GeoJSON

Как подробно описано в Bostock здесь Я пытался создать новый topoJSON "через обратную связь через GeoJSON."

Квантованный → неквантованный, чтобы удалить квантование. Это часто делается временно для обработки данных (например, topojson.presimplify).Я полагаю, что вам может понадобиться это, чтобы вы могли комбинировать топологии с различными квантованными преобразованиями, но вы всегда можете сделать это, совершив круговое путешествие по GeoJSON.

Для каждого из jsons 1. Я преобразовал ихот topoJSON до geoJSON.topo2geo nielsen_dma=us-dma-geo.json < us-dma-topo.json Теперь для каждого json у нас есть коллекция объектов с абсолютными координатами.2. С новым geoJSON я затем преобразовал их обратно в topoJSON через CLI.geo2topo nielsen_dma=us-dma-geo.json > us-dma-topo.json Оба JSON больше не имеют свойства transform, но имеют bbox.3. Теперь у меня оба jsons совершают перелет из топойсона -> геойсон -> топойсон.4. Я удалил bbox свойств из обоих jsons, так как они необязательны. 5. Затем я просто добавил геометрическую коллекцию одного к другому.statesJSON.objects.nielsen_dma = dmaJSON.objects.nielsen_dma

Теперь у меня есть топойсон с геометриями nielsen_dma и states.Однако это по-прежнему не работает, и рисование линий состояния приводит к хаосу.

screen shot 2018-05-31 at 5 18 13 pm

Не удалось удалить квантование координат для обоих jsons во время поездки в geoJSON??

Возможно (и) актуален Вопрос:

  1. Карта прямого доступа к памяти Nielsen не включает геометрии для Аляски и Гавайев.Может ли это расхождение между двумя jsons привести к этой проблеме?

1 Ответ

0 голосов
/ 12 июня 2018

Когда я впервые прочитал это, я попытался решить основную проблему в комментариях (для которой я немного пропустил отметку, так как предполагал, что код для отображения карты выглядел немного иначе, чем это было вероятно - яизвиняюсь за неправильно прочитанное).Однако на втором экзамене я понял, что, хотя вопрос является проблемой 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...