如何从大型(.json-based)列表结构访问路径坐标

How to access way coordinates from a large (.json-based) list structure

对于每个单独的方式,我都试图从与特定 "way" 关联的所有 "nodes" 构建一个坐标列表。

我想,因为所有内容都在这个大列表中(又名 "elements":) 我可以只使用 'for' 循环...但事实证明...我无法访问 "type" : "node" (即坐标所在的位置)这样。

如果我不能使用 for 循环,我如何获得 "type" 中的匹配坐标:"node"?

列表结构示例(你可以看到这两个的完整集合'ways' 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'}

很难从无效的 JSON 片段、模糊的描述和没有代码中弄清楚你正在尝试做什么或你的问题是什么,但是…

我认为你的 elements 应该是一个包含一堆字典的列表,每个字典都有一个 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 元组,同样的想法:

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)}