在这种特殊情况下,如何使用地理编码获取公司的正确位置? Python,Google API

问题描述

我想获取已经清理过的数据框中列出的公司的经度和纬度,但是我所掌握的唯一信息是公司名称和所在国家/地区(在本例中为英国)。

DataFrame

在尝试了不同的方法之后,我得到了一些经纬度,但在大多数情况下没有在英国。 这是我尝试的代码

base_url= "https://maps.googleapis.com/maps/api/geocode/json?"
AUTH_KEY = "AI**************QTk"
geolocator = GoogleV3(api_key = AUTH_KEY)

parameters = {"address": "Revolut,London","key": AUTH_KEY}
print(f"{base_url}{urllib.parse.urlencode(parameters)}")
r = requests.get(f"{base_url}{urllib.parse.urlencode(parameters)}")
data = json.loads(r.content)
data.get("results")[0].get("geometry").get("location")   #That works for the first company

df["loc"] = df["Company name for communication"].apply(geolocator.geocode)
df["point"]= df["loc"].apply(lambda loc: tuple(loc.point) if loc else None)
df[['lat','lon','altitude']] = pd.DataFrame(df['point'].to_list(),index=df.index)

DataFrame with long and lat wrong

我会非常感谢您的帮助。如果我的解释不清楚,请提供详细信息。谢谢!

解决方法

如果您只想在英国获得Geocoding API结果,那么您将要使用组件过滤。

Geocoding API可以返回仅限于特定区域的地址结果。您可以使用components过滤器指定限制。有关更多信息,请参见Component Filtering。具体来说,您需要添加country

请注意,该值应为国家名称或两个字母的ISO 3166-1国家/地区代码。 API遵循用于定义国家/地区的ISO标准,并且在使用国家/地区的相应ISO代码时,过滤效果最佳。例如

这是一个示例地理编码Web请求,其中包含在英国进行过滤的国家/地区组件,如下所示:

https://maps.googleapis.com/maps/api/geocode/json?address=high+st+hasting&components=country:gb&key=YOUR_API_KEY

这只会返回仅位于英国的结果,如果不存在,将返回零结果。

您可能还想看看region biasing

请注意,如果您偏爱该地区,则返回的结果prefers会导致该国家/地区,但doesn't restrict会返回该国家/地区,并会返回地址的结果。与组件过滤不同,此方法采用ccTLD(国家代码顶级域)参数来指定区域偏差。大多数ccTLD代码与ISO 3166-1代码相同,但有一些明显的例外。例如,英国的ccTLD为“ uk”(。co.uk),而其ISO 3166-1代码为“ gb”(专门针对“大不列颠及北爱尔兰联合王国”的实体)。

也请看看Geocoding API Best Practices

,

非常感谢您的回答,

我使用以下代码对组件进行了过滤:

#Get the location of first company
base_url= "https://maps.googleapis.com/maps/api/geocode/json?"
AUTH_KEY = "AI********************vxQTk"
geolocator = GoogleV3(api_key = AUTH_KEY)

components = [ ('country','GB' )]
def get_location(x):
    return geolocator.geocode(x,components=components)

df["loc"] = df["Company name for communication"].apply(get_location)
df["point"]= df["loc"].apply(lambda loc: tuple(loc.point) if loc else None)
df[['lat','lon','altitude']] = pd.DataFrame(df['point'].to_list(),index=df.index)
df

DataFrame with lat and lon

我也有一些NaN,但我会尽力解决。

非常感谢您

马克