【问题标题】:How to get areas/regions for a country and cities for this area/region?如何获取一个国家的地区/地区和该地区/地区的城市?
【发布时间】:2015-06-12 01:53:51
【问题描述】:

我们做了一个简单的查询,得到一些城市:

SELECT * FROM `allCountries` WHERE name='Moscow' and `country_code` = 'RU'

这是此查询的结果:

例如,对于另一个城市,我们得到 4-7 行的结果。

如何获取一个国家的所有地区/地区,然后获取该地区/地区的所有城市?

P.S.:请小心。我们对 API 站点和数据库获取不感兴趣。谢谢!

【问题讨论】:

    标签: geolocation geocoding geo geonames


    【解决方案1】:

    背景

    在 Geonames 中,您有 feature_classes 和 feature_codes 来区分位置类型。您可以在 Geonames 网站上找到 detailed description of the code。如您的快照所示,P.PPLC 表示“作为政治实体的首都的城市(人口稠密的地方)”,S.HLC 表示“建筑(地点)酒店”。

    此外,每个地名都有属性来识别国家内部“层次结构”中的位置;这个属性是country_code、admin1_code、admin2_code、admin3_code、admin4_code。请注意,并非所有属性都用于每个给定的地名,因为这取决于一个国家的政治组织。

    查找一个行政级别内的所有城市

    要查找一个区域内的所有城市(即行政级别),您必须首先搜索该行政级别的地理名称,以便获得用于过滤城市查询的管理代码。

    要查找管理员级别,您必须首先执行如下查询:

    SELECT *
    FROM `allCountries`
    WHERE `country_code` = 'RU'
    AND `feature_class`='A'
    AND `feature_code`='ADM1'
    

    请注意,该查询仅过滤出 first 管理员级别 (feature_code='ADM1'),但您可以通过将其更改为以下方式找到任何深度的管理员级别:

    SELECT *
    FROM `geonames`
    WHERE `country_code` = 'RU'
    AND `feature_class`='A'
    AND `feature_code` LIKE 'ADM_'
    

    现在,从该结果集中选择一条记录,然后使用该级别的“层次结构”代码搜索城市。您应该使用类似 (mutatis mutandis):

    SELECT *
    FROM `geonames`
    WHERE `country_code` = "RU"
    AND `feature_class`='P'
    AND `feature_code` LIKE 'PPL%'
    AND `admin1_code`="<admin1>"
    AND `admin2_code`="<admin2>"
    AND `admin3_code`="<admin3>"
    AND `admin4_code`="<admin4>"
    

    注意NULL 管理代码,您需要从 SQL 中删除这些代码(整个“AND ...”子句)。

    当然,您可以在这个过滤集中进行原始的“莫斯科”搜索。

    【讨论】:

      【解决方案2】:

      您的问题的答案很长,但是这段代码 sn-p 可能会对您有所帮助。这些查询获取有关给定 geonameid 的所有层次结构信息(它是 postgres 中的 plpython)。

      get_geoname = plpy.prepare("SELECT geonameid, asciiname, country, admin1, admin2 FROM all_countries where geonameid=$1",
              ["integer"])
      
      get_country_name = plpy.prepare("SELECT name as country from country_info where code = upper($1)", ["varchar"])
      
      get_admin1 = plpy.prepare("SELECT asciiname, name FROM admin1 where code = $1", ["text"])
      get_admin2 = plpy.prepare("SELECT asciiname, name FROM admin2 where code = $1", ["text"])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-02
        • 1970-01-01
        • 2019-08-05
        • 1970-01-01
        • 2015-04-14
        • 2011-04-28
        • 2011-10-12
        相关资源
        最近更新 更多