Getting Streets of a specific postcode using Open Street Maps

不打扰是莪最后的温柔 提交于 2019-12-11 02:56:50

问题


I want to write a code that has the Countrycode and Postcode as an input and the ouput are the streets that are in the given postcode using some apis that use GSM.

My tactic is as follows:

  1. I need to get the relation Id of the district. For Example 1991416 is the relation id for the third district in Vienna - Austria. It's provided by the nominatim api: http://nominatim.openstreetmap.org/details.php?place_id=158947085

  2. Put the id in this api url: http://polygons.openstreetmap.fr/get_wkt.py?id=1991416&params=0

  3. After downloading the polygon I can put the gathered polygon in this query on the overpass api

    ( way (poly: "polygone data") ["highway"~"^(primary|secondary|tertiary|residential)$"] ["name"];

    ); out geom;

And this gives me the streets of the searched district. My two problems with this solution are 1. that it takes quite a time, because asking three different APIs per request isn't that easy on ressources and 2. I don't know how to gather the relation Id from step one automatically. When I enter a Nominatim query like http:// nominatim.openstreetmap.org/search?format=json&country=austria&postalcode=1030 I just get various point in the district, but not the relation id of the searched district in order to get the desired polygone.

So my questions are if someone can tell my how I can get the relation_Id in order to do the mentioned workflow or if there is another, maybe better way to work this issue out.

Thank you for your help!

Best Regards Daniel


回答1:


You can simplify your approach quite a bit, down to a single Overpass API call, assuming you define some relevant tags to match the relation in question. In particular, you don't have to resort to using poly at all, i.e. there's no need to convert a relation to a list of lat/lon pairs. Nowadays the concept of an area can be used instead to query for certain objects in a polygon defined by a way or relation. Please check out the documentation for more details on areas.

To get the matching area for relation 1991416, I have used postal_code=1030 and boundary=administrative as filter criteria. Using that area you can then search for ways in this specific polygon:

//uncomment the following line, if you need csv output
//[out:csv(::id, ::type, name)];

//adjust area to your needs, filter critera are the same as for relations
area[postal_code=1030][boundary=administrative]->.a;

// Alternative:  {{geocodeArea:name}} -> see
// http://wiki.openstreetmap.org/wiki/Overpass_turbo/Extended_Overpass_Queries

way(area.a)["highway"~"^(primary|secondary|tertiary|residential)$"]["name"];
(._;>;);out meta;

// just for checking if we're looking at the right area
rel(pivot.a);out geom;

Try it on overpass turbo link: http://overpass-turbo.eu/s/6uN

Note: not all ways/relations have a corresponding area, i.e. some area generation rules apply (see wiki page above). For your particular use case you should be ok, however.



来源:https://stackoverflow.com/questions/27429376/getting-streets-of-a-specific-postcode-using-open-street-maps

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!