国中国

真正意义上的「国中国」(enclaved country)指的是一个国家的领土完全被另一个国家包围的情形,像被南非包围的莱索托,或者被意大利包围的梵蒂冈。而本文我们要讨论的则是一种扩展意义上的「国中国」:一个国家的地图不可避免地包括另一个国家的完整领土。

我试了下用Mathematica,一行代码就能输出所有此种意义下的「国中国」,果然Mathematica 大法好啊,当然代码可读性确实差了些:

1
MapAt[Style[#, Blue]&, Map[TextTranslation[EntityValue[#, "Name"], "en"->"zh"]&, (Function[c, {c}~Join~(EntityList["Country"]~Select~(AllTrue[Subtract@@Flatten/@GeoBounds/@{c, #}*{-1, 1, -1, 1}, Positive]&))]/@EntityList["Country"])~Select~(Length[#]>1&), {2}], {All, 1}]~Grid~(Dividers->{False, All})

结果为:

国家
阿尔及利亚直布罗陀
阿根廷福克兰群岛
巴西玻利维亚巴拉圭
加拿大圣皮埃尔和密克隆
中国孟加拉国不丹香港澳门蒙古尼泊尔北朝鲜韩国台湾
哥伦比亚库拉索
刚果民主共和国布隆迪卢旺达
埃及加沙地带
埃塞俄比亚吉布提
法国安道尔根西岛泽西卢森堡摩纳哥
格陵兰冰岛
印度孟加拉国不丹尼泊尔
印度尼西亚文莱圣诞岛东帝汶新加坡
伊朗巴林科威特
以色列约旦河西岸
意大利摩纳哥圣马力诺斯洛文尼亚梵蒂冈城
基里巴斯图瓦卢
马达加斯加马约特
马来西亚文莱新加坡
墨西哥伯利兹
挪威奥兰群岛
俄国蒙古
沙特阿拉伯巴林科威特卡塔尔
塞内加尔冈比亚
南非莱索托斯威士兰
西班牙安道尔直布罗陀
瑞典奥兰群岛
瑞士列支敦士登
乌克兰摩尔多瓦
英国马恩岛
美国本土外小岛屿伯利兹开曼群岛哥斯达黎加萨尔瓦多危地马拉洪都拉斯牙买加尼加拉瓜巴拿马
委内瑞拉特立尼达和多巴哥
越南柬埔寨

有几点要说明下:

  • 这个只考虑了墨卡托、等距圆柱之类的圆柱投影,像常用圆锥投影的俄罗斯就能再囊括好些国家。
  • Mathematica中「Country」数据应该是包含了所有被分配了ISO 3166-1代码的国家/地区,有些并不是真正的国家,所以也出现了像「美国本土外小岛屿」(United States Minor Outlying Islands)地图囊括一大票中美洲国家的情形。
  • Mathematica的TextTranslation有个别误译的情形,像英国属地泽西被翻作「新泽西」,约旦河西岸被翻作「西方银行」,上表中我都作了修正。

下面是几张意示图:

中国地图中必定完整出现的国家/地区
法国地图中必定完整出现的国家/地区
印度地图中必定完整出现的国家/地区

另外,如果仅考虑联合国成员国的话(使用CountryData["UN"]替代EntityList["Country"]),结果如下:

国家
巴西玻利维亚巴拉圭
中国孟加拉国不丹蒙古尼泊尔北朝鲜韩国
刚果民主共和国布隆迪卢旺达
埃塞俄比亚吉布提
法国安道尔卢森堡摩纳哥
印度孟加拉国不丹尼泊尔
印度尼西亚文莱东帝汶新加坡
伊朗巴林科威特
意大利摩纳哥圣马力诺斯洛文尼亚
基里巴斯图瓦卢
马来西亚文莱新加坡
墨西哥伯利兹
俄国蒙古
沙特阿拉伯巴林科威特卡塔尔
塞内加尔冈比亚
南非莱索托斯威士兰
西班牙安道尔
瑞士列支敦士登
乌克兰摩尔多瓦
委内瑞拉特立尼达和多巴哥
越南柬埔寨

具体代码放在了Wolfram Cloud上。为了可读性,我也就把前文那一行代码给拆开来了。