如何从大型(.json)列表结构

时间:2015-05-10 17:47:01

标签: python json geojson

对于每种方式,我都试图建立一个与该特定“方式”相关的所有“节点”的坐标列表。

我想,因为所有内容都在这个大型列表中(又名“元素”:)我可以使用'for'循环...但事实证明......我无法访问“类型”:“节点” (即坐标的位置)这样。

如果我不能使用for循环,如何找到“type”中的匹配坐标:“node”?

列表结构的例子(你可以看到这两个'方式'here的完整集...我只是在下面缩短了它:)

  "elements": [

{
  "type": "way",
  "id": 57935838
  },
  "nodes": [
    279385160,
    1142007444
  ],
  "tags": {
    "highway": "secondary",
    "name": "Kauno g."
  }
},
{
  "type": "way",
  "id": 223130469
  },
  "nodes": [
    470874618,
    2362142222
  ],
  "tags": {
    "highway": "secondary",
    "name": "Agluonos g."
  }
},
{
  "type": "node",
  "id": 470874618,
  "lat": 55.6933076,
  "lon": 21.1517616
},
{
  "type": "node",
  "id": 2362142222,
  "lat": 55.6931543,
  "lon": 21.1514953
},
{
  "type": "node",
  "id": 1142007444,
  "lat": 55.6991153,
  "lon": 21.1647621
},
{
  "type": "node",
  "id": 279385160,
  "lat": 55.7001553,
  "lon": 21.1671538
}
]

如果我在元素上使用'for'循环,我会得到什么(对于id = 57935838}:

{u'tags': {u'name': u'Kauno g.', u'highway': u'secondary'}, u'nodes': [279385160, 1142007444], u'type': u'way', u'id': 57935838}

例如:

import json
from urllib2 import urlopen

    all_data_dict = get_overpass_json_data(line_url2)

    with open(outfile, 'w') as geojson_file:
        for item in all_data_dict['elements']:
            print item

ex(来自here的双节点方式):

>> print all_data_dict

>> {u'elements': [{u'changeset': 29434078, u'uid': 91490, u'tags': {u'bridge': u'yes', u'layer': u'1', u'ref': u'F72', u'surface': u'asphalt', u'highway': u'tertiary'}, u'timestamp': u'2015-03-12T19:56:59Z', u'version': 2, u'user': u'Heinz_V', u'nodes': [1635609339, 1635609329], u'type': u'way', u'id': 150672234, u'center': {u'lat': 27.5894941, u'lon': 85.4801512}}, {u'lat': 27.5894735, u'lon': 85.4800892, u'type': u'node', u'id': 1635609329}, {u'lat': 27.5895146, u'lon': 85.4802131, u'type': u'node', u'id': 1635609339}], u'version': 0.6, u'osm3s': {u'timestamp_osm_base': u'2015-05-10T18:01:02Z', u'copyright': u'The data included in this document is from www.openstreetmap.org. The data is made available under ODbL.'}, u'generator': u'Overpass API'}

1 个答案:

答案 0 :(得分:0)

很难弄清楚你正在尝试做什么或者你的问题来自无效的JSON片段,模糊的描述,没有代码,但是......

我认为你的elements应该是一个包含大量dicts的列表,每个都有type。您需要type为字符串'node'的所有元素。然后,对于每个人,您需要latlon值。所以,让我们写下:

coords = []
for element in elements:
    if element['type'] == 'node':
        coords.append((element['lat'], element['lon']))

或者,更简单地说:

[(e['lat'], e['lon']) for e in elements if e['type'] == 'node']

这不会影响您的破坏示例,但如果我在前两个元素中的每个}键之前移除了两个迷路nodes,那么它就会解析(当然,我只是在猜测你的实际结构应该是什么......),我明白了:

[(55.6933076, 21.1517616),
 (55.6931543, 21.1514953),
 (55.6991153, 21.1647621),
 (55.7001553, 21.1671538)]

如果您更愿意将其视为将每个节点的ID映射到其lat / lon元组的dict,同样的想法:

coords = {}
for element in elements:
    if element['type'] == 'node':
        coords[element['id']] = (element['lat'], element['lon'])

或者:

{e['id']: (e['lat'], e['lon']) for e in elements if e['type'] == 'node'}

这给了我:

{279385160: (55.7001553, 21.1671538),
 470874618: (55.6933076, 21.1517616),
 1142007444: (55.6991153, 21.1647621),
 2362142222: (55.6931543, 21.1514953)}