背景
在 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 ...”子句)。
当然,您可以在这个过滤集中进行原始的“莫斯科”搜索。