目录

前言

一、业务需求介绍

1、功能思维导图

二、业务系统后台实现

1、Model层实现

 2、业务层的实现

3、控制层的实现

三、前端管理业务的实现

1、全球城市列表的实现

 2、详情页面实现

3、实际城市定位 

四、总结


前言

        在全球化和信息化时代背景下,城市作为经济发展和人口聚集的核心区域,其管理效率和服务质量直接关系到城市竞争力和居民福祉。随着城市化进程的不断推进,城市信息管理面临着前所未有的挑战,包括数据量的激增、数据类型的多样化以及对实时性和准确性的高要求。因此,构建一个高效、可靠的全球城市信息管理系统,对于提升城市业务管理水平至关重要。

        在这些业务管理场景下,城市信息管理系统不仅要处理大量的静态数据,如地理信息、人口统计、基础设施等,还要实时处理动态数据,如交通流量、环境监测、公共安全等。这些数据的整合和分析对于城市政策制定、资源配置、应急响应等方面具有重要意义。然而,传统的信息管理系统往往难以满足这些需求,存在数据孤岛、处理效率低、空间分析能力弱等问题。

基于SpringBoot和PostGIS的全球城市信息管理实践_字段

        基于此,本文提出了一种基于SpringBoot和PostGIS的全球城市信息管理系统解决方案。SpringBoot以其轻量级、快速开发的特点,成为构建企业级应用的首选框架。而PostGIS作为PostgreSQL数据库的地理信息系统(GIS)扩展,提供了强大的空间数据存储和分析能力。结合两者,可以构建一个功能强大、易于扩展的全球城市信息管理系统,以支持复杂的业务管理需求。不仅可以满足常规管理系统的需要,而且加强了城市的空间分析功能。在规划、居住宜居、教育方面提供了空间分析的能力。

        本文首先介绍了全球城市信息管理的业务需求和挑战。接着,本文将展示系统的设计,包括数据模型、功能模块和用户界面设计。在功能实现部分,本文将重点介绍系统的关键技术点,如空间数据的存储、查询和分析等。最后,本文将通过实际案例,展示该系统在城市业务管理中的应用效果和实践价值。

一、业务需求介绍

        本节将对全球城市信息管理的业务需求进行统一的梳理。全球人口绝大多数都居住在城市当中,因此城市对于承载力和未来的发展也是非常重要的。比如研究不同的国家城市分布,历年的人口增长情况,地域冲突中会直接面对的城市信息。等等都会有极大的研究价值。这里重点描述业务管理需要。

1、功能思维导图

        这里我们采用思维导图的方式对全球城市信息管理的业务功能进行梳理。这里主要提供全球的城市信息列表的查询和详细信息的浏览。对于城市信息而言,我们使用已经采集好的数据,因而对数据不需要进行修改。

基于SpringBoot和PostGIS的全球城市信息管理实践_字段_02

         该功能的功能点如下:

        1、系统支持按照城市中文名和英文名进行数据的检索。查询结果以列表的形式展示,展示的字段包括但不限于英文名称、中文名称、特征类别、国家名称、最大人口数、时区信息、德语名称、阿拉伯语名称、孟加拉语、日语、繁体中文等信息。列表支持切换表格展现形式,支持自定义展示字段等。

        2、系统支持城市详情信息的展示。展示的信息包括但不限于列表中的表格信息,同时包含更丰富的详情信息,比如不同语言的城市名称、人口信息以及未来的城市人口预测信息。在城市详情页面还应该包含当前城市的位置定位展示。在影像底图上直接进行地图的标注及展示。

二、业务系统后台实现

        在明确了上述的系统业务需求之后,下面进行业务系统的后台实现。这里以Java编程语言为例。使用SpringBoot框架来进行后端业务的开发与实现。开发模式采用MVC三层设计模式。因此这里将分别介绍这几层的业务实现。

1、Model层实现

        全球城市信息的Model层比较简单,就是对应之前我们介绍过的城市信息。虽然字段有点多,但是我们可以对这些字段进行规整。将一些重点的属性进行去重后,可以发现,它的属性其实也不是很多。整理起来大致包含以下的这些:

基于SpringBoot和PostGIS的全球城市信息管理实践_spring_03

        由于其属性实体的字段信息确实较多,因此这里不进行赘述,如果大家需要进行代码参考,可以自评论区留言或者发私信,可以交流实体类的相关编码。这里截图部分代码片段,仅供参考。

基于SpringBoot和PostGIS的全球城市信息管理实践_spring_04

        以上便是model层最主要的实体类的示例代码。有了业务实体之后,我们来定义数据查询的接口,也就是Mapper对象,类比与JDBC中的dao层。由于暂时没有复杂的逻辑,这里仅包含了空的实现。

package com.yelang.project.extend.earthquake.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yelang.project.extend.earthquake.domain.Ne10mPopulatedPlaces;
public interface Ne10mPopulatedPlacesMapper extends BaseMapper<Ne10mPopulatedPlaces>{
}

 2、业务层的实现

        与以往的业务层的简单化相比,这里我们需要实现复杂的接口查询服务。因此有必要介绍一下全球城市的查询接口服务。通过前面的需求梳理可知,我们的查询需要支持按照中文名称和英文名称来查询。当然,在实际工作过程中,我们可以按照实际的业务需要来添加其它的业务字段都是可以的。一切按照我们的用户需求来实现。这里给出业务层的查询检索代码实现:

package com.yelang.project.extend.earthquake.service.impl;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yelang.project.extend.earthquake.domain.Ne10mPopulatedPlaces;
import com.yelang.project.extend.earthquake.mapper.Ne10mPopulatedPlacesMapper;
import com.yelang.project.extend.earthquake.service.INe10mPopulatedPlacesService;
@Service
public class Ne10mPopulatedPlacesImpl extends ServiceImpl<Ne10mPopulatedPlacesMapper,Ne10mPopulatedPlaces> implements INe10mPopulatedPlacesService{
	@Override
	public List<Ne10mPopulatedPlaces> getList(Ne10mPopulatedPlaces places) {
		QueryWrapper<Ne10mPopulatedPlaces> queryWrapper = new QueryWrapper<Ne10mPopulatedPlaces>();
		if (StringUtils.isNotBlank(places.getNameEn())) {
			queryWrapper.like("name_en", places.getNameEn());
		}
		if (StringUtils.isNotBlank(places.getNameZh())) {
			queryWrapper.like("name_zh", places.getNameZh());
		}
		queryWrapper.orderByDesc("name");
		return this.baseMapper.selectList(queryWrapper);
	}
}

        当然,这里为了实现容易,在进行数据查询时,我们在不引入新的技术栈的时候,直接利用数据库的模糊查询功能。如果在量大的情况下,还是请大家慎用这种开发模式,可以引入es这种搜索引擎来满足业务的需求。

3、控制层的实现

        介绍了模型层和业务层的实现,最后就是将数据查询的接口暴露出去,要求以API接口的形式给出。因此这里我们来讲讲如何进行控制层的实现。控制层中设计了三个方法,如下表所示:

序号

方法名

方法说明

1

index()

跳转展示页面

2

list(Ne10mPopulatedPlaces places)

查询城市信息列表

3

detail(@PathVariable("pkId")Long pkId,ModelMap mmap)

查询详情

关键代码如下:

package com.yelang.project.extend.earthquake.controller;
import java.util.List;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.yelang.framework.web.controller.BaseController;
import com.yelang.framework.web.page.TableDataInfo;
import com.yelang.project.extend.earthquake.domain.Ne10mPopulatedPlaces;
import com.yelang.project.extend.earthquake.service.INe10mPopulatedPlacesService;
@Controller
@RequestMapping("/eq/pplaces")
public class PopulatedPlacesController extends BaseController{
	private String prefix = "ceicearthquake/pplaces";
    @Autowired
    private INe10mPopulatedPlacesService placeservice;
    @RequiresPermissions("eq:pplaces:view")
    @GetMapping()
    public String index(){
        return prefix + "/index";
    }
    @RequiresPermissions("eq:pplaces:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(Ne10mPopulatedPlaces places){
        startPage();
        List<Ne10mPopulatedPlaces> list = placeservice.getList(places);
        return getDataTable(list);
    }
    @RequiresPermissions("eq:pplaces:detail")
    @GetMapping("/detail/{pkId}")
    public String detail(@PathVariable("pkId")Long pkId,ModelMap mmap){
    	mmap.put("pkId", pkId);
    	Ne10mPopulatedPlaces places = placeservice.getById(pkId);
    	mmap.put("places", places);
        return prefix + "/detail";
    }
}

         在完成后台接口的实现之后,我们就可以进行前端界面的开发来满足业务的需要。

三、前端管理业务的实现

        本节重点介绍如何在传统技术框架中实现全球城市信息的管理。主要包含两个界面的开发,第一个是管理列表的开发,第二个是城市信息详情的展示。其中第二个界面是开发的重点和难点。这里我们采用的技术栈是Thymeleaf,并不是现在的前后端分离的架构,在一些场景下,也是完全满足我们的业务需求的。因此本节的描述也分为两个部分来阐述。

1、全球城市列表的实现

        全球城市列表的需求在第一章中有一定的介绍,这里采用Layui的table组件来进行实现。Layui的组件非常好用,API的文档也非常全,大家如果有什么不懂的地方,可以到他的官方网站上去查询相关电子档资料。这里给出table的展示代码:

$(function() {
     var options = {
                url: prefix + "/list",
                createUrl: prefix + "/add",
                updateUrl: prefix + "/edit/{id}",
                removeUrl: prefix + "/remove",
                exportUrl: prefix + "/export",
                modalName: "应急联系信息",
                columns: [{
                    checkbox: true
                },
                {
                    field: 'pkId',
                    title: '',
                    visible: false
                },
                {
                    field: 'nameEn',
                    title: '英文名称'
                },
                {
                    field: 'nameZh',
                    title: '中文名称'
                },
                {
                    field: 'featurecla',
                    title: '特征类别'
                },
                {
                    field: 'sov0name',
                    title: '国家名称'
                },
                {
                    field: 'popMax',
                    title: '最大人口数'
                },
                {
                    field: 'timezone',
                    title: '时区'
                },
                {
                    field: 'nameDe',
                    title: '德语名称'
                },
                {
                    field: 'nameAr',
                    title: '阿拉伯语名称'
                },
                {
                    field: 'nameBn',
                    title: '孟加拉语名称'
                },
                {
                    field: 'nameJa',
                    title: '日语名称'
                },
                {
                    field: 'nameZht',
                    title: '中文繁体'
                },
                {
                    title: '操作',
                    align: 'center',
                    formatter: function(value, row, index) {
                        var actions = [];
                        actions.push('<a class="btn btn-success btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="details(\'' + row.pkId + '\',\''+row.nameZh+'\')"><i class="fa fa-eye"></i>详情</a> ');
                        return actions.join('');
                    }
                }]
            };
            $.table.init(options);
        });

        经过这样的开发,全球城市信息就可以在页面中进行展示。来看一下实际的效果:

基于SpringBoot和PostGIS的全球城市信息管理实践_业务需求_05

        可以在界面中看到,城市信息已经成功的加载,并且可以在页面中实现按照中文名称和英文名称的模糊查询,同时可以点击查看当前城市的详情。

 2、详情页面实现

        为了展示当前点的空间位置以及其详细信息,我们需要开发一个详情界面,方便管理员和重点用户来进行数据的查询。详情信息包括两个部分,第一是固化的信息,另外一个是空间位置信息。跳转到详情的javascript函数如下:

function details(pkId,nameZh){
        	parent.layer.open({
			    type: 2,
			    title: ["【"+nameZh + "】",'font-size:16px;text-align:center;font-weight: bold;'],
			    scrollbar:false,
			    area: ['88%', '95%'],
			    content: prefix + "/detail/" + pkId ,
			    btn:[],
			    yes:function(index,layero){},
			    cancel: function(index, layero){ 
		    	  parent.layer.close(index);
		    	  return false; 
		    	} 
		  	}); 
        }

        然后我们来看一下在详情页面中如何进行实现。我们将页面分量左右两个部分,左边进行空间地图展示,右边将展示当前城市的经纬度地图信息,将坐标点标注到界面中。代码太多,没有办法全部列上来,这里截图截取部分,供大家参考。

基于SpringBoot和PostGIS的全球城市信息管理实践_spring_06

        完成了城市详情页的开发后,我们来看一下整体的效果如何。打开详情页会是什么样子?来看一下真实的效果:

基于SpringBoot和PostGIS的全球城市信息管理实践_java全球城市管理_07

3、实际城市定位 

        到此其实已经实现了城市信息的可视化,下面我们选取几个有代表性的城市来进行详情查看。

基于SpringBoot和PostGIS的全球城市信息管理实践_spring_08

纽约城市信息详情

基于SpringBoot和PostGIS的全球城市信息管理实践_全球城市可视化_09

 东京城市信息详情

基于SpringBoot和PostGIS的全球城市信息管理实践_java全球城市管理_10

柏林城市信息详情

四、总结

        以上就是本文的主要内容,本文首先介绍了全球城市信息管理的业务需求和挑战。接着,本文将展示系统的设计,包括数据模型、功能模块和用户界面设计。行文仓促,难免有许多不足之处,如有不足,在此还恳请各位专家、博主不吝赐教,万分感谢。