基于SpringBoot和leaflet-timeline-slider的历史叙事GIS展示-以哪吒2的海外国家上映安排为例

目录

前言

一、哪吒2的海外之路

1、海外征战历程

2、上映国家空间查询

二、后端接口的实现

1、模型层的实现

2、上映时间与国家

3、控制层的实现

三、基于leaflet-timeline-slider的前端实现

1、时间轴控件的引入及定义

2、时间轴绑定事件

3、成果展示

 四、总结


前言

        在当今数字化时代,地理信息系统(GIS)技术与多种新兴技术的融合为信息展示带来了全新的视角和体验。本文将探讨如何基于 SpringBoot 框架和 leaflet-timeline-slider 插件,构建一个以电影《哪吒2》海外国家上映安排为例的历史叙事 GIS 展示系统。《哪吒2》作为一部极具影响力和票房号召力的中国动画电影,其海外上映安排备受关注。该片于 2025 年 2 月 13 日在澳大利亚、新西兰、斐济、巴布亚新几内亚正式上映,2 月 14 日在美国、加拿大正式上映。此后,其海外上映版图持续扩大,3 月 14 日英国、爱尔兰开启点映,3 月 21 日在法国、德国、西班牙、意大利等欧洲 37 个国家及地区的 200 多家电影院上映。此外,该片还将在新加坡、马来西亚、埃及、南非、巴基斯坦、日本、韩国等多个国家和地区上映。这一系列的海外上映安排不仅是电影发行策略的体现,更是中国文化在全球传播的重要事件。

        在技术层面,SpringBoot 作为一个开源 Java 基于 Spring 框架的快速开发平台,能够帮助开发者快速搭建稳定、高效的后端服务,为 GIS 展示系统提供强大的数据支持和业务逻辑处理能力。而 leaflet-timeline-slider 插件则为前端地图展示提供了时间轴滑块功能,使得用户可以通过滑动时间轴,直观地查看不同时间段内《哪吒2》在各个海外国家的上映情况,从而实现历史叙事与地理信息的有机结合。通过构建这样一个系统,我们不仅可以清晰地呈现《哪吒2》海外上映的时空分布,还能深入挖掘其背后的文化传播、市场策略以及观众反馈等多维度信息。这不仅有助于电影行业的从业者更好地了解国际市场动态,也为文化研究者提供了丰富的案例分析素材。同时,这种基于 GIS 的历史叙事展示方式也为其他领域的时空数据可视化提供了借鉴和思路,具有重要的研究和应用价值。

一、哪吒2的海外之路

        本节将重点介绍《哪吒2之魔童闹海》这部电影的海外之路。除了在中国本土获得的巨大成功,这部电影的海外版本也是获得了很多人的认可。在进行应用程序的开发之前,首先我们来一起回顾一下这部电影的海外之路,也一起看看它的海外征战日常。

1、海外征战历程

        下面我们从互联网上查找一下关于哪吒2这部电影的海外征战历程。根据互联网的信息,我们将查找的信息整理成以下的表格,包括电影的上映时间、上映形式(比如IMAX超前点映和正式上映或者点映)、上映国家等。

上映时间国家/地区
2025年2月10日澳大利亚、新西兰(超前点映)
2025年2月12日北美(IMAX超前点映)
2025年2月13日澳大利亚、新西兰、斐济、巴布亚新几内亚(正式上映)
2025年2月14日美国、加拿大(正式上映)
2025年3月14日英国、爱尔兰(点映)
2025年3月21日英国、爱尔兰(正式上映)
2025年3月21日法国、德国、西班牙、意大利等欧洲国家
2025年4月4日日本
2025年4月23日比利时、荷兰
2025年4月23日德国
2025年4月23日奥地利
2025年4月23日新加坡
2025年4月23日马来西亚
2025年4月23日埃及
2025年4月23日南非
2025年4月23日巴基斯坦

        票房信息

  • 北美票房:1880万美元。

  • 全球票房:截至2025年3月11日,全球票房突破20.55亿美元。

        回首哪吒2取得的这些骄人战绩,确实为吒儿感到开心。期待后续有更大的突破,给观众朋友带来更好的电影作品。

2、上映国家空间查询

        为了方便将上映的国家信息在WebGIS中进行展示,需要我们将关联全球国家信息表从而可以查询到具体的国家信息。同时为了准确的对国家位置进行标注,我们选择国家首都来进行标注(不采用面的中心点的原因是因为有的国家是海岛国家,如果采用中心点标注,极可能出现标记位置在海上的情况)。因此要实现上映国家的空间查询,我们需要关联三张表,如下表所示:

序号表名说明
1biz_ne_10m_populated_places全球城市信息表
2biz_country_capital全球国家首都信息表
3biz_world_country全球国家信息表

        为了实现根据国家名称查询国家信息以及所属国家的首都信息(这里以 '澳大利亚', '德国', '法国', '巴基斯坦' 这四个国家为例),实现的SQL脚本如下所示:

SELECT P.NAME,P.name_zh nameZh,P.latitude lat,P.longitude lon,P.max_perkm maxPerkm,wc.full_chinese_name fullChineseName,wc.short_english_name shortEnglishName,st_asgeojson ( wc.geom ) geomJson 
FROMbiz_ne_10m_populated_places P,biz_country_capital ca,biz_world_country wc 
WHEREca.country_id = wc.pk_id AND ca.places_id = P.pk_id and ca.use_flag = 1AND wc.short_chinese_name IN ( '澳大利亚', '德国', '法国', '巴基斯坦' );

        在客户端工具中执行以上的SQL语句后,得到的结果如下所示:

         以上就是简单的介绍哪吒2这部电影的海外征战道路以及如何根据国家中文简称来查询所属国家及其首都信息。有了这个基础之后,就可以进行WebGIS相关的可视化成果展示的开发。

二、后端接口的实现

        本节将重点介绍后端如何来实现哪吒2的海外征战的相关查询接口。首先介绍Mapper数据操作层的实现,其次介绍如何来实现时间与国家的信息绑定,最后介绍控制层的具体实现。

1、模型层的实现

作为与海外征战最直接相关的对象,模型层及其所属对象是最核心的对象。需要承载着按照国家中文简称来查询其对应的国家及首都信息。Mapper接口层的定义如下所示:

final static String FIND_COUNTRY = "<script>"+ " select p.name,p.name_zh nameZh,p.latitude lat ,p.longitude lon,p.max_perkm maxPerkm " + " ,wc.full_chinese_name fullChineseName,wc.short_english_name shortEnglishName,st_asgeojson(wc.geom) geomJson "+ " from biz_ne_10m_populated_places p,biz_country_capital ca,biz_world_country wc "+ " where ca.country_id = wc.pk_id and ca.places_id = p.pk_id and ca.use_flag = 1"+ " and wc.short_chinese_name in "+ " <foreach item='id' collection='short_chinese_names' open='(' separator=',' close=')'>" +  " #{id} "+ "</foreach>" + "</script>";
/**
* - 根据国家中文简称查询国家信息列表
* @return
*/
@Select(FIND_COUNTRY)
List<CountryCapitalVO> findCountryList(@Param("short_chinese_names") List<String> short_chinese_names);

        用来接收数据库的查询结果集的视图对象如下:

package com.yelang.project.extend.earthquake.domain;
import java.io.Serializable;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CountryCapitalVO implements Serializable{private static final long serialVersionUID = 6127335396885639845L;private String name;private String nameZh;private String lat;private String lon;private BigDecimal maxPerkm = new BigDecimal(0);private String fullChineseName;private String shortEnglishName;private String geomJson;
}

         以上是数据查询的核心之所在,实现了与数据库查询结果的映射。同时在前端进行数据展示时,以上的属性也是至关重要,请务必掌握。

2、上映时间与国家

        在进行时空数据分析时,上映时间与国家是一个非常重要的映射关系。我们需要根据上一节整理的表格来将时间和空间即上映时间与上映国家的映射关系对应好。为了演示方便,这里就不将相关数据存储到数据库中进行存储,而是采用临时的内存管理方式,在后台进行查询时,使用HashMap的方式来进行查找,这种查找方式是O(1)的复杂度,查找很快速。定义时间和空间的映射Map的实例代码如下:

private Map<String,String> getAbroadMap(){Map<String,String> result = new HashMap<String, String>();result.put("250210", "澳大利亚、新西兰");result.put("250212", "美国");result.put("250213", "澳大利亚、新西兰、斐济、巴布亚新几内亚");result.put("250214", "美国、加拿大");result.put("250314", "英国、爱尔兰");result.put("250321", "英国、爱尔兰");result.put("250404","日本");result.put("250423", "比利时、荷兰、德国、奥地利、新加坡、马来西亚、埃及、南非、巴基斯坦");return result;
}

        以上方法定义好之后,将在后续的控制层来进行调用。 

3、控制层的实现

        作为与前端交互的最重要组件,控制层承担着将时间转为为查询参数,调用业务层和数据库访问层来实现空间数据的展示的作用。控制层的方法核心代码如下:

@RequiresPermissions("cl:boxoffice:abroadmap")
@GetMapping("/abroadmap")
public String abroadmap(){return prefix + "/abroadmap";
}@RequiresPermissions("cl:boxoffice:abroadlist")
@GetMapping("/abroadlist")
@ResponseBody
public AjaxResult abroadlist(String dayValue){String queryDay = StringUtils.isNotEmpty(dayValue) ? dayValue : "250210";String abroadCountry = getAbroadMap().get(queryDay);List<String> countriesParams = Arrays.asList(abroadCountry.split("、"));List<CountryCapitalVO> countries = wCountryService.findCountryList(countriesParams);return AjaxResult.success().put("data", countries);
}

        为了简化业务层的实现,这里我们直接调用前面提到过的上映国家与时间的映射关系。

三、基于leaflet-timeline-slider的前端实现

        最后一步我们来重点介绍一下如何基于leaflet-timeline-slider来进行WebGIS的可视化实现。通过本节,将使用前后端的集成,可以实现基于时间轴的点击,同时切换展示哪吒2的不同时间对应的上映国家信息。

1、时间轴控件的引入及定义

        首先我们需要在页面中引入时间轴控件以及定义时间轴对象。引入leaflet-timeline-slider的代码如下:

<!-- leaflet-timeline-slider.js add by yelangking-->
<script th:src="@{/js/plugins/timeline/leaflet-timeline-slider.js}"></script>

        然后在Javascript中来定义组件,定义对象的核心代码如下:

$(document).ready(function () {//初始化时间轴的控制单元L.control.timelineSlider({timelineItems: ["250210", "250212", "250213", "250214", "250314", "250321","250404","250423"], changeMap: getDataAddMarkers,extraChangeMapParams: {exclamation: "exclamation"} }).addTo(mymap); 
});

2、时间轴绑定事件

        要想实现在时间轴上点击不同的日期可以切换不同的国家,这里就需要进行点击事件的绑定操作。在上一个小节中已经有了简单的介绍,更详细的是如何进行事件的响应,这里给出详细的代码:

getDataAddMarkers = function( {label, value, map, exclamation} ) {$("#day").html(label);showBoxOffice(label);
};

        这里主要注意的是,在函数中传递的label字段,其值就是:20250314这样的字符串。然后将label字符串传入到国家信息查询接口中,调用控制层中的API接口来实现,详细的方法如下:

  function showBoxOffice(dayInfo){$.ajax({  type:"get",  url:prefix + "/abroadlist?dayValue=" + dayInfo,  data:{},  dataType:"json",async: false, // 设置为 false 以同步执行cache:false,processData:false,success:function(result){if(result.code == web_status.SUCCESS){showLayerGroup.clearLayers();var legendData = new Array();for(var i = 0;i< result.data.length;i++){var countryData = result.data[i];var color = getRandomColor();var areaLayer = L.geoJSON(JSON.parse(countryData.geomJson),{style: {color:color,weight:3,opacity:0.85,fillOpacity: 0.8}}).addTo(showLayerGroup);var myIcon = L.divIcon({iconSize: null,className: '',popupAnchor:[5,5],shadowAnchor:[5,5],html: "<div class='marsBlackPanel' style='background:" + color + ";' animation-spaceInDown><div class='marsBlackPanel-text'>" + countryData.fullChineseName+"<span class='temperature'></span></div><div class='marsBlackPanel-text'>"+countryData.shortEnglishName + "\t首都:"+ countryData.nameZh+"<span class='temperature'></span></div></div>"});//中心点位L.marker(L.latLng(countryData.lat, countryData.lon), { icon: myIcon}).addTo(showLayerGroup);legendData.push({label: "\xa0\xa0"+countryData.fullChineseName,type: "rectangle",radius: 12,color: color,fillColor: color,fillOpacity: 0.8,weight: 2});}initLegend(legendData);mymap.setView(showLayerGroup.getBounds().getCenter(),3);//同时设置中心位置和级别}},error:function(){$.modal.alertWarning("获取空间信息失败");}});
}

        至此就基本实现了在页面中点击时间后,地图将切换到不同的国家来进行展示。

3、成果展示

        下面将结合前端开发的结果,来看一下我们实现的最终效果:

2025年2月10在澳大利亚和新西兰进行上映

2025年2月14在美国和加拿大上映

2025年3月14在爱尔兰和英国进行上映

2025年4月4号在日本进行上映

        2025年4月23日是上映比较多的,包括马来西亚、奥地利、南非、新加坡、荷兰、巴基斯坦、比利时、埃及和德国。 

 四、总结

         以上就是本文的主要内容,本文将探讨如何基于 SpringBoot 框架和 leaflet-timeline-slider 插件,构建一个以电影《哪吒2》海外国家上映安排为例的历史叙事 GIS 展示系统。《哪吒2》作为一部极具影响力和票房号召力的中国动画电影,其海外上映安排备受关注。通过构建这样一个系统,我们不仅可以清晰地呈现《哪吒2》海外上映的时空分布,还能深入挖掘其背后的文化传播、市场策略以及观众反馈等多维度信息。这不仅有助于电影行业的从业者更好地了解国际市场动态,也为文化研究者提供了丰富的案例分析素材。同时,这种基于 GIS 的历史叙事展示方式也为其他领域的时空数据可视化提供了借鉴和思路,具有重要的研究和应用价值。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915457.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tar 解压:Cannot change ownership to uid 1000, gid 1000: Operation not permitted

tar 解压 tar.gz 压缩包报错&#xff1a; # tar xzf $INPUT_FOLDER/archive.tar.gz -C /mnt/test-nas/[..] tar: xx.jpg: Cannot change ownership to uid 1000, gid 1000: Operation not permitted原因是用普通用户执行的解压缩脚本&#xff0c;用root用户执行tar解压缩&…

腾讯客户端开发面试真题分析

以下是针对腾讯客户端开发工程师面试问题的分类与高频问题分析&#xff08;基于​​105道问题&#xff0c;总出现次数118次​​&#xff09;。按技术领域整合为​​7大类别​​&#xff0c;按占比排序并精选高频问题标注优先级&#xff08;1-5&#x1f31f;&#xff09;&#x…

线上问题排查之【CPU飙高100%】

目录 案例 发现问题 排查问题 步骤一 步骤二 步骤三 案例 import java.util.concurrent.TimeUnit;/*** 简单写一个CPU飙高的案例*/ public class CpuLoadUp {// 这里定义了一个标识private volatile static int flag 0;public static void main(String[] args) {// 执行…

c语言 进阶 动态内存管理

动态内存管理1. 为什么存在动态内存分配2. 动态内存函数的介绍​2.1 malloc 和 freemalloc 函数free 函数2.2内存泄漏2.3 calloc2.4 realloc3. 常见的动态内存错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free释放3.4 使用free释放一块…

Redis的五大基本数据类型

一、Redis基本知识与Redis键&#xff08;key&#xff09;常用操作命令。redis的默认端口6379。mysql默认端口号3306。 默认16个数据库&#xff0c;类似数组的下标从0开始&#xff0c;初始默认使用0号库。可以使用select index来切换数据库&#xff0c;如&#xff1a;select 1&a…

达梦数据库JSON_TABLE使用说明

在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;将 JSON 数据转换为表格形式可以使用内置的 JSON_TABLE 函数。以下是详细步骤和示例&#xff1a;1. 核心函数&#xff1a;JSON_TABLE JSON_TABLE 用于将 JSON 数据解析为关系表结构&#xff0c;支持从 JSON 对象…

A316-1926-V1 USB多路高清音频解码器模组技术解析

随着数字音频技术的不断发展&#xff0c;高品质音频解决方案的需求日益增长。本文将介绍一款基于XMOS技术的高性能USB音频解码器模组——A316-1926-V1&#xff0c;这是一款专为高清音频应用设计的专业模组。核心技术与特性A316-1926-V1是一款集成了多项先进技术的USB多路高清音…

.NET 8 中的 KeyedService

.NET 8 中的 KeyedService&#xff1a;新特性解析与使用示例 一、引言 在 .NET 8 的 Preview 7 版本中&#xff0c;引入了 KeyedService 支持。这一特性为开发者提供了按名称&#xff08;name&#xff09;获取服务的便利&#xff0c;在某些场景下&#xff0c;开发者无需再自行…

Paimon对比基于消息队列(如Kafka)的传统实时数仓方案的优势

弊端&#xff1a;数据重复 -> 优势&#xff1a;Paimon 主键表原生去重原方案弊端 (Kafka)问题: 消息队列&#xff08;Kafka&#xff09;是仅支持追加&#xff08;Append-Only&#xff09;的日志流。当 Flink 作业发生故障恢复&#xff08;Failover&#xff09;或业务逻辑迭代…

Linux Shell 命令 + 项目场景

shell 命令1. 基础文件操作命令1.1 ls - 列出目录内容1.2 find - 文件搜索2. 版本控制命令2.1 git - 版本控制系统2.2 高级 Git 操作3. 文本搜索命令3.1 grep - 文本搜索3.2 高级搜索技巧4. Android 构建系统命令4.1 source - 加载环境变量4.2 lunch - 选择构建目标4.3 m - And…

A316-Mini-V1:超小尺寸USB高清音频解码器模组技术探析

引言 随着便携式音频设备的普及&#xff0c;对小型化、高性能音频解决方案的需求日益增长。本文将介绍一款极致小型化的高性能USB音频解码器模组——A316-Mini-V1&#xff0c;这是一款基于XMOS XU316芯片的微型音频处理模组。产品概述 A316-Mini-V1是一款专为小尺寸产品设计的M…

低代码平台买saas好还是私有化好

选择低代码平台采用SaaS还是私有化部署&#xff0c;应根据企业具体情况考虑安全性、成本控制、维护难度、扩展需求等因素。 其中&#xff0c;安全性是决定企业选择的重要因素之一。私有化部署意味着企业能够完全掌控数据和系统的安全管理&#xff0c;更适合对数据安全要求极高的…

基于SkyWalking的微服务APM监控实战指南

基于SkyWalking的微服务APM监控实战指南 1. 业务场景描述 随着微服务在生产环境中大规模应用&#xff0c;系统链路复杂、实例弹性伸缩、灰度发布等特点都给性能监控和问题诊断带来了新的挑战。传统的单机或轻量级监控方案已无法满足微服务环境下的全链路、分布式追踪和实时告警…

Python 进阶(五): Excel 基本操作

目录 1. 概述2. 写入 2.1 使用 xlwt2.2 使用 XlsxWriter 3. 读取4. 修改 1. 概述 在现实中&#xff0c;很多工作都需要与数据打交道&#xff0c;Excel 作为常用的数据处理工具&#xff0c;一直备受人们的青睐&#xff0c;而大部分人都是手动操作 Excel&#xff0c;如果数据量…

32、鸿蒙Harmony Next开发:使用动画-动画概述

​​​属性动画转场动画粒子动画组件动画动画曲线动画衔接动画效果帧动画&#xff08;ohos.animator&#xff09; UI&#xff08;用户界面&#xff09;中包含开发者与设备进行交互时所看到的各种组件&#xff08;如时间、壁纸等&#xff09;。属性作为接口&#xff0c;用于控制…

【STM32】485接口原理

485 通信实验 这篇文章是对 RS485通信 的原理、硬件连接、接口芯片&#xff08;SP3485&#xff09;、总线结构等都有详尽的说明。我们在此处进行清晰有条理的讲解整理&#xff0c;便于学习和实验操作。 在了解485接口通信原理之前&#xff0c;我们先复习一下串口&#xff1a;串…

亚马逊二审攻防全攻略:预防、应对与长效合规之道

当店铺收到二审通知&#xff0c;不少卖家会陷入焦虑与慌乱&#xff0c;只要掌握科学的预防策略与应对方法&#xff0c;不仅能降低二审风险&#xff0c;即便遭遇审核也能顺利突围。一、未雨绸缪&#xff1a;预防二审的四大核心策略夯实资料真实性根基资料的真实性与一致性是亚马…

添加状态信息

1首先在数据字典里加入可借阅和不可借阅状态2导入数据字典export default {name: "Book",dicts: [book_borrow_status],//导入数据字典data() {return {formData: {name: null,author: null,num: null,price: null,typeId: null,status:null//新加状态属性},3设置状态…

234、回文链表

题目&#xff1a;解答&#xff1a;对143稍作修改即可&#xff0c;判断两个指针指向的是否一直相等。终止条件为不等或者head2nullptrclass Solution { public:ListNode *rev(ListNode *head){ListNode *cur head;ListNode *pre nullptr;while(cur){ListNode * nxt cur->n…

第15次:商品搜索

实现用户在页面可自由搜索某个商品的功能。 第1步&#xff1a;准备搜索功能用到的库 pip install whoosh pip install jieba pip install django-haystackwhoosh是搜索引擎&#xff0c;对英文支持较好&#xff0c;但对中文效果不佳。jieba为中文分词库&#xff0c;弥补whoosh…