如何获得该地区/地区的国家和城市的区域/地区?

时间:2015-04-07 12:51:01

标签: geolocation geocoding geo geonames

我们做了一个简单的查询来获取一些城市:

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

以下是此查询的结果: enter image description here

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

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

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

2 个答案:

答案 0 :(得分:0)

背景

在Geonames中,您有feature_class es和feature_code s区分位置类型。您可以在Geonames网站上找到detailed description of the code。与快照中一样,P.PPLC表示"城市(人口稠密的地方),它是政治实体的首都" S.HLC表示"建立(现场)酒店"。

此外,每个geoname都有属性来标识"层次结构中的位置"在一个国家内;此属性为country_codeadmin1_codeadmin2_codeadmin3_codeadmin4_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"])