微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将纬度和经度坐标的CSV文件输入API以提取天气数据?

如何解决将纬度和经度坐标的CSV文件输入API以提取天气数据?

下面是我的代码,我在locations变量中使用了long和lat坐标,并通过coordinates_str将其附加到URL。因为我有一个 CSV 文件,其中包含许多位置的纬度和经度坐标,然后将该 CSV 文件作为该 API 的输入(需要身份验证)。 如何在此代码中输入 CSV 文件而不是位置变量?

import requests
import pprint

locations = [(13.84,-12.57),(12.21,-14.69)]

coordinates_str = ','.join(map(lambda a: ' '.join(f'{f:.3f}' for f in a),locations))

# Replace "poi-settings" with the endpoint you would like to call.

URL = f'https://ubiconnect-eu.ubimet.com:8090/pinpoint-data?coordinates={coordinates_str}'
TOKEN = 'TOKEN KEY'

# Create session object that can be used for all requests.
session = requests.Session()
session.headers['Authorization'] = 'Token {token}'.format(token=TOKEN)

# Send GET request to UBIconnect.
res = session.get(URL)
res.raise_for_status()

# Decode JSON response.
poi_info = res.json()
pprint.pprint(poi_info,indent=2,compact=True)

然后我尝试了这种方式:代替坐标_str,我这样做了

import requests
import pprint
import pandas as pd 

df = pd.read_csv(r'E:\route_points.csv')
print(df)


# Replace "poi-settings" with the endpoint you would like to call.
URL = f'https://ubiconnect-eu.ubimet.com:8090/pinpoint-data?'
TOKEN = 'API TOKEN'
params= {'coordinates':(df)}

# Create session object that can be used for all requests.
session = requests.Session()
session.headers['Authorization'] = 'Token {token}'.format(token=TOKEN)

# Send GET request to UBIconnect.
res = session.get(URL,params= params)
res.raise_for_status()

# Decode JSON response.
poi_info = res.json()
pprint.pprint(poi_info,compact=True)

还是不行。

从文档中调用 API 所需的格式为:

# Replace "poi-settings" with the endpoint you would like to call.
URL = 'https://ubiconnect-eu.ubimet.com:8090/poi-settings'
TOKEN = '<YOUR TOKEN GOES HERE>'

所以我用 pinpoint-data 替换了 poi-settings

URL = 'https://ubiconnect-eu.ubimet.com:8090/pinpoint-data?coordinates=longitude<space<latitude'

例如:我将一组坐标放入 API URL

URL = 'https://ubiconnect-eu.ubimet.com:8090/pinpoint-data?coordinates=132.85 12.84'

然后使用上面的 URL 获取该位置的天气数据

解决方法

如果您只想从 CSV 文件一次提交一个坐标块,那么类似以下内容就足够了:

from itertools import islice
import requests
import pprint
import csv

def grouper(n,iterable):
    it = iter(iterable)
    return iter(lambda: tuple(islice(it,n)),())


block_size = 10   # how many pairs to submit per request
TOKEN = 'TOKEN KEY'

# Create session object that can be used for all requests.
session = requests.Session()
session.headers['Authorization'] = 'Token {token}'.format(token=TOKEN)

with open('coordinates.csv',newline='') as f_input:
    csv_input = csv.reader(f_input)
    header = next(csv_input)        # skip the header
    
    for coords in grouper(block_size,csv_input):
        coordinates = ','.join(f'{float(long):.3f} {float(lat):.3f}' for long,lat in coords)
        print(coordinates)
        
        URL = f'https://ubiconnect-eu.ubimet.com:8090/pinpoint-data?coordinates={coordinates}'

        # Send GET request to UBIconnect.
        res = session.get(URL)
        res.raise_for_status()
        
        # Decode JSON response.
        poi_info = res.json()
        
        pprint.pprint(poi_info,indent=2,compact=True)

(显然这没有经过测试 - 没有令牌)。确保您的 CSV 文件中没有空行。


要输出到文件,请添加输出文件:

with open('coordinates.csv',newline='') as f_input,open('output.json','w',encoding='utf-8')  as f_output:

并在 pprint() 调用中使用它:

pprint.pprint(poi_info,f_output,compact=True)
f_output.write('\n')    # add blank line if needed
,

希望这就是你要找的

import csv
locations = list()
with open("foo.csv") as csvf:
    csvreader = csv.DictReader(csvf)    
    for row in csvreader:
        locations.append((float(row["lat"]),float(row["long"])))
# now add your code
coordinates_str = ','.join(map(lambda a: ' '.join(f'{f:.3f}' for f in a),locations))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。