วิธีการแปลงไฟล์. 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 ที่ใช้พา ธ ที่มีคำสั่งBézierหรือสมการกำลังสอง (ฉันกำลังเพิ่มสิ่งเหล่านี้)


เวอร์ชั่นตั้งแต่เดือนธันวาคม 2560 ในคำขอดึงของที่เก็บนั้นยังใช้งานได้หากคุณต้องการ / จำเป็นต้องมีการอ้างอิงทางภูมิศาสตร์ด้วย 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 geocoordinates เหล่านั้นสามารถแปลเป็นชุดข้อมูลรายการ 8 นี้ได้อย่างไร
เจอโรม

4

มีเครื่องมือบรรทัดคำสั่งโดย Phrogz ที่กล่าวถึงด้านล่างว่าฉันยังไม่ได้ชำระเงิน:

/gis//a/245085/35596


สำหรับทุกคนที่มาที่นี่คำตอบคือ: "มันค่อนข้างยาก (อย่างน้อยสำหรับนักเขียนโปรแกรมที่มีประสบการณ์ มันต้องมีความเข้าใจที่ลึกซึ้งกว่ามากเกี่ยวกับการทำงานของ Spacial Reference Systems (SRS) คุณต้องการ Geocode .SVG ของคุณมากกว่าหรือน้อยกว่าโดยใช้ QGIS นั่นทำอย่างไร ยังไม่มีเงื่อนงำ แต่คำตอบคือ:

"คุณไม่สามารถแปลง SVG เป็น GeoJSON เพียงอย่างเดียวเนื่องจาก SVG ไม่มีการอ้างอิงทางภูมิศาสตร์พื้นฐาน"

หากคุณต้องการดำเนินการต่อให้เริ่มค้นหาวิธีการอ้างอิงทางภูมิศาสตร์ไฟล์ DXF

จะคำนวณพารามิเตอร์สำหรับ QGIS Affine Transformation ได้อย่างไร

คำตอบของGermán Carrillo มีประโยชน์มาก


1
บางทีข้อมูลนี้ควรรวมอยู่ในคำถามนั่นคือไฟล์ svg ไม่ได้ถูกอ้างอิงทางภูมิศาสตร์ หรืออาจเป็นคำถามควรเป็น: ฉันจะ geocode a .SVG โดยใช้ QGIS ได้อย่างไร?
user55937

สามารถใช้การอ้างอิงทางภูมิศาสตร์ภายในรูปแบบ SVG ได้หรือไม่
Michael Pell

2
ฉันไม่รู้แน่ชัด ฟังดูแล้วเหมือนว่าคุณมีแผนที่ในรูปแบบ SVG ที่สามารถปรับขนาดได้ แต่ไม่ใช่ในรูปแบบ srs ดังนั้นดูเหมือนว่าคุณจะต้องใช้จุดควบคุมภาคพื้นดินที่มีพิกัดที่รู้จักแล้วนำการแปลงข้อมูลไปใช้กับการอ้างอิงทางภูมิศาสตร์ในระบบพิกัดจริง บางทีสิ่งเหล่านี้อาจช่วยได้บ้าง: gis.stackexchange.com/questions/33208/… gisforthought.com/?hl=th
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
AndrewHarvey

1

คุณไม่จำเป็นต้องแปลงจาก SVG เป็น GeoJSON เพื่อใช้รูปภาพสำหรับ choropleth ใน d3 แม้ว่ามันอาจจำเป็นสำหรับไลบรารี่อื่น ๆ ก็ตาม

ข้อมูลเส้นทางในไฟล์ SVG (ต้องมีอย่างน้อยหนึ่งเส้นทางสำหรับแต่ละรัฐ / ประเทศ / รัฐ / ส่วนย่อยในแผนที่ของคุณ) เพียงพอที่จะแมปข้อมูลไปยังภาพ SVG ของคุณใน d3

ให้ฉันใส่มันในอีกทางหนึ่ง: ถ้าคุณสามารถทำ d3.select บน svg ดั้งเดิมของคุณที่จะส่งกลับเพียงเส้นทางเดียวต่อรัฐ / ประเทศ / ภูมิภาคคุณสามารถใช้ d3 เพื่อสร้าง choropleth ได้ กรณีนี้มักเกิดขึ้นเมื่อคุณมีแผนที่ใน SVG จริงๆแล้วมันง่ายกว่าการใช้ไฟล์ GeoJSON เพราะคุณไม่จำเป็นต้องกังวลเกี่ยวกับตำแหน่งพื้นที่การฉายภาพ ฯลฯ คุณอาจต้องการปรับแต่ง SVG ดั้งเดิมเพื่อเพิ่มข้อมูลที่หายไป (เช่นชื่อรัฐที่คุณสามารถเพิ่มเป็น DOM ID หรือ คลาส) ก่อนใช้กับ D3 แต่มักไม่จำเป็น

ในทางตรงกันข้ามตามที่ได้กล่าวไว้ก่อนหน้านี้ SVG มีเพียงข้อมูลเส้นทาง / สายไม่ใช่ข้อมูลทางภูมิศาสตร์ / เชิงพื้นที่ดังนั้นหากคุณต้องการแปลงจาก SVG เป็น GeoJSON คุณต้องเพิ่มข้อมูลตำแหน่งทางภูมิศาสตร์ของแผนที่เป็นรูป SVG ของคุณ ตัวอย่างเช่นคุณสามารถแปลงจาก svg เป็น JSON ก่อนจากนั้นคำนวณ / เพิ่มข้อมูลตำแหน่งทางภูมิศาสตร์ (ขึ้นอยู่กับภูมิภาคที่คุณกำลังทำแผนที่) และสร้าง GeoJSON จากนั้น เท่าที่ฉันรู้ไม่มีเครื่องมือนอกกรอบที่จะทำงานนี้ให้คุณ


0

ฉันจะลองหารูปแบบเชพแทน SVG สำหรับจังหวัดที่คุณกำลังมองหา เนื่องจากข้อมูลเป็นโอกาสสาธารณสมบัติที่ดีคุณจึงสามารถค้นหาได้ ลองhttp://www.naturalearthdata.com/หรือถามคำถามที่นี่ จากนั้นแปลงจาก Shapefile เป็น GeoJSON หรือ TopoJSON MapShaperเป็นเพื่อนของคุณ จากจุดนี้ D3 น่าจะถึงมือคุณ (กวดวิชาที่ยอดเยี่ยมLet's Let's a Map )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.