#!/usr/bin/python
#coding=utf-8

OSM-overpass服务接口使用,在线查询OpenStreetMap开放空间数据库。

by [email protected], 2016-04-23.

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

import os, sys, gc
import time
import json

import overpy
from pprint import *

调用overpass接口,获取result数据结果集。

  • 由于通过网络返回,容易中断,而且是在内存中处理,不适合创建大的查询集。
#范围:纬度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

在线获取osm数据.

result = get_osm()
Nodes:  2267
Ways:  0
Relations:  0

显示node的属性信息(仅显示前3个node的信息)。

nodeset = result.nodes[0:3]
pprint(nodeset)
[<overpy.Node id=50878400 lat=50.7461788 lon=7.1742257>,
 <overpy.Node id=50878401 lat=50.7476027 lon=7.1744795>,
 <overpy.Node id=100792806 lat=50.7486483 lon=7.1714704>]

遍历node的子集,该子集由上一步产生。

for n in nodeset:
    print(n.id,n.lat,n.lon)
50878400 50.7461788 7.1742257
50878401 50.7476027 7.1744795
100792806 50.7486483 7.1714704

将查询到的数据集合转换为json格式,写入json格式的文件.

该格式可由Spark直接载入: SQLContext.read.json() )。

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)

执行json文件保存操作。

node2jsonfile("overpass.osm_node.json",result.nodes)
Nodes: 2267 , Write to:  overpass.osm_node.json

查看一下文件。

!ls -l -h
总用量 2.9M
-rw-rw-r-- 1 supermap supermap  26K 5月   4 15:20 osm-discovery.ipynb
-rw-rw-r-- 1 supermap supermap 5.6K 5月   4 15:27 osm-overpass.ipynb
-rw-rw-r-- 1 supermap supermap  15K 4月  23 08:23 osm-tag2json.ipynb
-rw-rw-r-- 1 supermap supermap   10 5月   4 15:17 osm_test.cpg
-rw-rw-r-- 1 supermap supermap 5.8K 5月   4 15:17 osm_test.dbf
-rw-rw-r-- 1 supermap supermap 2.7M 5月   4 15:00 osm_test.osm
-rw-rw-r-- 1 supermap supermap  380 5月   4 15:17 osm_test.shp
-rw-rw-r-- 1 supermap supermap  180 5月   4 15:17 osm_test.shx
-rw-rw-r-- 1 supermap supermap 131K 5月   4 15:27 overpass.osm_node.json