我们做了一个简单的查询来获取一些城市:
SELECT * FROM `allCountries` WHERE name='Moscow' and `country_code` = 'RU'
例如,对于另一个城市,我们得到4-7行的结果。
如何获取一个国家/地区的所有区域/地区,然后获取该地区/地区的所有城市?
P.S。:请小心。我们对API站点和数据库提取不感兴趣。谢谢!的
答案 0 :(得分:0)
在Geonames中,您有feature_class
es和feature_code
s区分位置类型。您可以在Geonames网站上找到detailed description of the code。与快照中一样,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'),但您可以通过更改它来查找任何深度的管理级别到:
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中删除(整个&#34; AND ...&#34;子句)。
当然,你可以做原作&#34;莫斯科&#34;在此过滤集内搜索。
答案 1 :(得分:0)
您的问题的答案很长,但这段代码可能对您有所帮助。这些查询获取有关给定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"])