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


12

Питання

Як конвертувати файл SVG у формат GeoJSON?

Бажаний результат:

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

Виклик:

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


2
Які саме адміністративні регіони конкретної провінції конкретної країни? Ми можемо допомогти знайти файли, доступні для SHP або GeoJSON, а не боротися за вирішення неправильної проблеми.
ThomasG77

Відповіді:


5

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

svg2geojson

Це вимагає, щоб ви вручну відредагували SVG, щоб додати два теги XML, які пов'язують розташування SVG з lat / long, і він надає інструмент командного рядка для перетворення файлу. Він навіть, якщо вам подобається, візьме всі групи вищого рівня (саме так 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, який використовує шляхи з квадратичними командами Безьє або еліптичної дуги. (Я працюю над додаванням цих даних.)


Версія від грудня 2017 року в запиті на виклик цього сховища також працює, якщо ви хочете / потребуєте геореференції з 3 балами замість 2. У мене все-таки виникли проблеми з тим, як рухатись до обох версій, і мій отриманий багатокутник відображався догори ногами. Також потрібно було б трохи більше попрацювати, щоб об’єднати властивості з SVG в GeoJSON. З нетерпінням чекайте використання в майбутньому. Дякую за класний модуль.
thadk

Це, мабуть, не ідеально, але я використовував плагін георефера QGIS на перетвореному PNG вашого SVG, щоб допомогти вам скласти таблицю точок і перевірити, чи лінійний прямокутний зсув був навіть правдоподібним, хоча я не впевнений, як шукати точки в просторі SVG правильно.
thadk

Я оглянув бібліотеку. Я розумію, що перетворення відбувається за допомогою перетворення точок 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

Існує згаданий нижче інструмент командного рядка Фрогза, який я не перевіряв:

/gis//a/245085/35596


Кожен, хто приходить сюди, відповідь такий: "це досить складно (принаймні для досвідченого програміста, але недосвідченого картографа)". Це вимагає більш ніж поверхневого розуміння того, як працюють просторові системи відліку (СРС). Вам потрібно більш-менш геокодувати ваш .SVG, використовуючи щось на зразок QGIS. Як це робиться? Досі ніякої підказки. Але відповідь така:

"Ви не можете просто перетворити SVG в GeoJSON, оскільки у SVG відсутні основні геопосилання."

Якщо ви хочете продовжити, почніть пошук того, як геореферувати файл DXF.

Як обчислити параметри для QGIS Affine перетворення?

Відповідь Германа Каррілло дуже корисна.


1
Можливо, ця інформація повинна бути включена у запитання, тобто, щоб файл SVG не був геореференційним. А може бути питання: як я можу геокодувати .SVG, використовуючи щось на зразок QGIS?
user55937

Чи можлива геореференція у форматі SVG?
Майкл Пелл

2
Я точно не знаю. Мені це здається, що у вас є карта у форматі SVG, яка має масштаб, але не в srs. Отже, це здається, що вам знадобиться кілька наземних контрольних точок з відомими координатами, а потім застосувати деяке перетворення до даних, щоб геореференціювати його в якійсь реальній системі координат. Можливо, це допоможе ?: gis.stackexchange.com/questions/33208/… gisforthought.com/…
користувач55937

1

Інструмент командного рядка ogr2ogr повинен це вміти. Щось на зразок:

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

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


3
Це не так вже прямо, драйвер OGR SVG підтримує лише спеціальний SVG, створений "Cloudmade Vector Stream Server" та в EPSG: 3857.
ЕндрюХарві

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 повинен бути доступним (відмінний підручник Давайте зробимо карту )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.