如何在单次调用OSM API中获取(lat,lon)对的列表?

时间:2014-08-13 22:12:54

标签: openstreetmap overpass-api

考虑到OSM中的Way的ID,我想得到(lat,lon)对的列表。

如果我通过标准API请求方式,我会得到一个节点ID列表:

$ curl 'http://www.openstreetmap.org/api/0.6/way/158602261'
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" ...>
 <way id="158602261" visible="true" ...>
  <nd ref="295505187"/>
  <nd ref="1736599935"/>
  <nd ref="295505112"/>
  ...
</osm>

然后,我可以对每个节点进行后续查询:

$ curl 'http://www.openstreetmap.org/api/0.6/node/295505187'
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" ...>
  <node id="295505187" visible="true" ... lat="37.7702484" lon="-122.5107188"/>
</osm>

但这需要许多API请求,路径中每个节点一个。

是否可以使用较少的API调用获取纬度/经度列表?只需一个电话就可以了。

3 个答案:

答案 0 :(得分:4)

只需将 / full 附加到网址,例如http://www.openstreetmap.org/api/0.6/way/158602261/full

答案 1 :(得分:2)

我不确定是否可以使用普通的OSM API来完成,但可以使用Overpass API的递归语句来完成:

$ curl 'http://overpass.osm.rambler.ru/cgi/interpreter?data=%5Bout:json%5D;(way(158602261);%3E;);out;'
{
  "version": 0.6,
  "generator": "Overpass API",
  ...
  "elements": [

{
  "type": "node",
  "id": 30677708,
  "lat": 37.7712040,
  "lon": -122.5108280
},
{
  "type": "node",
  "id": 30677709,
  "lat": 37.7730278,
  "lon": -122.4715596
},
...
{
  "type": "way",
  "id": 158602261,
  "nodes": [
    295505187,
    1736599935,
    295505112,
    295505186,
    ...
  ]
}
  ]
}

答案 2 :(得分:0)

由于您明确要求单路ID的纬度/经度对列表,您可以使用Overpass API CSV输出模式。

[out:csv(::lat,::lon;false)];
way(158602261);>;out;

(页眉线被&#34; false&#34;

压制。)

结果:

37.7712040  -122.5108280
37.7730278  -122.4715596
37.7733457  -122.4652858
37.7746245  -122.4547306
37.7664503  -122.4531098
...

Overpass Turbo Link:http://overpass-turbo.eu/s/6NG