import os, sys, gc
import time
import json

import overpy
from pprint import *

"""
Explanation: OSM-overpass服务接口使用，在线查询OpenStreetMap开放空间数据库。
 by openthings@163.com, 2016-04-23.   

overpy-使用overpass api接口的python library，这里将返回结果集保存为JSON格式。

安装：$ pip install overpy
文档：http://python-overpy.readthedocs.org/en/latest/example.html#basic-example  
接口：http://wiki.openstreetmap.org/wiki/Overpass_API
本工具例程基于上述文档例程进行编写。
End of explanation
"""


#范围：纬度1，经度1，纬度2，经度2
#返回：result
def get_osm():
    query = "[out:json];node(50.745,7.17,50.75,7.18);out;"
    osm_op_api = overpy.Overpass()
    result = osm_op_api.query(query)

    print("Nodes: ",len(result.nodes))
    print("Ways: ",len(result.ways))
    print("Relations: ",len(result.relations))
    return result

"""
Explanation: 调用overpass接口，获取result数据结果集。

由于通过网络返回，容易中断，而且是在内存中处理，不适合创建大的查询集。
End of explanation
"""


result = get_osm()

"""
Explanation: 在线获取osm数据.
End of explanation
"""


nodeset = result.nodes[0:3]
pprint(nodeset)

"""
Explanation: 显示node的属性信息（仅显示前3个node的信息）。
End of explanation
"""


for n in nodeset:
    print(n.id,n.lat,n.lon)

"""
Explanation: 遍历node的子集，该子集由上一步产生。
End of explanation
"""


def node2json(node):
    jsonNode="{\"id\":\"%s\", \"lat\":\"%s\", \"lon\":\"%s\"}"%(node.id,node.lat,node.lon)
    return jsonNode

def node2jsonfile(fname,nodeset):
    fnode = open(fname,"w+")
    for n in nodeset:
        jn = node2json(n) + "\n"
        fnode.write(jn)
    fnode.close()
    print("Nodes:",len(nodeset),", Write to: ",fname)

"""
Explanation: 将查询到的数据集合转换为json格式，写入json格式的文件.
（ 该格式可由Spark直接载入: SQLContext.read.json() ）。
End of explanation
"""


node2jsonfile("overpass.osm_node.json",result.nodes)    

"""
Explanation: 执行json文件保存操作。
End of explanation
"""


!ls -l -h

"""
Explanation: 查看一下文件。
End of explanation
"""


