Есть ли способ изменить проекцию в файле topojson? - PullRequest
2 голосов
/ 09 июля 2019

Я пытаюсь создать файл топойсона, спроецированный с использованием geoAlbersUsa, происходящий из шейп-файла ZCTA (Zip Codes, по сути) переписи населения США. Мне удалось успешно пройти примеры в превосходном https://medium.com/@mbostock/command-line-cartography-part-1-897aa8f8ca2c с использованием указанных карт, и теперь я пытаюсь получить тот же результат, используя шейп-файлы уровня Zip-кода.

Я продолжаю сталкиваться с различными проблемами из-за размера файла и длины строк в файле. Несмотря на то, что я смог создать файл геойсона и файл топойсона, я не смог дать ему желаемую проекцию geoAlbersUsa. Я надеялся найти что-то, чтобы преобразовать текущий файл topojson в файл topojson с проекцией geoAlbersUsa, но я не смог найти никакого способа.

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

Попытка 1: мне удалось успешно преобразовать шейп-файл уровня ZCTA в файл geojson, используя shp2json (как в примере с Майком Бостоком), но когда я пытаюсь запустить геопроект (из d3-геопроекции), я получаю ошибки, связанные с чрезмерная длина строки. В узле (используя npm) я установил d3-geo-projection (npm install -g d3-geo-projection), затем запустил следующее:

геопроект "d3.geoAlbersUsa ()" us_zips_albersUsa.json

Я получаю сообщение об ошибке "Ошибка: невозможно создать строку длиннее 0x3fffffe7 символов"

Попытка 2: я использовал ogr2ogr (https://gdal.org/programs/ogr2ogr.html) для создания файла geojson (вместо shp2json), затем побежал, пытаясь запустить тот же код геопроекта, что и выше, и получил ту же ошибку.

Попытка 3: я использовал ogr2ogr для создания файла последовательности geojson (вместо файла geojson), затем запустил geo2topo для создания файла topojson из файла geojsons. Хотя это удалось создать файл topojson, он все еще не включает проекцию geoAlbersUsa в результирующий файл topojson.

Я получаю из довольно тупой документации ogr2ogr, что выходная проекция может быть указана с помощью -a_srs, но я не могу понять, как указать что-то, что получило бы мне проекцию geoAlbersUsa. Я нашел эту ссылку https://spatialreference.org/ref/sr-org/44/, но я думаю, что это принесет мне Альберс, и это может отрубить Аляску и Гавайи, а это не то, чего я хочу.

Есть предложения здесь? Я надеялся, что найду способ изменить проекцию в самом файле topojson, так как это позволит избежать чрезмерно длинной строки, с которой я сталкиваюсь, когда пытаюсь сделать что-либо в узле, требующее использования файла geojson , Похоже, что это было возможно в ранних версиях топойсона (см. Способы проецирования топойсона? ), но я не вижу способа сделать это сейчас.

Ответы [ 2 ]

0 голосов
/ 16 июля 2019

Не совсем ответ, но больше, чем комментарий ..

Итак, я гуглил просто " 0x3fffffe7 " и нашел этот комментарий на случайном Github /Проект NodeJS, и, основываясь на его чтении, я чувствую, что содержимое узла и / или материал D3, который вы используете, сокращает весь ваш шейп-файл уровня ZCTA до… одной строки, хранящейся в памяти !!Это нехорошо для карты масштаба континента с такими детальными деталями.

Более того, человек, оставивший этот комментарий, предположил, что OP в этом случае потребуется другой подход, чтобы представить свой набор данных клиенту.(Какой, я полагаю, браузер?) В вашем случае, может ли он работать, если вы запрашиваете коллекцию zip каждого состояния в одном шейп-файле (ogr2ogr может сделать это, используя OGR-SQL ), что даст вам5 разных шейп-файлов.Затем для каждого из них, запустите их через ваши преобразования, чтобы получить json / geoalbers.Чтобы проверить эту концепцию, попробуйте экспортировать только одно состояние и посмотреть, все ли работает как положено.

При этом я обеспокоен тем, что ваш подход к этому проекту имеет неосуществимый интерфейс / архитектурное ожидание: я просто не надеваюНе думаю, что вы можете поместить столько геоданных в браузер DIV!Насколько большой DIV, полный экран, я надеюсь?!?

Мой совет - подумать о другом способе представления данных.Например, inset-DIV, чтобы «выбрать ваше состояние», затем щелкнув по нему, увеличивает основной DIV для просмотра этого состояния в более широком масштабе и одновременно опускает и оценивает данные уровня ZCTA, относящиеся к этому состоянию, используя 50 файлов, которые вы предварительно подготовили, используяСтратегия, которую я упомянул выше.Имеет ли это смысл?

Вот краткий пример того, как я ожидаю, что вы можете применить OGR_SQL к вашему сценарию, адаптируясь под него:

ogr2ogr idaho_zcta.shp USA_zcta.shp -sql "SELECT * FROM USA_zcta WHERE STATE_NAME = 'ID'"

Параметры следующим образом:

  • idaho_zcta.shp <это ваш новый файл </li>
  • USA_zcta.shp <это ваш исходный шейп-файл </li>
  • -sql <это сигнализирует выражение запроса OGR_SQL </li>

Что касается самого запроса, пара советов.Сначала оберните всю строку запроса в двойные кавычки.Если происходит что-то странное, попробуйте добавить начальные и конечные пробелы в начало и конец запроса, например ..

" SELECT ... 'ID' "

Странно, я знаю, но однажды у меня была ситуация, когдаэто работало только таким образом.

Во-вторых, относительно запроса имя таблицы совпадает с именем шейп-файла, только без расширения файла ".shp".Я не могу вспомнить, есть ли чувствительность к регистру между именем шейп-файла и именем таблицы строки запроса.Если вы столкнетесь с проблемой, дайте шейп-файлу и всем строчным именам, а также используйте строчные буквы в SQL.

Что касается преобразования проекций - вы сами там.То, что geoAlbersUSA выглядит так, как будто оно не является отраслевым стандартом (то есть кодировкой EPSG) и специфично для D3 и предназначено исключительно для браузера.Так что ogr2ogr не справится с этим.Но я согласен со стратегией преобразования данных заранее.Надеемся, что конверсионный конвейер, который вы уже исследовали, сработает, если у вас есть только гораздо меньшие (то есть масштабные) наборы данных для его прохождения.

Удачи.

0 голосов
/ 10 июля 2019

Я бы предложил сначала спроецировать файл GeoJson на проекцию Альберса, также используя ogr2ogr, так же, как вы делали для шейп-файла, а затем запустить geotopo.

Предполагая, что вашей исходной системой координат является NAD83 (даже если это WGS84, мы можем предположить, что для практических целей они одинаковы для уровня детализации данных Tiger), мы имеем:

Источник: NAD83 EPSG: 4269 https://epsg.io/4269

И для системы координат назначения у нас есть проекция Альберса, примененная к географическим координатам NAD83.То есть

Назначение: Альберс для NAD83: EPSG: 42303 https://epsg.io/42303

И преобразование будет:

ogr2ogr output.geojson -t_srs "EPSG:42303" input.geojson -s_srs "EPSG:4269"

Возможно, вы можете забыть -s_srsи напишите просто:

ogr2ogr output.geojson -t_srs "EPSG:42303" input.geojson 

Вы также можете попытаться спроецировать исходный шейп-файл, а затем выполнить последующие преобразования с уже спроецированными координатами:

ogr2ogr output.shp -t_srs "EPSG:42303" input.shp
...