我们做了一个简单的查询,得到了一些城市:
SELECT * FROM `allCountries` WHERE name='Moscow' and `country_code` = 'RU'以下是此查询的结果:

例如,对于另一个城市,我们得到了4-7行的结果。
如何得到一个国家的所有地区/地区,然后得到这个地区/地区的所有城市?
请小心点。我们对API站点和数据库获取不感兴趣。谢谢!
发布于 2015-04-09 08:24:37
背景
在Geonames中,您有区分位置类型的feature_class、es和feature_codes。您可以在Geonames网站上找到代码的详细描述。在你的快照中,P.PPLC的意思是“城市(人口稠密的地方),这是一个政治实体的首都”,而S.HLC的意思是“建筑(点)酒店”。
而且,每个geoname都有属性来标识国家内部“层次结构”中的位置;这些属性是country_code、admin1_code、admin2_code、admin3_code、admin4_code。请注意,并非每个给定的地理名称都使用所有的属性,因为这取决于一个国家的政治组织。
找到一个行政级别内的所有城市
要在一个区域(即管理级别)中查找所有城市,您必须首先搜索该管理级别的geoname,以便具有用于筛选城市查询的管理代码。
要找到管理级别,首先必须执行如下查询:
SELECT *
FROM `allCountries`
WHERE `country_code` = 'RU'
AND `feature_class`='A'
AND `feature_code`='ADM1'请注意,查询只筛选出第一个管理级别(feature_code=‘ADM1 1’),但是可以通过将其更改为:
SELECT *
FROM `geonames`
WHERE `country_code` = 'RU'
AND `feature_class`='A'
AND `feature_code` LIKE 'ADM_'现在,从这个结果集中选择一个记录,然后使用该级别的“层次结构”代码搜索城市。你应该使用类似于(比照)的东西:
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中删除这些代码(整个“和.”)。条款)。
当然,你可以在这个过滤的集合中做原始的“莫斯科”搜索。
发布于 2015-04-27 10:43:02
您的问题的答案是相当长的,但这段代码片段可能会对您有所帮助。这些查询获取所有关于给定的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"])https://stackoverflow.com/questions/29492083
复制相似问题