如何使用python将LineString中的多个点从JSON添加到GeoJSON?

2024-10-08 21:16:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带坐标的JSON,用于线条特征。我正在努力将这个JSON转换成GeoJSON格式,以便能够绘制它。下面是Json和Python代码。我正试图用python3x格式化它。我想我就快到了,只是在线路部分与for循环作斗争。我只需要第一组坐标就可以了。谢谢

[{ "type": "linestring", "points": [{ "lat": 37.918647943, "lon": 23.761094017 }, { "lat": 37.764186425, "lon": 24.043867088 }, { "lat": 37.762555035, "lon": 24.045284834 }, { "lat": 37.759292113, "lon": 24.048120252 }, { "lat": 37.757909899, "lon": 24.050360246 }, { "lat": 37.754357436, "lon": 24.056116962 }, { "lat": 37.752949276, "lon": 24.058567669 }, { "lat": 37.751417202, "lon": 24.061233635 }, { "lat": 37.74953827, "lon": 24.064503082 }, { "lat": 37.748200181, "lon": 24.065451555 }, { "lat": 37.747314483, "lon": 24.065389252 }], "entity_id": "77101", "popup": "\u003Ch5\u003E\u039a\u03a5\u03a4 \u039b\u03b1\u03c5\u03c1\u03af\u03bf\u03c5 - \u039a\u03a5\u03a4 \u0391\u03c1\u03b3\u03c5\u03c1\u03bf\u03cd\u03c0\u03bf\u03bb\u03b7\u03c2\u003C\/h5\u003E\n\u003Cdiv\u003E\u003C\/div\u003E\n\u003Cdiv\u003E400 kV\u003C\/div\u003E\n", "path": "{\u0022color\u0022:\u0022#3388ff\u0022,\u0022opacity\u0022:\u00221.0\u0022,\u0022stroke\u0022:true,\u0022weight\u0022:3,\u0022className\u0022:\u0022id_77101 red\u0022,\u0022fill\u0022:\u0022depends\u0022,\u0022fillColor\u0022:\u0022*\u0022,\u0022fillOpacity\u0022:\u00220.0\u0022}" }, { "type": "linestring", "points": [{ "lat": 38.524903863, "lon": 23.167894542 }, { "lat": 38.524705211, "lon": 23.167839471 }, { "lat": 38.137414714, "lon": 23.828298758 }, { "lat": 38.134480753, "lon": 23.830543492 }, { "lat": 38.134170241, "lon": 23.832346632 }, { "lat": 38.133976038, "lon": 23.834457466 }, { "lat": 38.134049661, "lon": 23.835541307 }, { "lat": 38.133833198, "lon": 23.835427687 }], "entity_id": "77102", "popup": "\u003Ch5\u003E\u039a\u03a5\u03a4 \u0391\u03b3.\u03a3\u03c4\u03b5\u03c6\u03ac\u03bd\u03bf\u03c5 - \u039a\u03a5\u03a4 \u039b\u03ac\u03c1\u03c5\u03bc\u03bd\u03b1\u03c2\u003C\/h5\u003E\n\u003Cdiv\u003E\u003Cdiv class=\u0022pop-up-label\u0022\u003EDescription:\u003C\/div\u003E 2B\u0026#039;B\u0026#039;\/400\n\u003C\/div\u003E\n\u003Cdiv\u003E400 kV\u003C\/div\u003E\n", "path": "{\u0022color\u0022:\u0022#3388ff\u0022,\u0022opacity\u0022:\u00221.0\u0022,\u0022stroke\u0022:true,\u0022weight\u0022:3,\u0022className\u0022:\u0022id_77102 red\u0022,\u0022fill\u0022:\u0022depends\u0022,\u0022fillColor\u0022:\u0022*\u0022,\u0022fillOpacity\u0022:\u00220.0\u0022}" }, { "type": "linestring", "points": [{ "lat": 41.393877564, "lon": 23.311903052 }, { "lat": 41.391621317, "lon": 23.314187524 }, { "lat": 41.389758983, "lon": 23.316073 }, { "lat": 40.699766659, "lon": 22.916499355 }, { "lat": 40.698006009, "lon": 22.918954289 }, { "lat": 40.695974697, "lon": 22.920407418 }, { "lat": 40.693381223, "lon": 22.922437615 }, { "lat": 40.692491512, "lon": 22.922664982 }], "entity_id": "77103", "popup": "\u003Ch5\u003E\u039a\u03a5\u03a4 \u0398\u03b5\u03c3\/\u03bd\u03af\u03ba\u03b7\u03c2 - \u0392\u03bf\u03c5\u03bb\u03b3\u03b1\u03c1\u03af\u03b1\u003C\/h5\u003E\n\u003Cdiv\u003E\u003Cdiv class=\u0022pop-up-label\u0022\u003EDescription:\u003C\/div\u003E B\u0026#039;B\u0026#039;\/400\n\u003C\/div\u003E\n\u003Cdiv\u003E400 kV\u003C\/div\u003E\n", "path": "{\u0022color\u0022:\u0022#3388ff\u0022,\u0022opacity\u0022:\u00221.0\u0022,\u0022stroke\u0022:true,\u0022weight\u0022:3,\u0022className\u0022:\u0022id_77103 red\u0022,\u0022fill\u0022:\u0022depends\u0022,\u0022fillColor\u0022:\u0022*\u0022,\u0022fillOpacity\u0022:\u00220.0\u0022}" }, { "type": "linestring", "points": [{ "lat": 40.692461619, "lon": 22.922357749 }, { "lat": 40.755326724, "lon": 22.850940857 }, { "lat": 40.758623291, "lon": 22.848183012 }, { "lat": 41.065846201, "lon": 22.658634921 }, { "lat": 41.067743292, "lon": 22.655239987 }, { "lat": 41.112288315, "lon": 22.575224675 }, { "lat": 41.113750897, "lon": 22.572584693 }, { "lat": 41.116059427, "lon": 22.568437392 }, { "lat": 41.12034928, "lon": 22.564997041 }, { "lat": 41.125058394, "lon": 22.561237357 }, { "lat": 41.129138167, "lon": 22.561183964 }], "entity_id": "77104", "popup": "\u003Ch5\u003E\u039a\u03a5\u03a4 \u0398\u03b5\u03c3\/\u03bd\u03af\u03ba\u03b7\u03c2 - FYROM\u003C\/h5\u003E\n\u003Cdiv\u003E\u003Cdiv class=\u0022pop-up-label\u0022\u003EDescription:\u003C\/div\u003E B\u0026#039;B\u0026#039;\/400\n\u003C\/div\u003E\n\u003Cdiv\u003E400 kV\u003C\/div\u003E\n", "path": "{\u0022color\u0022:\u0022#3388ff\u0022,\u0022opacity\u0022:\u00221.0\u0022,\u0022stroke\u0022:true,\u0022weight\u0022:3,\u0022className\u0022:\u0022id_77104 red\u0022,\u0022fill\u0022:\u0022depends\u0022,\u0022fillColor\u0022:\u0022*\u0022,\u0022fillOpacity\u0022:\u00220.0\u0022}" }, { "type": "linestring", "points": [{ "lat": 40.7901584769, "lon": 23.0480705193 }, { "lat": 40.7903523946, "lon": 23.0492358221 }, { "lat": 40.7901050443, "lon": 23.0527869346 }, { "lat": 41.043691983, "lon": 24.249864576 }, { "lat": 41.045358111, "lon": 24.25415432 }, { "lat": 41.04630753, "lon": 24.256609089 }, { "lat": 41.046164193, "lon": 24.2602733 }], "entity_id": "77105", "popup": "\u003Ch5\u003E\u039a\u03a5\u03a4 \u039b\u03b1\u03b3\u03ba\u03b1\u03b4\u03ac - \u039a\u03a5\u03a4 \u03a6\u03b9\u03bb\u03af\u03c0\u03c0\u03c9\u03bd\u003C\/h5\u003E\n\u003Cdiv\u003E\u003Cdiv class=\u0022pop-up-label\u0022\u003EDescription:\u003C\/div\u003E B\u0026#039;B\u0026#039;B\u0026#039;\/400\n\u003C\/div\u003E\n\u003Cdiv\u003E400 kV\u003C\/div\u003E\n", "path": "{\u0022color\u0022:\u0022#3388ff\u0022,\u0022opacity\u0022:\u00221.0\u0022,\u0022stroke\u0022:true,\u0022weight\u0022:3,\u0022className\u0022:\u0022id_77105 red\u0022,\u0022fill\u0022:\u0022depends\u0022,\u0022fillColor\u0022:\u0022*\u0022,\u0022fillOpacity\u0022:\u00220.0\u0022}" }, { "type": "linestring", "points": [{ "lat": 40.78983174, "lon": 23.04660084 }, { "lat": 40.78958078, "lon": 23.04564668 }, { "lat": 40.78955252, "lon": 23.04247145 }, { "lat": 40.79761609, "lon": 23.02745817 }, { "lat": 40.79868402, "lon": 22.96633164 }, { "lat": 40.62123973221768, "lon": 21.72502141299155 }, { "lat": 40.619958771459004, "lon": 21.721002325337444 }, { "lat": 40.61876412645359, "lon": 21.71725480736431 }, { "lat": 40.61763871618877, "lon": 21.71372480244598 }, { "lat": 40.616253421804615, "lon": 21.709380286795067 }, { "lat": 40.6148332836148, "lon": 21.704927337949705 }, { "lat": 40.61390429997776, "lon": 21.70201462068876 }, { "lat": 40.61517977186133, "lon": 21.698154785687546 }, { "lat": 40.616549620077215, "lon": 21.693351729497877 }, { "lat": 40.61769071025425, "lon": 21.689027178782595 }, { "lat": 40.61787118798994, "lon": 21.688146238927636 }, { "lat": 40.617999818469684, "lon": 21.688271824830505 }], "entity_id": "77106", "popup": "\u003Ch5\u003E\u039a\u03a5\u03a4 \u0391\u03bc\u03c5\u03bd\u03c4\u03b1\u03af\u03bf\u03c5 - \u039a\u03a5\u03a4 \u039b\u03b1\u03b3\u03ba\u03b1\u03b4\u03ac\u003C\/h5\u003E\n\u003Cdiv\u003E\u003Cdiv class=\u0022pop-up-label\u0022\u003EDescription:\u003C\/div\u003E 2B\u0026#039;B\u0026#039;\/400\n\u003C\/div\u003E\n\u003Cdiv\u003E400 kV\u003C\/div\u003E\n", "path": "{\u0022color\u0022:\u0022#3388ff\u0022,\u0022opacity\u0022:\u00221.0\u0022,\u0022stroke\u0022:true,\u0022weight\u0022:3,\u0022className\u0022:\u0022id_77106 red\u0022,\u0022fill\u0022:\u0022depends\u0022,\u0022fillColor\u0022:\u0022*\u0022,\u0022fillOpacity\u0022:\u00220.0\u0022}" }, { "type": "linestring", "points": [{ "lat": 40.692458304, "lon": 22.922002748 }, { "lat": 40.69332022, "lon": 22.921692973 }, { "lat": 40.696125972, "lon": 22.919245068 }, { "lat": 40.797415962, "lon": 23.020151234 }, { "lat": 40.797360122, "lon": 23.023127364 }, { "lat": 40.79730334, "lon": 23.02732208 }, { "lat": 40.7892307, "lon": 23.04235039 }, { "lat": 40.78915542, "lon": 23.04584343 }, { "lat": 40.78940636, "lon": 23.04679502 }], "entity_id": "77107", "popup": "\u003Ch5\u003E\u039a\u03a5\u03a4 \u0398\u03b5\u03c3\/\u03bd\u03af\u03ba\u03b7\u03c2 - \u039a\u03a5\u03a4 \u039b\u03b1\u03b3\u03ba\u03b1\u03b4\u03ac\u003C\/h5\u003E\n\u003Cdiv\u003E\u003Cdiv class=\u0022pop-up-label\u0022\u003EDescription:\u003C\/div\u003E 2B\u0026#039;B\u0026#039;\/400\n\u003C\/div\u003E\n\u003Cdiv\u003E400 kV\u003C\/div\u003E\n", "path": "{\u0022color\u0022:\u0022#3388ff\u0022,\u0022opacity\u0022:\u00221.0\u0022,\u0022stroke\u0022:true,\u0022weight\u0022:3,\u0022className\u0022:\u0022id_77107 red\u0022,\u0022fill\u0022:\u0022depends\u0022,\u0022fillColor\u0022:\u0022*\u0022,\u0022fillOpacity\u0022:\u00220.0\u0022}" }]

下面是Python代码

    from sys import argv
from os.path import exists
import simplejson as json 

out_file = r"C:\Users\xxxxxx.json"
in_file = r"C:\Users\xxxxxx\Desktop\xxx.json"

data = json.load(open(in_file))


geojson = {
    "type": "FeatureCollection",
    "features": [
    {
        "type": "Feature",
        "geometry" : {
            "type": "LineString",
            "coordinates": [i['lat'], i['lon']]#This line here is not correct. This is where I am struggling.
            },
        "properties" : d,
     } for d in data 
        for i in d['points']#This line here is not correct. This is where I am struggling. 
    ]
}


output = open(out_file, 'w')
json.dump(geojson, output)

print (geojson)

Tags: divtypepointslonlatu003cu003eu0026
1条回答
网友
1楼 · 发布于 2024-10-08 21:16:02

JSON只是一个数据结构。无法在JSON中嵌入代码。您需要将点附加到每行的列表中,并将每个功能附加到组成GeoJSON的功能列表中

import json

out_file = r"C:\Users\xxxxxx.json"
in_file = r"C:\Users\xxxxxx\Desktop\xxx.json"

with open(in_file) as fin:
    data = json.load(fin)

features = []
for d in data:
    coords = []
    for pt in d['points']:
        coords.append((pt["lon"], pt["lat"]))
    features.append({
        "type": "Feature",
        "geometry": {
            "type": "LineString",
            "coordinates": coords
        },
        "properties": {
            "entity_id" : d["entity_id"]           
          }
    })

with open(out_file, 'w') as output:
    geojson = {
        "type": "FeatureCollection",
        "features": features
    }
    json.dump(geojson, output)

print(geojson)

相关问题 更多 >

    热门问题