对于每种方式,我都试图建立一个与该特定“方式”相关的所有“节点”的坐标列表。
我想,因为所有内容都在这个大型列表中(又名“元素”:)我可以使用'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'}
答案 0 :(得分:0)
很难弄清楚你正在尝试做什么或者你的问题来自无效的JSON片段,模糊的描述,没有代码,但是......
我认为你的elements
应该是一个包含大量dicts的列表,每个都有type
。您需要type
为字符串'node'
的所有元素。然后,对于每个人,您需要lat
和lon
值。所以,让我们写下:
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)}