根据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并手动编写它然后它可以工作,但我不想对我的所有图层执行此操作,其中一些图层包含许多功能。
答案 0 :(得分:2)
您可以使用ogr2ogr中的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 字段:
如果您需要对已创建的 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)
希望能帮到你