Python - 获取名称为

时间:2017-02-20 01:52:52

标签: python geocoding google-geocoder google-geocoding-api geography

我可以使用什么样的python API来获取城市人口?我曾尝试使用地理编码器,但它无法正常工作 - 不确定原因。

geocoder.population('San Francisco, California')

返回

'module' object has no attribute 'population'

为什么会发生这种情况,我该如何解决?

或者,我可以使用不同的python api吗?

2 个答案:

答案 0 :(得分:0)

当然,您可以使用地址解析器和Google来获取城市的人口, 但它需要一个API key

以下是两种完全不同的替代解决方案:

OpenDataSoft

第一个解决方案使用OpenDataSoft API和基本的Python 3。

国家/地区需要通过两个字母的国家/地区代码指定,请参见下面的示例。

double

WikiData

第二种解决方案使用WikiData APIqwikidata软件包。

在这里,该国家/地区以其英文名称(或其中一部分)给出,请参见下面的示例。

我确信SPARQL命令可以更高效,更优雅地编写(可以随意编辑),但是确实可以完成工作。

import requests
import json

def get_city_opendata(city, country):
    tmp = 'https://public.opendatasoft.com/api/records/1.0/search/?dataset=worldcitiespop&q=%s&sort=population&facet=country&refine.country=%s'
    cmd = tmp % (city, country)
    res = requests.get(cmd)
    dct = json.loads(res.content)
    out = dct['records'][0]['fields']
    return out

get_city_opendata('Berlin', 'de')

#{'city': 'berlin',
# 'country': 'de',
# 'region': '16',
# 'geopoint': [52.516667, 13.4],
# 'longitude': 13.4,
# 'latitude': 52.516667,
# 'accentcity': 'Berlin',
# 'population': 3398362}

get_city_opendata('San Francisco', 'us')

#{'city': 'san francisco',
# 'country': 'us',
# 'region': 'CA',
# 'geopoint': [37.775, -122.4183333],
# 'longitude': -122.4183333,
# 'latitude': 37.775,
# 'accentcity': 'San Francisco',
# 'population': 732072}

这两种方法都返回字典,您可以使用基本Python从中提取所需的信息。

希望有帮助!

答案 1 :(得分:0)

from urllib.request import urlopen
import json
import pycountry
import requests
from geopy.geocoders import Nominatim


def get_city_opendata(city, country):
    tmp = 'https://public.opendatasoft.com/api/records/1.0/search/?dataset=worldcitiespop&q=%s&sort=population&facet=country&refine.country=%s'
    cmd = tmp % (city, country)
    res = requests.get(cmd)
    dct = json.loads(res.content)
    out = dct['records'][0]['fields']
    return out


def getcode(cc):

    countries = {}
    for country in pycountry.countries:
        countries[country.name] = country.alpha_2

    codes = countries.get(cc)
    
    return codes


def getplace(lat, lon):
    key = "PUT YOUR OWN GOOGLE API KEY HERE" #PUT YOUR OWN GOOGLE API KEY HERE
    url = "https://maps.googleapis.com/maps/api/geocode/json?"
    url += "latlng=%s,%s&sensor=false&key=%s" % (lat, lon, key)
    v = urlopen(url).read()
    j = json.loads(v)
    components = j['results'][0]['address_components']
    country = town = None
    for c in components:
        if "country" in c['types']:
            country = c['long_name']
        if "postal_town" in c['types']:
            town = c['long_name']

    return town, country


address= input('Input an address or town name\t')
geolocator = Nominatim(user_agent="Your_Name")
location = geolocator.geocode(address)


locationLat = location.latitude
locationLon = location.longitude

towncountry = getplace(location.latitude, location.longitude)
mycity = towncountry[0]
mycountry = towncountry[1]


print(towncountry)
print(mycountry)
print(mycity)
mycccode = getcode(mycountry)
mycccode = mycccode.lower()
print(mycccode)

populationdict = get_city_opendata(address, mycccode)


population = populationdict.get('population')
print('population',population)

print(location.address)
print((location.latitude, location.longitude))

非常感谢之前的回答。我也不得不解决这个问题。我上面的代码是从上面大卫的回答中继承的,他在那里推荐了 OpenDataSoft API。显然 Google API 目前不提供人口结果。

我下面使用的代码能够获取城市人口,OpenDataSoft 并不总是返回城镇人口。

我的代码结合了我在 stackoverflow 上发现的不同问题的几个答案的代码。

您需要获得一个谷歌地图开发者 API 密钥,并进行相关的 pip 安装。

  1. 首先这段代码获取任何地名的长纬度坐标
    基于用户输入
  2. 然后它使用这些来从谷歌地图中获取国家名称
  3. 然后它使用国家名称得到缩写的2
    国家的信
  4. 然后它发送地名和缩写的 2 个字母以从 OpenDataSoft 中获取人口