通过API获取城市坐标

问题描述 投票:0回答:2

我有一个缺少纬度和经度数据的城市列表。

我发现一个API,输入城市后返回经纬度信息: https://rapidapi.com/apininjas/api/geocoding-by-api-ninjas

我现在想要自动化该过程(使用 Python 或 R),我将在其中输入城市列表,它会为我提供表中每个城市的纬度和经度。

我在 R 中有这段代码来从 API 获取结果,但我需要让它自动处理整个城市列表:

req <- request("https://geocoding-by-api-ninjas.p.rapidapi.com/") %>%
 req_url_path("v1/geocoding") %>%
 req_url_query(name = "New York") %>%
 req_headers('X-RapidAPI-Key'='xxxxx',
              'X-RapidAPI-Host'='xxx')

req %>% req_dry_run()

resp <- req %>% 
  req_perform() 

resp %>%
  resp_body_string()

您能否帮忙提供代码示例或一些更智能的方法来实现结果?

谢谢! :)

python r api geocoding
2个回答
0
投票

取决于您希望的输出;编辑函数。现在它返回可能匹配的数据框。

library(tidyverse)
library(httr2)

cities <- c("New York", "Seattle", "Los Angeles", "New Orleans")

fetch_geo <- function(city_string) {
  request("https://geocoding-by-api-ninjas.p.rapidapi.com/") %>%
    req_url_path("v1/geocoding") %>%
    req_url_query(city = city_string, .multi = "explode") %>%
    req_headers('X-RapidAPI-Key'='YOU-API-KEY',
                'X-RapidAPI-Host'='geocoding-by-api-ninjas.p.rapidapi.com') %>% 
    req_perform() %>% 
    resp_body_json(simplifyVector = TRUE)
}

map(cities, fetch_geo)

[[1]]
             name  latitude  longitude country       state
1 New York County 40.712728  -74.00602      US    New York
2        New York 55.025300   -1.48695      GB     England
3        New York 39.685287  -93.92688      US    Missouri
4        New York  7.963112  -11.76369      SL Bo District
5     Lake Oswego 45.420675 -122.67065      US      Oregon

[[2]]
         name latitude longitude country      state
1     Seattle 47.60383 -122.3301      US Washington
2     Seattle 20.71997 -103.3763      MX    Jalisco
3 Laurelhurst 45.52651 -122.6245      US     Oregon

[[3]]
         name   latitude  longitude country         state
1 Los Angeles  34.053691 -118.24277      US    California
2 Los Angeles   9.390064  -75.23892      CO         Sucre
3 Los Ángeles -37.470745  -72.35169      CL Biobío Region
4 Los Angeles   8.524167  -82.19419      PA      Chiriquí
5 Los Angeles   4.800889  -75.69150      CO     Risaralda

[[4]]
         name   latitude longitude country        state
1 New Orleans  29.975998 -90.07821      US    Louisiana
2 New Orleans  13.104117 -59.61902      BB         <NA>
3 New Orleans -33.715531  18.98695      ZA Western Cape
4 New Orleans   9.638393 -74.61233      CO    Magdalena
5 New Orleans  13.665107 -85.39754      NI     Jinotega

每个城市名称的最佳匹配:

fetch_geo <- function(city_string) {
  request("https://geocoding-by-api-ninjas.p.rapidapi.com/") %>%
    req_url_path("v1/geocoding") %>%
    req_url_query(city = city_string, .multi = "explode") %>%
    req_headers('X-RapidAPI-Key'='YOU-API-KEY',
                'X-RapidAPI-Host'='geocoding-by-api-ninjas.p.rapidapi.com') %>% 
    req_perform() %>% 
    resp_body_json(simplifyVector = TRUE) %>% 
    slice_head(n = 1)
}

map_dfr(cities, fetch_geo)

             name latitude  longitude country      state
1 New York County 40.71273  -74.00602      US   New York
2         Seattle 47.60383 -122.33006      US Washington
3     Los Angeles 34.05369 -118.24277      US California
4     New Orleans 29.97600  -90.07821      US  Louisiana

0
投票

在Python中这真的很容易。您只需要安装库“requests”即可。 代码看起来像这样:

import requests

cities = ["London", "Brooklyn"]
url = "https://geocoding-by-api-ninjas.p.rapidapi.com/v1/geocoding"
headers = {
    "X-RapidAPI-Key": "YOU-API-KEY",
    "X-RapidAPI-Host": "geocoding-by-api-ninjas.p.rapidapi.com"
}

for city in cities:
    response = requests.request("GET", f"{url}?name={city}", headers=headers)
    print(repsonse.text)

© www.soinside.com 2019 - 2024. All rights reserved.