Методы для преобразования .SVG файла в GeoJSON

12

Вопрос

Как преобразовать файл SVG в формат GeoJSON?

Желаемый результат:

Я хочу сделать карту с хороплетом, используя что-то вроде D3.js или любую другую библиотеку.

Вызов:

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

Майкл Пелл
источник
2
Каковы точные административные районы конкретной провинции конкретной страны? Мы могли бы помочь найти доступные файлы SHP или GeoJSON вместо того, чтобы бороться, чтобы решить не ту проблему.
ThomasG77

Ответы:

5

Я только что написал библиотеку, которая преобразует SVG-изображение в (слегка некорректный) GeoJSON.

svg2geojson

Это требует, чтобы вы вручную отредактировали свой SVG, чтобы добавить два XML-тега, которые связывают местоположение SVG с широтой / долготой, и он предоставляет инструмент командной строки для преобразования файла. Он даже при желании возьмет все группы верхнего уровня (как это делает Illustrator для экспорта своих слоев) и экспортирует их как отдельные файлы.

использование

# First, install Node.js

$ npm install svg2geojson -g  # install globally for easy access to executable

$ svg2geojson -h
Usage: svg2geojson [options] file.svg

Options:
 -t, --tolerance=0.1 Distance (world meters) to sample curves to. (default: 0.1)
 -l, --layers        Split top-level groups into separate files. (default: one file)
 -o, --stdout        Output GeoJSON to stdout. (default: write files with names based on the SVG/layer)
 -m, --minimal       Make the GeoJSON as small as possible (not pretty).
 -p, --precision     Number of decimal places to format JSON numbers to. (default:6, as GeoJSON recommends)
 -d, --debug         Include ids for each SVG element in the features. (default: no properties)
 -v, --version       Output the version of svg2geojson as the first line on stdout (0.7.0).
 -h, --help          Show this help message.

$ svg2geojson my.svg
Wrote my.geojson

Ограничения

  • Использует наивную / неправильную технику непроекции, которая предполагает, что прямоугольная область изображения соответствует прямоугольной широте / длинной области. Например, на прямоугольнике шириной около 1 мили и высотой в полмили около Сан-Франциско нижний край на 4 дюйма длиннее верхнего. Это было достаточно близко для моих нужд.

  • В настоящее время не поддерживается SVG, в котором используются пути с квадратичными командами Безье или эллиптической дуги. (Я работаю над добавлением этих.)

Phrogz
источник
Версия от декабря 2017 г. в запросе на извлечение данных этого хранилища также работает, если вы хотите / нуждаетесь в географической привязке с 3 точками вместо 2. У меня все еще были проблемы с определением того, как обстоят дела с обеими версиями, и полученный в результате многоугольник был отражен вверх ногами. Также потребовалось бы немного больше работы, чтобы объединить свойства из SVG в GeoJSON. С нетерпением ждем использования в будущем, хотя. Спасибо за классный модуль.
Спасибо
Это, вероятно, не идеально, но я использовал плагин геореференции QGIS на преобразованном PNG вашего SVG, чтобы помочь вам составить таблицу точек и проверить, был ли линейный прямоугольный сдвиг даже правдоподобным, хотя я не уверен, как посмотреть точки в пространстве SVG правильно.
Спасибо
Я осмотрел библиотеку. Я понимаю, что преобразование происходит через преобразование точек SVG в ограничивающем прямоугольнике геокоординаты. Но это составляет 4 точки (то есть leftLongitude = "0.1617178" topLatitude = "23.4999998" rightLongitude = "15.9990339" bottomLatitude = "11.694295"). Два XML-тега, в общем, подразумевают 8 бит данных, и документация для Prognoz очень смущает меня. <p5:GeoItem Longitude="22.1471203091967" Latitude="44.2498454806746" X="0" Y="1" /> Как эти 4 геокоординаты могут быть переведены в этот набор данных из 8 элементов?
Джером,
4

Phrogz упомянул ниже инструмент командной строки, который я не проверял:

/gis//a/245085/35596


Для всех, кто приходит сюда, ответ таков: «это довольно сложно (по крайней мере, для опытного программиста, но неопытного картографа)». Это требует более чем поверхностного понимания того, как работают Spacial Reference Systems (SRS). Вам более или менее необходимо геокодировать ваш .SVG, используя что-то вроде QGIS. Как это сделать? До сих пор нет понятия. Но ответ таков:

«Вы не можете просто конвертировать SVG в GeoJSON, так как в SVG отсутствуют основные гео-ссылки».

Если вы хотите продолжить, начните поиск с географической привязкой файла DXF.

Как вычислить параметры для аффинного преобразования QGIS?

Ответ Германа Каррильо там очень полезен.

Майкл Пелл
источник
1
Может быть, эта информация должна быть включена в вопрос, то есть, что файл SVG не имеет географической привязки. Или, может быть, вопрос должен быть: как я могу геокодировать .SVG, используя что-то вроде QGIS?
user55937
Возможна ли географическая привязка в формате SVG?
Майкл Пелл
2
Я точно не знаю Мне кажется, у вас есть карта в формате SVG, которая масштабируется, но не в формате srs. Похоже, вам понадобятся некоторые наземные контрольные точки с известными координатами, а затем применить какое-либо преобразование к данным, чтобы привязать их к некоторой реальной системе координат. Может быть, это поможет ?: gis.stackexchange.com/questions/33208/… gisforthought.com/…
user55937
1

Инструмент командной строки ogr2ogr должен уметь это делать. Что-то вроде:

ogr2ogr -f "GeoJSON" dst.json src.svg

Оба этих формата поддерживаются http://www.gdal.org/ogr_formats.html . Если вы не знакомы с ogr2ogr, самый простой способ загрузить и установить его, вероятно, через https://trac.osgeo.org/osgeo4w/ .

user55937
источник
3
Это не так просто, драйвер OGR SVG поддерживает только особый вид SVG, созданный «Cloudmade Vector Stream Server» и в EPSG: 3857.
AndrewHarvey
1

Вам не нужно конвертировать из SVG в GeoJSON, чтобы использовать изображение для хороплета в d3, хотя это может быть необходимо для других библиотек.

Информация о пути в файле SVG (должен быть хотя бы один путь для каждого штата / страны / штата / подразделения на вашей карте) достаточно для сопоставления данных с вашим SVG-изображением в d3.

Позвольте мне выразить это по-другому: если вы можете сделать d3.select на вашем исходном svg, который будет возвращать только один путь на штат / страну / регион, то вы можете использовать d3 для создания хороплета. Обычно это тот случай, когда у вас есть карта в SVG. На самом деле это проще, чем использовать файл GeoJSON, так как вам не нужно беспокоиться о местоположении в пространстве, проекции и т. Д. Возможно, вы даже захотите настроить исходный SVG-файл, чтобы добавить недостающую информацию (например, имена состояний, которые вы можете добавить в качестве идентификаторов DOM или Классы), прежде чем использовать его с D3, но обычно это не нужно.

С другой стороны, как было сказано ранее, в SVG есть только информация о путях / линиях, а не географическая / пространственная информация, поэтому, если вы хотите конвертировать из SVG в GeoJSON, вам нужно добавить информацию о геолокации ADD / MAP в ваше изображение SVG. Например, вы можете сначала преобразовать из SVG в JSON, а затем рассчитать / добавить информацию о геолокации (это будет зависеть от региона, который вы отображаете) и сгенерировать из него GeoJSON. Насколько я знаю, нет готового инструмента, который бы сделал эту работу за вас.

Роберто Стеллинг
источник
0

Я бы попробовал использовать исходный формат файла вместо SVG для провинции, которую вы ищете. Поскольку данные являются достоянием общественности, вы можете найти их. Попробуйте http://www.naturalearthdata.com/ или задайте вопрос здесь. Затем конвертируйте из Shapefile в GeoJSON или TopoJSON; MapShaper твой друг. С этого момента D3 должен быть в пределах досягаемости (отличный учебник Давайте создадим карту )

Мэтт Уилки
источник