用于将 GeoJSON 转换为 SQLite(可选择使用 SpatiaLite)的 CLI 工具
$ pip install geojson-to-sqlite
您可以像这样针对 GeoJSON 文件运行此工具
$ geojson-to-sqlite my.db features features.geojson
这将把 features.geojson
文件中的所有要素加载到名为 features
的表中。
每一行将有一个包含要素几何的 geometry
列,以及附加到这些要素的任何 properties
中找到的每个键对应的列。(要将所有属性打包成一个 JSON 对象,请使用 --properties
标志。)
第一次运行此命令时将创建该表。
在后续运行中,您可以使用 --alter
选项添加表中缺失的任何新列。
您可以传递多个 GeoJSON 文件,在这种情况下,所有文件的内容将被插入到同一个表中。
如果您的要素具有 "id"
属性,它将被用作该表的主键。您也可以使用 --pk=PROPERTY
并指定不同属性的名称来将其用作主键。如果您不想使用 "id"
作为主键(可能它包含重复值),您可以使用 --pk ''
来指定没有主键。
指定主键还将允许您将数据 upsert 到行中,而不是将数据插入到新行中。
如果未指定主键,将使用 SQLite rowid
列。
您可以使用 -
作为文件名从标准输入导入。例如
$ curl https://eric.clst.org/assets/wiki/uploads/Stuff/gz_2010_us_040_00_20m.json \
| geojson-to-sqlite my.db states - --pk GEO_ID
默认情况下,geometry
列将包含 JSON。
如果您已经安装了 SQLite 的 SpatiaLite 模块,您可以改为将几何数据导入到具有地理空间索引的列中。
您可以使用 --spatialite
选项来实现,如下所示
$ geojson-to-sqlite my.db features features.geojson --spatialite
该工具将在以下位置查找 SpatiaLite 模块
/usr/lib/x86_64-linux-gnu/mod_spatialite.so
/usr/local/lib/mod_spatialite.dylib
如果您已将模块安装在其他位置,可以使用 --spatialite_mod=xxx
选项来指定位置
$ geojson-to-sqlite my.db features features.geojson \
--spatialite_mod=/usr/lib/mod_spatialite.dylib
您可以使用 --spatial-index
选项在 geometry
列上创建 SpatiaLite 空间索引
$ geojson-to-sqlite my.db features features.geojson --spatial-index
使用此选项意味着同时也使用了 --spatialite
,因此您无需另外添加该选项。
对于大型数据集,考虑使用换行符分隔的 JSON(newline-delimited JSON)将要素流式传输到数据库中,而无需将整个要素集合加载到内存中。
例如,要从 USGS 加载一天的地震报告
$ geojson-to-sqlite quakes.db quakes tests/quakes.ndjson \
--nl --pk=id --spatialite
使用换行符分隔的 JSON 时,表也将从第一个要素创建,而不是根据前 100 个要素猜测类型。
如果您想使用更大一部分数据来猜测列类型(例如,如果某些字段不一致),您可以使用 fiona 将要素收集到单个集合中。
$ head tests/quakes.ndjson | fio collect | \
geojson-to-sqlite quakes.db quakes - --spatialite
这将从 tests/quakes.ndjson
中获取前 10 行,将它们传递给 fio collect
,后者将它们转换为单个要素集合,然后依次将该集合传递给 geojson-to-sqlite
。
使用此工具创建的数据库可以使用 Datasette 进行探索和发布。
Datasette 文档中包含一个关于 如何使用它浏览 SpatiaLite 数据库 的章节。
datasette-leaflet-geojson 插件可用于在 Leaflet 地图上可视化包含 GeoJSON 几何数据的列。
如果您正在使用 SpatiaLite,您需要将几何数据输出为 GeoJSON 格式才能使该插件正常工作。您可以使用 SpaitaLite 的 AsGeoJSON()
函数来做到这一点 - 示例如下
select rowid, AsGeoJSON(geometry) from mytable limit 10
datasette-geojson-map 是一个替代插件,它会在相应的表页面上自动将 SpatiaLite 几何数据渲染为 Leaflet 地图,而无需您调用 AsGeoJSON(geometry)
。