在QGIS或Python中为GeoJSON添加唯一的功能ID

时间:2015-12-16 14:02:36

标签: python geojson qgis

根据GeoJSON格式规范

“如果某个要素具有常用标识符,则该标识符应作为名称为”id“的要素对象的成员包含在内。”

我的问题是如何将其添加到我的GeoJSON中?

如果我将其创建为属性,然后将其作为GeoJSON保存在QGIS中,则会在“属性”中而不是“特征”中结束。

这就是我想要做的事情:

{
"type": "FeatureCollection",
"crs": { "type": "name", "properties": { "name":"urn:ogc:def:crs:OGC:1.3:CRS84" } },

"features": [
{ "type": "Feature", "id":"1", "properties": { "Namn":.................

这是QGIS产生的:

{
"type": "FeatureCollection",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },

"features": [
{ "type": "Feature", "properties": { "id": 1, "Name".................. 

我也尝试过PyGeoj https://github.com/karimbahgat/PyGeoj。这有一个添加唯一ID的功能,但它也会在属性下添加它。

如果我打开GeoJSON并手动编写它然后它可以工作,但我不想对我的所有图层执行此操作,其中一些图层包含许多功能。

4 个答案:

答案 0 :(得分:2)

您可以使用ogr2​​ogr中的preserve_fid标志来解决此问题。您将要把QGIS转储的不良GeoJSON“转换”为所需的格式,并暴露id字段。

ogr2ogr -f GeoJSON fixed.geojson qgis.geojson -preserve_fid

这里qgis.geojson是QGIS创建并修复的版本。geojson是具有公开ID字段的新版本。

答案 1 :(得分:1)

以为我会在这里写下我是如何解决它的,以防其他人遇到同样的问题。

一个简单的python脚本:

#create empty file to be writen to
file = open("kommun_id.geojson", "w")
count = 0

#read original file
with open('kommun.geojson', 'r')as myfile:
    for line in myfile:

       #lines that don't need to be edited with an 'id'
       if not line.startswith('{ "type": '):
            file.write(line)
       else:
            #lines that need to be edited
            count = count +1
            idNr = str(count)
            file.write(line[0:20] + '"id":'+ '"'+ idNr + '",' +line[21:])

file.close()

它可能不适用于所有geoGJSON,但它适用于我使用QGIS创建的那些

答案 2 :(得分:0)

这是由于 ogr2ogr 不知道将哪个 QGIS 字段用作 geoJSON ID。

根据此QGIS issue(谢谢@gioman),解决方法是在导出时在自定义选项 --> 图层设置中手动指定 ID 字段:

enter image description here

如果您需要对已创建的 geoJSON 执行此操作,您可以使用独立的 ogr2ogr 命令行程序:

ogr2ogr output.geojson input.geojson -lco id_field=id 

如果您需要从多个文件中的属性转换 ID,您可以在 Bash for 循环中使用命令行工具 jq

for file in *.geojson; do jq '(.features[] | select(.properties.id != null)) |= (.id = .properties.id)' $file > "$file"_tmp; mv "$file"_tmp $file;done

答案 3 :(得分:0)

我遇到了同样的问题,我用这个小 Python 脚本解决了问题。

 import json

 with open('georef-spain-municipio.geojson') as json_file:
      data = json.load(json_file)
      i = 0
      for p in data['features']:
           i+=1
           p['id'] = i

 with open('georef-spain-municipio_id.geojson', 'w') as outfile:
 json.dump(data, outfile)

希望能帮到你