3
votes

Récupérer la liste des villes d'un pays

Quelle est la meilleure API pour récupérer toutes les villes d'un pays donné? J'ai essayé de télécharger à partir de géonames. mais il semble que les données ne soient pas fiables. » Est-il possible d'interroger la ville, ainsi que l'état et le pays dans l'API de passage supérieur?

Pouvez-vous suggérer une meilleure façon de télécharger les villes et leurs points?


1 commentaires

Si vous ne l'avez pas déjà fait, je vous recommande de rechercher et de publier la question sur le site SIG: gis.stackexchange.com . OSM a également son propre forum d'aide avec des questions similaires comme celle-ci: help.openstreetmap.org/questions/13877/...


3 Réponses :


0
votes

Je répondrai à votre deuxième question concernant l'API Overpass. Vous pouvez interroger les villes d'un pays particulier à l'aide de cette API. Juste pour démontrer ses capacités, il existe un outil de requête Web pour OSM appelé Overpass Turbo ( http: // overpass-turbo. eu ) où vous pouvez soumettre des requêtes et afficher et télécharger des données. La requête suivante fournira toutes les villes des États-Unis, par exemple:

{
      "type": "Feature",
      "properties": {
        "@id": "node/29941752",
        "alt_name:ru": "ÐœÑдиÑон",
        "capital": "4",
        "is_in:continent": "North America",
        "is_in:country": "USA",
        "name": "Madison",
        "name:en": "Madison",
        "name:pl": "Madison",
        "name:ru": "МадиÑон",
        "name:ta": "மேடிசனà¯",
        "name:uk": "МедіÑон",
        "place": "city",
        "population": "243344",
        "state_capital": "yes",
        "website": "http://www.cityofmadison.com/",
        "wikidata": "Q43788",
        "wikipedia": "en:Madison, Wisconsin"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -89.3837613,
          43.074761
        ]
      },
      "id": "node/29941752"
    },

La requête renverra ce qui suit:

 entrez la description de l'image ici a>

Selon le OSM Wiki , la "ville "tag est utilisé" pour identifier la ou les plus grandes agglomérations dans un territoire, y compris les capitales nationales, étatiques et provinciales, et d'autres grandes agglomérations. " Sur la même page Wiki, il y a une note sur la différenciation entre les villes et les villes. Dans la requête ci-dessus, «ville» peut être remplacé par «ville». D'autres valeurs possibles (y compris le pays et l'état) sont répertoriées ici: https: //wiki.openstreetmap .org / wiki / Key: place # Values ​​

Si vous cherchez à obtenir des relations ville-état à partir des données, vous n'obtiendrez pas toujours des résultats fiables. Par exemple, vous pouvez obtenir l'entrée GeoJSON détaillée suivante pour Duluth, MN:

    {
      "type": "Feature",
      "properties": {
        "@id": "node/19188464",
        "is_in": "Minnesota USA",
        "is_in:continent": "North America",
        "is_in:country": "USA",
        "is_in:country_code": "US",
        "is_in:state": "Minnesota",
        "name": "Duluth",
        "name:ja": "ダルース",
        "name:oj": "Onigamiinsing",
        "name:ru": "Дулут",
        "place": "city",
        "population": "86265",
        "population:source": "2010",
        "wikidata": "Q485708",
        "wikipedia": "en:Duluth, Minnesota"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -92.1251218,
          46.7729322
        ]
      },
      "id": "node/19188464"
    },

mais uniquement l'entrée suivante pour Madison, WI:

{{geocodeArea:"United States"}}->.searchArea;
(
  node["place"="city"](area.searchArea);
);
out body;
>;
out skel qt;


1 commentaires

Une ligne à souligner ici est celle avec > ... cette soi-disant récursivité rend la syntaxe assez concise.



2
votes

J'ai effectué une tâche similaire en utilisant overpass api avec l'aide de overpy qui est un paquet python.

Premièrement, j'ai récupéré tous les états du pays en utilisant la requête

    [out:json];
    area["ISO3166-2"="{0}"]["admin_level"="4"];
    (rel["name"="Thiruvananthapuram"](area);)->.center;
    node(around.center:10000)["place"];
    out;"""

Maintenant, j'ai récupéré tous les districts pour chaque état qui est admin_level = 5 .

    [out:json];
    area["ISO3166-2"="IN-KL"];
    (rel(area)["admin_level"="5"];);
    out;

L'état ISO3166-2 provient des données reçues de l'API. Vous pouvez maintenant récupérer les villes de chaque district à l'aide des données de l'API.

    [out:json];
    area["ISO3166-1"="IN"];
    (rel(area)["admin_level"="4"];);
    out;

Cela a fonctionné pour moi. N'oubliez pas que la récupération de toutes les villes d'un pays est une tâche vraiment énorme pour les serveurs OSM. Récupérez les données dont vous avez vraiment besoin.


0 commentaires

0
votes

si vous êtes spécifique au nom de la ville ou de l'état ou du pays, vous pouvez utiliser cette API. https://pypi.org/project/geosky/

Cette API a un enregistrement de tous les pays, états et villes. Voici l'exemple de code ...

from geosky import geo_plug

geo_plug.all_CountryNames()

geo_plug.all_Country_StateNames()

geo_plug.all_State_CityNames(name)# name == 'all' or state name
geo_plug.all_State_CityNames('Odisha')


0 commentaires