将.SVG文件转换为GeoJSON的方法


12

如何将SVG文件转换为GeoJSON格式?

期望的结果:

我想使用D3.js之类的文件或任何其他库来制作一个Choropleth映射。

挑战:

我有一个SVG文件,可以从特定国家/地区的特定省份的行政区域的公共领域中获取。我相信我需要先将其转换为GeoJSON,然后才能在我知道的库中使用它。


2
特定国家/地区的特定省的确切行政区域是什么?我们可以帮助找到SHP或GeoJSON可用文件,而不是为了解决错误的问题而奋斗。
ThomasG77

Answers:


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。(我正在努力添加这些。)


如果您希望/需要用3点而不是2点进行地理参考,则该存储库的拉取请求中的2017年12月版本也可以使用,我仍然很难理解两个版本的方向,并且我生成的多边形已镜像上下翻转。将SVG中的属性添加到GeoJSON中还需要花费更多的工作。期待将来使用。感谢您的酷模块。
thadk

这可能并不理想,但是我在转换后的SVG的PNG上使用了QGIS地理参考插件,以帮助您制作点表并检查线性矩形平移是否合理,尽管我不确定如何查找正确指向SVG空间。
thadk '18

我检查了图书馆。我知道转换是通过在地理坐标边界矩形内对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


对于来到这里的任何人,答案是:“这是相当困难的(至少对于有经验的程序员而言,但对于经验不足的制图师而言)。” 它需要对空间参考系统(SRS)的工作方式有一个肤浅的了解。您或多或少需要使用QGIS之类的.SVG进行地理编码。怎么做?仍然没有头绪。但是答案是:

“您不能简单地将SVG转换为GeoJSON,因为SVG缺少基本的地理参考。”

如果要继续,请开始搜索如何地理参考DXF文件。

如何计算QGIS仿射转换的参数?

GermánCarrillo的回答非常有用。


1
也许此信息应包含在问题中,即svg文件未进行地理参考。也许问题应该是:如何使用QGIS之类的.SVG进行地理编码?
user55937'1

SVG格式内可以进行地理配准吗?
迈克尔·佩尔

2
我不知道 在我看来,您有SVG格式的地图可以缩放,但不能以srs格式。因此,听起来您需要一些坐标已知的地面控制点,然后对数据进行一些转换以在某些实际坐标系中对其进行地理参考。也许这将有助于?:gis.stackexchange.com/questions/33208/... gisforthought.com/...
user55937


1

您无需从SVG转换为GeoJSON即可将图像用于d3中的波形,尽管其他库可能需要这样做。

SVG文件上的路径信息(地图中每个州/国家/州/分区至少必须有一个路径)足以将数据映射到d3中的SVG图像。

让我换一种说法:如果您可以在原始svg上执行d3.select,而每个州/国家/地区仅返回一条路径,则可以使用d3来构建一个弦波。在SVG中有地图时,通常就是这种情况。实际上,它比使用GeoJSON文件更简单,因为您无需担心空间位置,投影等问题。您甚至可能想要调整原始SVG来添加缺少的信息(例如状态名称,您可以将其添加为DOM ID或类),然后将其与D3结合使用,但这通常不是必需的。

另一方面,如前所述,SVG仅具有路径/线信息,而没有地理/空间信息,因此,如果要从SVG转换为GeoJSON,则需要将ADD / MAP地理位置信息添加到SVG图像中。例如,您可以先从svg转换为JSON,然后计算/添加地理位置信息(这将取决于您要映射的区域)并从中生成GeoJSON。据我所知,虽然没有开箱即用的工具为您完成这项工作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.