目录
前言
一、首都空间表的设计
1、三张空间表的结构
二、SpringBoot后台管理的设计与实现
1、模型层的实现
2、业务层及控制层实现
三、前端的实现与成果可视化
1、新增数据的保存
2、首都的实际管理成果
3、全球首都信息
四、总结
前言
首都,一个国家的政治、文化和经济中心,是国家的心脏,也是其对外展示的窗口。它们不仅是国家权力的象征,更是全球交流与合作的重要平台。在这个全球化的时代,首都的作用愈发显著,它们不仅是国内政策的制定地,也是国际关系和全球治理的关键节点。首都,作为国家的象征,承载着国家的历史与文化。从北京的紫禁城到华盛顿的白宫,从巴黎的埃菲尔铁塔到莫斯科的克里姆林宫,每一座首都都有其独特的故事和魅力。它们不仅是历史的见证者,也是现代文明的创造者。首都的建筑风格、城市规划和文化活动,无一不反映出一个国家的精神面貌和发展理念。
在全球政治舞台上,首都扮演着至关重要的角色。它们是国家领导人会晤、国际会议举办的地方,是外交政策的发源地。在这里,各国领导人就全球性问题进行磋商,寻求合作与解决方案。首都的决策往往影响着世界的未来走向,从和平协议的签署到经济合作的达成,首都是这些重大事件的见证地。经济上,首都往往是国家的经济引擎。它们集中了国家的主要金融机构、企业总部和创新中心,是经济发展的驱动力。首都的经济活力不仅影响着本国的繁荣,也对全球经济产生深远影响。例如,纽约的华尔街、伦敦的金融城、东京的丸之内,这些地区不仅是本国经济的心脏,也是全球金融市场的重要组成部分。
文化上,首都是国家文化的汇聚地。博物馆、剧院、艺术画廊和学术机构在这里云集,它们保存和传播着国家的文化遗产,同时也是国际文化交流的平台。首都的文化活动和节日庆典,如北京的春节、里约热内卢的狂欢节、柏林的电影节,不仅丰富了市民的生活,也吸引了世界各地的游客和文化爱好者。然而,首都也面临着诸多挑战。随着城市化进程的加快,首都面临着交通拥堵、环境污染、住房紧张等问题。如何在保持经济增长的同时,实现可持续发展,是每个首都都需要面对的问题。在这个多元化和互联互通的世界中,首都的作用越来越重要。它们不仅是国家的心脏,也是连接世界的桥梁。通过研究全球首都,我们可以更好地理解国家之间的互动,以及它们在全球舞台上的角色和影响。
在全球一体化的今天,研究全球首都的时空分布以及空间位置,同时加上经济和人口的分析就显得非常有必要。博客主要讲解如何在SpringBoot和PostGIS的首都信息管理,首先讲解结合全球城市信息和全球国家信息进行空间数据库表的建模,然后讲解如何在SpringBoot中的业务逻辑管理设计与实现,最后给出当前的数据整理出来的全球首都信息成果列表。如果您对此比较有兴趣,不妨来这里看看。
一、首都空间表的设计
要想实现全球首都的信息管理,需要与之前我们介绍过的两类数据进行管理。第一个是全球国家的信息,第二个是全球的城市信息。一个国家有许多的城市,它与城市的关系是一对多的关系。因此,这里的首都信息,其实是关联我们的国家信息与城市信息,为了能支持迁都这种特殊的业务,因此我们就涉及出一个中间表,并且能标记出当前城市的使用标识,以此来标识当前城市是否作为首都在使用。本节就将重点介绍这三张表以及空间关系表的设计与实现。
1、三张空间表的结构
为了让第一次看到这篇博客的朋友不至于太突兀,这里还是打算把三张表的主要字段和联系给大家说明一下。首先第一张是国家信息表,作用是存储全球的国家基本信息以及国家的矢量范围。它的表结构如下:
它包括基本的中英文全称、简称等信息、所属大洲以及空间字段信息。
第二张表是全球的城市信息,这里采用的OSM分享的数据,数据总条数大约在7342,从全球的范围来说,基本包含了主要的城市,同时这张表的字段非常多,有人口的数据,不同语种的城市名称信息。
这张表的字段大约有130多列,当然,在实际的业务中,我们是可以根据一些业务的维度来进行拆分,比如可以将人口拆成多行,这样就可以极大的避免宽度的爆炸。当然,这是在数据库设计时究竟是采用高表还是宽表的设计方法。大家可以根据实际业务来进行抉择。
每个国家的首都,首先也是一个城市,因此,首都必然是全球这么多城市集合中的一个子集,所以我们可以建立一张关系表也就是中间表,如前文所提的,将国家id信息和城市id信息关联起来。以此来进行信息的串联。中间表的结构如下:
在这张中间关系表中,分别有两个字段用来关联国家信息和城市信息,还有一个开始日期和结束日期。主要的作用就是有一些国家在建设过程中曾经进行过迁都,因此我们将首都信息进行合理的管理,也为后续的分析和可视化打下良好的基础。
二、SpringBoot后台管理的设计与实现
在完成空间数据建模及物理表的设计与实现之后,就可以根据物理表来进行实际API接口的开发,这里采用MVC设计模式来进行实现。主要讲解如何使用SpingBoot来进行后台管理功能的设计与实现。
1、模型层的实现
模型层包含两个方面的内容,第一个是数据库操作实体,比如数据库物理表对应的实体对象。第二个是就是基于物理实体对象的Mapper对象,也是ORM的主要对象。物理表的对应实体代码如下:
package com.yelang.project.extend.earthquake.domain;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yelang.framework.web.domain.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@TableName(value ="biz_country_capital")
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class CountryCapital extends BaseEntity{
private static final long serialVersionUID = -5930058973652379187L;
@TableId(value = "pk_id")
private Long pkId;//主键
@TableField(value = "start_time")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date startTime;
@TableField(value = "end_time")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date endTime;
@TableField(value = "use_flag")
private Integer useFlag = 1;
@TableField(value = "country_id")
private Long countryId;
@TableField(value = "places_id")
private Long placesId;
@TableField(exist = false)
private String placesName;
}
再定义了物理表的实体类之后,我们来创建数据操作对象的实现,这里主要是实现自定义的城市信息的查询,这里基于Mybatis-plus来实现内置SQL的实现模式,关键代码如下:
package com.yelang.project.extend.earthquake.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yelang.project.extend.earthquake.domain.CountryCapital;
public interface CountryCapitalMapper extends BaseMapper<CountryCapital> {
static final String FIND_LISTBY_COUNTRYID_SQL="<script>"
+ "select t1.*,t2.name_zh placesName from biz_country_capital t1,biz_ne_10m_populated_places t2 "
+ "where t1.places_id = t2.pk_id and t1.country_id = #{countryId} "
+ "order by t1.start_time desc "
+ "</script>";
@Select(FIND_LISTBY_COUNTRYID_SQL)
List<CountryCapital> findListByCountryId(@Param("countryId")Long countryId);
}
以上就是模型层的设计与代码实现。
2、业务层及控制层实现
有了模型层之后,我们采用自底向上的方法进行建设。接下来进行业务层及控制层的实现,其中业务层是我们的核心,这是实际代码的核心部分。为了保证一个城市,最多只能属于一个国家的首都, 因此在进行城市管理和构建时,我们需要保证城市的唯一性。这里我们结合jquery-validate和remote模式来进行讲解。其它的业务层实现比较简单,仅包括数据的插入、修改、删除、查询等,这里还需要定义一个检查数据重复的方法。代码如下:
@Override
public String checkCapitalUnique(CountryCapital capital) {
Long countryId = StringUtils.isNull(capital.getCountryId()) ? -1L : capital.getCountryId();
QueryWrapper<CountryCapital> queryWrapper = new QueryWrapper<CountryCapital>();
queryWrapper.eq("places_id", capital.getPlacesId());
CountryCapital info = this.baseMapper.selectOne(queryWrapper);
if (StringUtils.isNotNull(info) && info.getCountryId().longValue() != countryId.longValue())
{
return CapitalConstants.CAPITAL_NOT_UNIQUE;
}
return CapitalConstants.CAPITAL_UNIQUE;
}
控制层作为接收前端提交的请求的地方,这里定义以下的接口列表用来处理用户的请求。
序号 | 方法名称 | 说明 |
1 | String capital(@PathVariable("countryId") Long countryId,ModelMap mmap) | 跳转管理界面 |
2 | TableDataInfo list(@PathVariable("countryId") Long countryId) | 查询首都数据 |
3 | String add(@PathVariable("countryId") Long countryId,ModelMap map) | 跳转新增界面 |
4 | AjaxResult addSave(CountryCapital capital,String startTimeStr,String endTimeStr) | 保存数据 |
5 | String checkCapitalUnique(CountryCapital capital) | 重复检查 |
6 | String edit(@PathVariable("id") Long id, ModelMap mmap) | 跳转编辑页面 |
7 | AjaxResult editSave(CountryCapital capital,String startTimeStr,String endTimeStr) | 保存编辑数据 |
8 | AjaxResult remove(String ids) | 删除信息 |
9 | String pplaces() | 跳转城市列表 |
10 | TableDataInfo list(Ne10mPopulatedPlaces places) | 查询城市信息 |
上面给出了控制接口的信息,对于详细的方法实现不进行赘述,代码比较简单,这里给出保存的一个数据处理细节,即将字符串转换成时间。下面分享一种处理办法,在方法中传入字符串,然后将字符串转为时间,具体代码如下:
if(StringUtils.isNotEmpty(startTimeStr)) {
capital.setStartTime(DateUtils.parseDate(startTimeStr, DateUtils.YYYY_MM_DD));
}
if(StringUtils.isNotEmpty(endTimeStr)) {
capital.setEndTime(DateUtils.parseDate(endTimeStr, DateUtils.YYYY_MM_DD));
}
当然为了保证数据的有效性,对于城市定都的开始和结束时间,是可以填写空值的。因此这里如果填入空值,对输入值就可以不进行处理。
三、前端的实现与成果可视化
在后台实现了API控制接口之后,接下来第三步就是实现处理的界面,毕竟前端界面需要进行业务的实现。这里的实现比较简单,在进行首都的管理时以新增或者编辑为例,我们再打开城市选择列表,勾选城市信息后,再将关系保存到后台,最终实现城市和国家的首都关系建立。
1、新增数据的保存
在我们的期望当中,我们需要打开一个全球城市的查询列表窗口,用户可以在这个列表窗口中进行城市信息查询,然后勾选后关闭窗口,同时根据选择的结果填充到隐藏的表单字段上,业务逻辑代码如下:
function selectPlaces() {
var treeId = $("#treeId").val();
var deptId = $.common.isEmpty(treeId) ? "100" : $("#treeId").val();
var url = prefix + "/pplaces";
var options = {
title: '选择城市',
width: parent.window.innerWidth * 0.8,//宽度*0.8
height: parent.window.innerHeight * 0.85,// 高度*0.8
url: url,
callBack: doSubmit
};
$.modal.openOptions(options);
}
function doSubmit(index, layero){
var body = $.modal.getChildFrame(index);
//获取弹出窗口的window对象,需要调用js方法
var doc = parent.window['layui-layer-iframe' + index].window;
//获取数据
var placesData = doc.getSelectedData();
if(placesData.length >=1){
$("#placesId").val(placesData[0].pkId);
$("#placesInfo").val(placesData[0].nameZh + "/" + placesData[0].nameEn);
}
$.modal.close(index);
}
编辑和新增的业务处理逻辑是差不多的,这里不再进行赘述。需要注意的是,在编辑过程中,需要对首都信息进行处置话,这里分享一些初始化的便捷代码。
<form class="form-horizontal m" id="form-capital-edit" th:object="${capital}">
<input name="id" th:field="*{pkId}" type="hidden">
<input type="hidden" th:value="${capital.countryId}" name="countryId" />
<div class="form-group">
<label class="col-sm-3 control-label">开始日期:</label>
<div class="col-sm-8">
<div class="input-group">
<input type="text" class="form-control" th:value="${#dates.format(capital.startTime, 'yyyy-MM-dd')}" name="startTimeStr" placeholder="yyyy-MM-dd" readonly="readonly">
<span class="input-group-btn">
<button type="button" class="btn btn-success"><i class="fa fa-calendar"></i>
</button>
</span>
</div>
</div>
</div>
2、首都的实际管理成果
在经过上述的开发之后,我们就可以进行首都信息的管理,这里我们将按照场景来分别展示首都的添加、删除、编辑等操作。
首先在这个界面中点击“首都”按钮,然后打开首都管理列表,以阿富汗为例,打开后可以看到以下的信息:
这说明我们已经配置好了一条城市信息,如果想要增加城市或者编辑,都是可以进行信息的变更的。
选择好目标城市后,点击确认,然后在外面的窗口中点击确定按钮实现城市的管理
3、全球首都信息
下面分享个人管理查询得到的全球首都信息,将信息都维护好之后。我们就可以使用SQL语句来查询首都信息。查询的SQL语句如下所示:
SELECT
tc.full_chinese_name,
tc.full_english_name,
tp.name_zh,
tp.name_en
FROM
biz_ne_10m_populated_places tp,
biz_world_country tc,
biz_country_capital tcc
WHERE
tp.pk_id = tcc.places_id
AND tc.pk_id = tcc.country_id
AND tcc.use_flag = 1;
在数据库客户端软件中可以查询到以下结果:
到此说明我们的城市信息已经全部配置完,将完整的信息分享给大家,如果有问题请及时联系。
full_chinese_name full_english_name name_zh name_en
葡萄牙 Portugal 里斯本 Lisbon
拉脱维亚 Latvia 里加 Riga
阿富汗 Afghanistan 喀布尔 Kabul
日本 Japan 东京 Tokyo
叙利亚 Syria 大马士革 Damascus
中华人民共和国 China 北京 Beijing
加拿大 Canada 渥太华 Ottawa
蒙古 Mongolia 乌兰巴托 Ulaanbaatar
朝鲜民主主义人民共和国 Democratic People's Republic of Korea 平壤 Pyongyang
大韩民国 Republic of Korea 首尔 Seoul
越南 Vietnam 河内 Hanoi
老挝人民民主共和国 The Lao People’s Democratic Republic 万象 Vientiane
柬埔寨 Cambodia 金边 Phnom Penh
泰国 Thailand 曼谷 Bangkok
马来西亚 Malaysia 吉隆坡 Kuala Lumpur
新加坡 Singapore 新加坡 Singapore
文莱 Baker Island 斯里巴加湾 Bandar Seri Begawan
菲律宾 Philippines 马尼拉 Manila
吉尔吉斯斯坦 Kyrgyzstan 比什凯克 Bishkek
乌兹别克斯坦 Uzbekistan 塔什干 Tashkent
塔吉克斯坦 Tajikistan 杜尚别 Dushanbe
土库曼斯坦 Turkmenistan 阿什哈巴德 Ashgabat
不丹 Bhutan 延布 Yanbu governorate
印度 India 新德里 New Delhi
孟加拉国 Bangladesh 达卡 Dhaka
斯里兰卡 Sri Lanka 科伦坡 Colombo
马尔代夫 Maldives 马累 Malé
伊朗伊斯兰共和国 Iran 德黑兰 Tehran
伊拉克 Iraq 巴格达 Baghdad
科威特 Kuwait 科威特城 Kuwait City
巴林 Bahrain 麦纳麦 Manama
卡塔尔 Qatar 多哈 Doha
沙特阿拉伯 Saudi Arabia 利雅德 Riyadh
阿曼 Oman 马斯喀特 Muscat
也门 Yemen 萨那 Sanaa
约旦 Jordan 安曼 Amman
以色列 Israel 特拉维夫 Tel Aviv
黎巴嫩 Lebanon 贝鲁特 Beirut
土耳其 Turkey 安卡拉 Ankara
塞浦路斯 Cyprus 尼科西亚 Nicosia
阿塞拜疆 Azerbaijan 巴库 Baku
格鲁吉亚 Georgia 第比利斯 Tbilisi
亚美尼亚 Armenia 埃里温 Yerevan
英国 United Kingdom 伦敦 London
意大利 Italy 罗马 Rome
法国 France 巴黎 Paris
西班牙 Spain 马德里 Madrid
瑞士 Switzerland 伯尔尼 Bern
俄罗斯联邦 Russia 莫斯科 Moscow
瑞典 Sweden 斯德哥尔摩 Stockholm
比利时 Belgium 布鲁塞尔 Brussels
丹麦 Denmark 哥本哈根 Copenhagen
保加利亚 Bulgaria 索非亚 Sofia
白俄罗斯 Belarus 明斯克 Minsk
奥地利共和国 The Republic of Austria 维也纳 Vienna
捷克 Czech Republic 布拉格 Prague
波兰 Poland 华沙 Warsaw
波黑 Bosnia and Herzegovina 萨拉热窝 Sarajevo
安道尔公国 The Principality of Andorra 安道尔城 Andorra la Vella
爱沙尼亚共和国 Republic of Estonia 塔林 Tallinn
爱尔兰 Ireland 都柏林 Dublin
梵蒂冈 Vatican City 梵蒂冈 Vatican City
芬兰 Finland 赫尔辛基 Helsinki
荷兰 Netherlands 阿姆斯特丹 Amsterdam
冰岛 Iceland 雷克雅未克 Reykjavík
摩尔多瓦 Moldova 基希讷乌 Chișinău
匈牙利 Hungary 布达佩斯 Budapest
希腊 Greece 雅典 Athens
乌克兰 Ukraine 基辅 Kyiv
斯洛文尼亚 Slovenia 卢布尔雅那 Ljubljana
斯洛伐克 Slovakia 布拉迪斯拉发 Bratislava
圣马力诺 San Marino 圣马力诺 San Marino
摩纳哥 Monaco 摩纳哥 Monaco
克罗地亚 Croatia 萨格勒布 Zagreb
马耳他 Malta 瓦莱塔 Valletta
卢森堡 Luxembourg 卢森堡 Luxembourg
直布罗陀 Gibraltar 直布罗陀 Gibraltar
立陶宛 Lithuania 维尔纽斯 Vilnius
阿尔巴尼亚共和国 The Republic of Albania 地拉那 Tirana
挪威 Norway 奥斯陆 Oslo
埃及 Egypt 开罗 Cairo
苏丹 Sudan 喀土穆 Khartoum
埃塞俄比亚 Ethiopia 亚的斯亚贝巴 Addis Ababa
厄立特里亚 Eritrea 阿斯马拉 Asmara
索马里 Somalia 摩加迪休 Mogadishu
利比亚 Libya 的黎波里 Tripoli
阿尔及利亚 Algeria 阿尔及尔 Algiers
突尼斯 Tunisia 突尼斯 Tunis
摩洛哥 Morocco 拉巴特 Rabat
佛得角 Cape Verde 普拉亚 Praya
毛里塔尼亚 Mauritania 努瓦克肖特 Nouakchott
马里 Mali 巴马科 Bamako
塞内加尔 Senegal 达喀尔 Dakar
几内亚比绍 Guinea-Bissau 比绍 Bissau
几内亚 Guinea 科纳克里 Conakry
塞拉利昂 Sierra Leone 弗里敦 Freetown
利比里亚 Liberia 蒙罗维亚 Monrovia
布基纳法索 Burkina Faso 瓦加杜古 Ouagadougou
尼日尔 Niger 尼亚美 Niamey
乍得 Chad 恩贾梅纳 N'Djamena
尼日利亚 Nigeria 阿布贾 Abuja
科特迪瓦 Côte d'Ivoire 亚穆苏克罗 Yamoussoukro
加纳 Ghana 阿克拉 Accra
多哥 Togo 洛美 Lomé
贝宁 Benin 波多诺伏 Porto-Novo
喀麦隆 Cameroon 雅温得 Yaoundé
加蓬 Gabon 利伯维尔 Libreville
赤道几内亚 Equatorial Guinea 马拉博 Malabo
圣多美和普林西比 Sao Tome and Principe 圣多美 São Tomé
中非 Central African Republic 班吉 Bangui
刚果(布) Congo 布拉柴维尔 Brazzaville
刚果(金) Congo (Democratic Republic of the) 金沙萨 Kinshasa
乌干达 Uganda 坎帕拉 Kampala
卢旺达 Rwanda 吉佳利 Kigali
布隆迪 Burundi 布琼布拉 Bujumbura
坦桑尼亚 Tanzania 多多马 Dodoma
肯尼亚 Kenya 内罗毕 Nairobi
安哥拉 Angola 罗安达 Luanda
赞比亚 Zambia 卢萨卡 Lusaka
马拉维 Malawi 利隆圭 Lilongwe
莫桑比克 Mozambique 马普托 Maputo
马达加斯加 Madagascar 塔那那利佛 Antananarivo
科摩罗 Comoros 莫洛尼 Moroni
塞舌尔 Seychelles 維多利亞 Victoria
毛里求斯 Mauritius 路易港 Port Louis
津巴布韦 Zimbabwe 哈拉雷 Harare
博茨瓦纳 Botswana 嘉柏隆里 Gaborone
澳大利亚 Australia 堪培拉 Canberra
巴布亚新几内亚 Papua New Guinea 莫尔兹比港 Port Moresby
所罗门群岛 Solomon Islands 霍尼亚拉 Honiara
瓦努阿图 Palestina 维拉港 Port Vila
新西兰 New Zealand 惠灵顿 Wellington
斐济 Fiji 苏瓦 Suva
汤加 Tonga 努库阿洛法 Nuku'alofa
基里巴斯 Kiribati 南塔拉瓦 South Tarawa
图瓦卢 Tuvalu 富纳富提 Funafuti
萨摩亚 Samoa 阿皮亚 Apia
密克罗尼西亚联邦 Federated States of Micronesia 帕利基尔 Palikir
马绍尔群岛 Marshall Islands 马朱罗 Majuro
美利坚合众国 The United States of America 华盛顿哥伦比亚特区 Washington
墨西哥合众国 The United Mexican States 墨西哥城 Mexico City
危地马拉共和国 The Republic of Guatemala 瓜地馬拉 Guatemala City
伯利兹 Belize 贝尔墨邦 Belmopan
尼加拉瓜共和国 The Republic of Nicaragua 馬拿瓜 Managua
古巴共和国 The Republic of Cuba 哈瓦那 Havana
巴哈马国 The Commonwealth of The Bahamas 拿骚 Nassau
海地共和国 The Republic of Haiti 太子港 Port-au-Prince
帕劳 Palau 梅莱凯奥克 Melekeok
纳米比亚 Namibia 温得和克 Windhoek
莱索托 Lesotho 马塞卢 Maseru
南非 South Africa 比勒陀利亚 Pretoria
洪都拉斯共和国 The Republic of Honduras 特古西加尔巴 Tegucigalpa
哥斯达黎加共和国 The Republic of Costa Rica 圣何塞 San Jose
巴拿马共和国 The Republic of Panama 巴拿马城 Panama City
多米尼加共和国 The Dominican Republic 圣多明哥 Santo Domingo
牙买加 Jamaica 金斯敦 Kingstown
圣基茨和尼维斯联邦 The Federation of Saint Kitts and Nevis 巴斯特尔 Basse-Terre
安提瓜和巴布达 Antigua and Barbuda 圣约翰 Saint John's
多米尼克国 The Commonwealth of Dominica 罗索 Roseau
圣卢西亚 Saint Lucia 卡斯特里 Castries
格林纳达 Grenada 圣乔治 St. George's
巴巴多斯 Barbados 布里奇顿 Bridgetown
特立尼达和多巴哥共和国 The Republic of Trinidad and Tobago 西班牙港 Port of Spain
哥伦比亚 Colombia 波哥大 Bogotá
厄瓜多尔 Ecuador 基多 Quito
委内瑞拉 Venezuela 加拉加斯 Caracas
圭亚那 Guyana 乔治敦 Georgetown
苏里南 Suriname 帕拉马里博 Paramaribo
秘鲁 Peru 利马 Lima
玻利维亚 Bolivia 苏克雷 Sucre
巴拉圭 Paraguay 亚松森 Asunción
阿根廷 Argentina 布宜诺斯艾利斯 Buenos Aires
乌拉圭 Uruguay 蒙得维的亚 Montevideo
智利 Chile 圣地亚哥 Santiago
巴基斯坦 Pakistan 伊斯兰堡 Islamabad
巴西 Brazil 巴西利亚 Brasília
德国 Germany 柏林 Berlin
缅甸联邦共和国 The Republic of the Union of Myanmar 奈比多 Naypyidaw
四、总结
以上就是本文的主要内容,博客主要讲解如何在SpringBoot和PostGIS的首都信息管理,首先讲解结合全球城市信息和全球国家信息进行空间数据库表的建模,然后讲解如何在SpringBoot中的业务逻辑管理设计与实现,最后给出当前的数据整理出来的全球首都信息成果列表。行文仓促,定有许多的不足之处,如有不足,在此还恳请各位专家朋友在评论区不吝之处,不胜感激。