.SVG 파일을 GeoJSON으로 변환하는 방법


12

질문

SVG 파일을 GeoJSON 형식으로 변환하려면 어떻게합니까?

요망되는 결과:

D3.js 또는 다른 라이브러리를 사용하여 choropleth 맵을 만들고 싶습니다.

도전:

특정 국가의 특정 주에 대한 관리 지역의 공개 도메인에서 얻을 수있는 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 인치 더 깁니다. 이것은 내 필요에 충분히 가깝습니다.

  • 현재 2 차 베 지어 또는 타원형 호 명령과 함께 경로를 사용하는 SVG를 지원하지 않습니다. (저는 이것을 추가하려고 노력하고 있습니다.)


해당 저장소의 풀 요청에서 2017 년 12 월의 버전은 2 대신 3 점으로 지리 참조 해야하는 경우에도 작동합니다. 두 버전 모두에서 어떤 방식으로 머리를 가져 오는 데 여전히 어려움이 있었고 결과 다각형이 미러링되었습니다. 상하 반전. SVG에서 GeoJSON으로 속성을 결합하는 데 약간의 작업이 더 필요할 것입니다. 앞으로 사용을 기대합니다. 멋진 모듈에 감사드립니다.
thadk

이것은 이상적이지는 않지만 SVG의 변환 된 PNG에서 QGIS georeferencer 플러그인을 사용하여 점 테이블을 만들고 선형 직사각형 이동이 그럴듯한 지 확인하는 데 도움이되었지만 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 개의 항목 데이터 세트로 어떻게 변환 할 수 있습니까?
Jerome

4

아래에서 언급 한 Phrogz의 명령 줄 도구가 있습니다.

/gis//a/245085/35596


여기에 오는 사람에게 답은 "적어도 어렵다 (적어도 숙련 된 프로그래머이지만 경험이없는지도 제작자에게는)"이다. SRS (Spatial Reference Systems) 작동 방식에 대한 피상적 인 이해가 필요합니다. QGIS와 같은 것을 사용하여 .SVG를 지오 코딩해야합니다. 어떻게됩니까? 아직 실마리가 없습니다. 그러나 대답은 다음과 같습니다.

"SVG에는 기본 지리 참조가 없기 때문에 SVG를 GeoJSON으로 간단히 변환 할 수 없습니다."

계속 진행하려면 DXF 파일을 지리 참조하는 방법을 검색하십시오.

QGIS Affine 변환을위한 파라미터를 계산하는 방법은 무엇입니까?

Germán Carrillo의 답변은 매우 유용합니다.


1
이 정보는 질문에 포함되어야합니다. 즉, svg 파일이 지리 참조되지 않아야합니다. 또는 QGIS와 같은 것을 사용하여 .SVG를 지오 코딩하는 방법은 무엇입니까?
user55937

SVG 형식 내에서 지리 참조가 가능합니까?
Michael Pell

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/를 통하는 것입니다 .


3
그리 간단하지는 않지만, OGR SVG 드라이버 는 "Cloudmade Vector Stream Server"및 EPSG : 3857에서 생성 된 특수한 종류의 SVG 만 지원합니다.
AndrewHarvey 2016 년

1

d3에서 choropleth에 대한 이미지를 사용하기 위해 SVG에서 GeoJSON으로 변환 할 필요는 없지만 다른 라이브러리에 필요할 수도 있습니다.

SVG 파일의 경로 정보 (맵의 각 주 / 국가 / 주 / 구분마다 하나 이상의 경로가 있어야 함)는 데이터를 d3의 SVG 이미지에 매핑하기에 충분합니다.

다른 방법으로 말해 보겠습니다. 원래 svg에서 d3.select를 수행 할 수 있다면 주 / 국가 / 지역 당 하나의 경로 만 반환하면 d3을 사용하여 choropleth를 만들 수 있습니다. SVG에 맵이있는 경우가 일반적입니다. 공간 위치, 투영 등을 걱정할 필요가 없기 때문에 GeoJSON 파일을 사용하는 것보다 실제로 간단합니다. 상태 정보와 같이 누락 된 정보를 추가하기 위해 원래 SVG를 조정하거나 DOM ID로 추가 할 수 있습니다. 클래스)를 D3과 함께 사용하기 전에 일반적으로 필요하지 않습니다.

반면에, 앞에서 말했듯이 SVG는 지리 / 공간 정보가 아닌 경로 / 라인 정보 만 가지고 있으므로 SVG에서 GeoJSON으로 변환하려면 지리적 위치 정보를 SVG 이미지에 ADD / MAP해야합니다. 예를 들어, 먼저 svg에서 JSON으로 변환 한 다음 지리적 위치 정보를 계산 / 추가 (매핑하는 지역에 따라 다름)하고 GeoJSON을 생성 할 수 있습니다. 내가 아는 한이 도구를 사용 하여이 작업을 수행 할 수는 없습니다.


0

찾고있는 주에 SVG 대신 형식을 소스로 사용하려고 합니다. 데이터가 공개 기회이므로 좋은 것을 찾을 수 있습니다. 시도 http://www.naturalearthdata.com/을 하거나 여기에 질문을 부탁드립니다. 그런 다음 Shapefile에서 GeoJSON 또는 TopoJSON으로 변환하십시오. MapShaper 는 당신의 친구입니다. 이 시점부터 D3가 도달해야합니다 (우수한 자습서 Let 's Make a Map ).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.