【问题标题】:how to convert from longitude and latitude to country or city?如何将经度和纬度转换为国家或城市?
【发布时间】:2013-11-24 00:00:13
【问题描述】:

我需要将经度和纬度坐标转换为国家或城市,python中有这样的例子吗?

提前致谢!

【问题讨论】:

    标签: python python-2.7 python-3.x


    【解决方案1】:

    我使用 Google 的 API。

    from urllib2 import urlopen
    import json
    def getplace(lat, lon):
        url = "http://maps.googleapis.com/maps/api/geocode/json?"
        url += "latlng=%s,%s&sensor=false" % (lat, lon)
        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
    
    
    print(getplace(51.1, 0.1))
    print(getplace(51.2, 0.1))
    print(getplace(51.3, 0.1))
    

    输出:

    (u'Hartfield', u'United Kingdom')
    (u'Edenbridge', u'United Kingdom')
    (u'Sevenoaks', u'United Kingdom')
    

    【讨论】:

    • 这太棒了,有没有一种干净的方法可以在不使用拆分的情况下选择城市和国家?
    • 是的,我已经修改了返回城市和国家/地区的答案
    • 这工作正常,但是有没有办法在本地做到这一点?某种 api,延迟是我正在尝试做的一个巨大的瓶颈
    • 对于 Python > 3.5 使用 from urllib.request import urlopen
    • 现在google map api需要key才能使用。我需要注册一个结算帐户。拿到key后,需要把第一个url改成url = "https://maps.googleapis.com/maps/api/geocode/json?key=YourKey&"(注意:必须是https,不是http)
    【解决方案2】:

    Google 已经移除了对其 API 的无密钥访问。前往谷歌并注册一个密钥,您每天可以获得约 1,000 个免费查询。接受答案中的代码应该像这样修改(不能添加评论,没有足够的代表)。

    from urllib.request import urlopen
    import json
    
    def getplace(lat, lon):
        key = "yourkeyhere"
        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
    
    print(getplace(51.1, 0.1))
    print(getplace(51.2, 0.1))
    print(getplace(51.3, 0.1))
    

    【讨论】:

      【解决方案3】:

      这称为反向地理编码。我可以在 Python 中找到一个专注于此的库:https://github.com/thampiman/reverse-geocoder

      一些与其他想法相关的问题:

      【讨论】:

        【解决方案4】:

        一般来说,Google API 是最好的方法。它不适合我的情况,因为我必须处理大量条目并且 api 很慢。

        我编写了一个小版本,它做同样的事情,但首先下载一个巨大的几何图形并计算机器上的国家/地区。

        import requests
        
        from shapely.geometry import mapping, shape
        from shapely.prepared import prep
        from shapely.geometry import Point
        
        
        data = requests.get("https://raw.githubusercontent.com/datasets/geo-countries/master/data/countries.geojson").json()
        
        countries = {}
        for feature in data["features"]:
            geom = feature["geometry"]
            country = feature["properties"]["ADMIN"]
            countries[country] = prep(shape(geom))
        
        print(len(countries))
        
        def get_country(lon, lat):
            point = Point(lon, lat)
            for country, geom in countries.iteritems():
                if geom.contains(point):
                    return country
        
            return "unknown"
        
        print(get_country(10.0, 47.0))
        # Austria
        

        【讨论】:

        • 这个 pip 扩展也很有趣,可能不是那么准确,因为它基于一些参考点并做了一些插值:pypi.python.org/pypi/reverse_geocode/1.0
        • 对于 Python 3 使用:对于国家,geom in countries.items():
        • 如果您正在寻找静态解决方案,您实际上可以先一步下载 url 中提到的文件并以这种方式阅读:with open('countries.geojson', 'w')作为 fp: 数据 = json.loads(fp.read())
        【解决方案5】:
        # Python3 program for reverse geocoding. 
        
        # importing necessary libraries 
        import reverse_geocoder as rg 
        from pandas import DataFrame
        import pandas as pd
        
        def reverseGeocode(coordinates): 
            result = rg.search(coordinates) 
            
            return result
        
            
        # Coorinates tuple.Can contain more than one pair. 
        
        if __name__ == "__main__":
            result = []
            path = "CSV_NAME.CSV"
            df = pd.read_csv(path, error_bad_lines=False)
            for i in range(0, len(df)):
                coordinates =(df["latitude"], df["longitude"]) 
                result.append(reverseGeocode(coordinates))
            print(result)
                
        

        【讨论】:

        • python中有一个名为“reverse_geocoder”的模块,使用它我们可以获得物理地址。试试看。
        猜你喜欢
        • 1970-01-01
        • 2014-06-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 2011-09-03
        • 1970-01-01
        相关资源
        最近更新 更多