基于Leaflet和天地图的南海部分岛礁标准名称可视化实践

举报
夜郎king 发表于 2024/12/31 13:02:44 2024/12/31
【摘要】 文本讲解如何使用Leaflet,结合国家天地图来进行南海部分岛礁标准名称可视化。首先介绍相关岛礁标准名称的原始数据,然后讲解如何使用输入法实现汉语拼音的声调输入,其次介绍如何将度分的位置坐标转换成数值型的经纬度坐标,最后使用Leaflet来叠加到天地图影像地图上。

目录


前言

一、相关数据

1、官方数据

二、如何输入声调

1、输入法切换

2、数据输入

三、后台数据转换与处理

1、数据整理

2、json数据生成

四、WebGIS展示实现以及成果

1、点位标识

2、成果展示

五、总结



前言

        转眼间2024年就要过去了,即将迎来2025。在此祝愿各位朋友元旦快乐,新年快乐。你的2024关键词,发生的难忘的事情又是什么呢?是不是就业艰难,是被毕业。还是在寒冬之中找到了一份不错的工作。或者求学顺利,考研顺利上岸。或者又在为毕业论文发愁,该发的论文还在审核中,如此等等。2024即将过去,放下所有,希望大家都能从从容容。

        最近的新闻比较多,我们的军事实力,装备大量服役。南北的新飞机发布,海上的076两栖攻击舰,我们的制空权和制海权得到了长足的保障。我们拥有很长的海岸线,有很多的岛屿和岛礁,都需要我们的实力去维护。南海不仅天然的风高浪急,这水下暗藏的又有多少波涛汹涌。随着我们综合国力的上升,对于规范的地名使用,官方发布了规范的岛礁标准名称。随着这些名称的公开,为我们在研究南海相关岛礁有了基础。

        下面是官方原文:

为进一步规范有关地名的使用,现将我国南海部分岛礁标准名称予以公布。中国地名委员会1983年4月受权公布的《我国南海诸岛部分标准地名》和自然资源部、民政部2020年4月公布的《自然资源部 民政部关于公布我国南海部分岛礁和海底地理实体标准名称的公告》继续有效,请社会各界规范使用已公布的标准名称。

        文本讲解如何使用Leaflet,结合国家天地图来进行南海部分岛礁标准名称可视化。首先介绍相关岛礁标准名称的原始数据,然后讲解如何使用输入法实现汉语拼音的声调输入,其次介绍如何将度分的位置坐标转换成数值型的经纬度坐标,最后使用Leaflet来叠加到天地图影像地图上。通过本文,你可以掌握如何使用输入法进行拼音声调输入,同时对Leaflet叠加相应坐标更加熟练。通过WebGIS的空间展示,让大家通过地图更加了解我国的岛礁信息。

一、相关数据

        在文章内容的正式开始介绍之前,我们首先来看一下相关的南海岛礁标准名称信息。在2024年11月10日,也就是在人民空军的生日之前,相关部门发布了这份南海岛礁部分标准名称列表。这里打算分享一下原始的数据。

1、官方数据

        官方公布的数据是以图片的形式分享的,因此有很多的媒体还有互联网平台进行了转载,因此这份数据大家可以在公开网站上进行找到。 以央视网为例,这里贴出它的链接,感兴趣的朋友可以点击链接查阅:我国南海部分岛礁标准名称公布。     

         在本次公开的数据中,一共包含了64个岛礁数据。数据主要包含四个属性,第一个是标准名称,第二是标准的汉语名称(当然是包括声调的),第三个是经度位置,第四个是纬度位置。说实话,如果没有标注读音,确实有许多的字,相信很多人是不会读的,当然也包括我。因此有了读音以及声调就能准确的进行地名的拼读。

二、如何输入声调

        在拿到以上的数据之后,我们可以使用一些识别工具。快速的将上图中的两张图片附件,解析之后得到不同的岛礁及其位置信息。解析中文、拼音、经纬度位置基本问题不大。但是这里我们遇到一个问题,如何进行声调的输入。以搜狗输入法为例,本节将来讲解如何在输入法中输入汉语拼音声调信息。

1、输入法切换

        博文编写时电脑上安装的输入法是搜狗输入法,因此这里以搜狗输入法为例。其它的输入法,大家可以自行查找资料来进行解决。首先在电脑上打开输入法的软键盘。打开软键盘的方式有两种,第一种是直接在输入法的管理工具中打开"软键盘”,然后使用鼠标左键点击,如下图所示:

        点击软键盘之后,会自动弹出以下的软键盘信息。 在弹出的小窗体中点击“软键盘”出现如下的小窗口。

        然后就激活了软键盘,如下图所示:

        当打开这样的软键盘之后,就可以实现声调的自定义输入。 如果您觉得一步一步的操作比较繁琐的话,也可以直接操作快捷键,默认情况,如果没有经过特殊的修改,在搜狗输入法中,直接打开软键盘的快捷键是“Ctrl+Shift+K”,同样也是可以调出可以输入声调的软键盘的。

2、数据输入

        当我们学会了如何使用软键盘进行声调的输入后,我们以第一个岛礁的名称为例,重点演示如何进行声调的输入。当然,我们可以使用官方提供的汉语拼音的声调为例子,直接进行输入。

鲎藤西岛

         这个礁岛的汉语拼音带声调输入是:

Hòuténg Xījīao

        这样的话,我们就能在当前的输入法中实现对地名的数据搜集和整理。按照这种模式,我们将64个点位的汉语拼音名称进行了还原。在后面的程序中,我们可以直接对数据进行转换。

三、后台数据转换与处理

        本节将使用Java来讲解如何在后台将获取到的数据进行转换。要想在Leaflet当中进行数据的动态展示,首先要将图片中的数据进行转换。后面我们可以讲以下如何使用Java来实现表格的自动提取。这里主要讲如何把提取好的字符串转变成Map,然后把Map转换成json,再返回给前端使用。

1、数据整理

        为了能实现更好的数据整理,我们按照四个不同属性的进行数据的组织。因此我们将属性数据按照&进行相连,然后在进行解析时,再统一按照约定的符号进行解析。这样就可以得到我们标准字符串。即:标准中文名&标准拼音(带声调)&经度&纬度。所以我们在解析的时候就是按照约定的顺序进行值的处理。最终得到的原始数据集合如下:

private static final String [] dmInfo = {
		"鲎藤西岛&Hòuténg Xīdǎo&116°9.8'E&10°37.4'N",
		"西月北岛&Xīyuè Běidǎo&115°1.6’E&11°5.1’N",
		"火艾沙岛&Huǒ’ài Shādǎo&114°55.7’E&10°53.5’N",
		"鱼鳞沙岛&Yúlín Shādǎo&116°26.2’E&9°47.9’N",
		"信义沙岛&Xìnyì Shādǎo&115°57.3’E&9°19.6’N",
		"司令沙岛 &Sīlìng Shādǎo&115°14.3'E&8°21.5'N",
		//"罗孔环礁 &Luokong Huanjiao&115°47.9'E, 10°35.5'N; 115°53.6'E, 10°49.7'N",
		"鲨藤东礁&Hòuténg Dōngjiāo&116°10.9'E&10°37.1'N",
		"鱼嘴礁&Yúzuǐ Jiāo&116°36.1'E&9°43.4'N",
		"鱼嘴南礁&Yúzuǐ Nánjiāo&116°35.6'E&9°43.0'N",
		"鱼嘴北礁&Yúzuǐ Běijiāo&116°35.6'E&9°44.0'N",
		"鱼嘴仔礁&Yúzuǐzǎi Jiāo&116°35.7'E&9°43.7'N",
		"鱼目礁&Yúmù Jiāo&116°34.8'E&9°43.6'N",
		"鱼目东北礁&Yúmù Dōngběijiāo&116°35.2'E&9°43.7'N",
		"鱼目东礁&Yúmù Dōngjiāo&116°35.3'E&9°43.6'N",
		"鱼目东南礁&Yúmù Dōngnánjiāo&116°35.2'E&9°43.2'N",
		"鱼目西礁&Yúmù Xījiāo&116°34.2'E&9°43.7'N",
		"鱼目北礁&Yúmù Běijiāo&116°34.9'E&9°43.9'N",
		"鱼背礁&Yúběi Jiāo&116°34.6'E&9°44.4'N",
		"鱼背东礁&Yúběi Dōngjiāo&116°35.0'E&9°44.3'N",
		"鱼背南礁&Yúběi Nánjiāo&116°34.4'E&9°44.0'N",
		"鱼背西礁&Yúběi Xījiāo&116°34.2'E&9°44.7'N",
		"鱼背仔礁&Yúběizǎi Jiāo&116°34.7'E&9°44.3'N",
		"鱼鳍礁&Yúqí Jiāo&116°33.8'E&9°43.4'N",
		"鱼骨礁&Yúgǔ Jiāo&116°33.5'E&9°44.1'N",
		"鱼骨东北礁&Yúgǔ Dōngběijiā&116°33.7'E&9°44.5'N",
		"鱼骨东礁&Yúgǔ Dōngjiāo&116°33.9'E&9°44.0'N",
		"鱼骨西北礁&Yúgǔ Xīběijiāo&116°33.0'E&9°44.5'N",
		"鱼骨北礁&Yúgǔ Běijiāo&116°33.3'E&9°44.6'N",
		"鱼尾礁&Yúwéi Jiāo&116°31.5'E&9°44.7'N",
		"贝壳礁&Bèiké Jiāo&116°29.5'E&9°42.7'N",
		"贝壳西礁&Bèiké Xījiāo&116°28.8'E&9°43.0'N",
		"木梳南礁&Mùshū Nánjiāo&116°26.3'E&9°45.7'N",
		"木梳礁&Mùshū Jiāo&116°25.1'E&9°47.4'N",
		"木梳东礁&Mùshū Dōngjiāo&116°25.7'E&9°47.4'N",
		"木梳仔礁&Mùshūzǎi Jiāo&116°25.5'E&9°47.7'N",
		"木梳仔南礁&Mùshūzǎi Nánjiāo&116°25.5'E&9°47.5'N",
		"木梳仔西礁&Mùshūzǎi Xījiāo&116°25.3'E&9°47.6'N",
		"木梳仔北礁&Mùshūzǎi Běijiāo&116°25.9'E&9°47.8'N",
		"鱼鳞礁&Yúlín Jiāo&116°26.4'E&9°48.1'N",
		"铁犁礁&Tiělí Jiāo&116°28.2'E&9°48.2'N",
		"铁犁西礁&Tiělí Xījiāo&116°27.1'E&9°48.6'N",
		"铁犁仔礁&Tiělízǎi Jiāo&116°27.4'E&9°48.6'N",
		"北斗礁&Běidǒu Jiāo&116°27.4'E&9°48.3'N",
		"北斗头礁&Běidǒu Tóujiāo&116°27.7'E&9°48.3'N",
		"北斗东礁&Běidǒu Dōngjiāo&116°27.8'E&9°48.3'N",
		"北斗中礁&Běidǒu Zhōngjiāo&116°27.7'E&9°48.3'N",
		"北斗南礁&Běidǒu Nánjiāo&116°27.4'E&9°48.2'N",
		"北斗西礁&Běidǒu Xījiāo&116°27.2'E&9°48.4'N",
		"北斗北礁&Běidǒu Běijiāo&116°27.4'E&9°48.4'N",
		"折扇东礁&Zhéshàn Dōngjiāo&116°30.8'E&9°45.6'N",
		"折扇礁&Zhéshàn Jiāo&116°30.5'E&9°45.8'N",
		"仁爱东礁&Rén'ài Dōngjiāo&115°53.4'E&9°47.5'N",
		"仁爱北门礁&Rén'ài Běimén Jiāo&115°53.2'E&9°46.6'N",
		"仁爱中礁&Rén'ài Zhōngjiāo&115°52.5'E&9°44.5'N",
		"连珠北礁&Liánzhū Běijiāo&115°52.3'E&9°43.0'N",
		"连珠中礁&Liánzhū Zhōngjiāo&115°52.0'E&9°42.6'N",
		"连珠礁&Liánzhū Jiāo&115°51.9'E&9°42.3'N",
		"连珠南礁&Liánzhū Nánjiāo&115°51.8'E&9°41.7'N",
		"仁爱南礁&Rén'ài Nánjiāo&115°51.0'E&9°41.5'N",
		"断节南礁&Duànjié Nánjiāo&115°50.9'E&9°44.3'N",
		"断节礁&Duànjié Jiāo&115°50.7'E&9°45.4'N",
		"断节北礁&Duànjié Běijiāo&115°50.9'E&9°46.7'N",
		"仁爱北礁&Rén'ài Běijiāo&115°51.8'E&9°47.9'N"
	};

2、json数据生成

        有了以上的基础数据时候,我们就可以按照约定的规则进行数据处理。处理国际比较简单。将上面的坐标信息按照&进行分割,然后分别获取其索引对应的值。

@Test
public void dmConvertJwd() {
	List<LinkedHashMap<String, Object>> islandData = new ArrayList<LinkedHashMap<String,Object>>();
	for(String island : dmInfo) {
		System.out.println(island);
		String [] islandInfo = island.split("&");
		for(String info : islandInfo) {
			System.out.println(info);
		}
		LinkedHashMap<String, Object> map = new LinkedHashMap<String, Object>(4);
		map.put("name", islandInfo[0]);
	    map.put("pinyin", islandInfo[1]);
		map.put("lon", CoordinateUtil.DmsTurnDD(islandInfo[2]));
		map.put("lat", CoordinateUtil.DmsTurnDD(islandInfo[3]));
		islandData.add(map);
	}
	System.out.println("*****************************************************");
	System.out.println(islandData.size());
	System.out.println(islandData);
	Gson gson = new Gson();
	System.out.println(gson.toJson(islandData));
}

        程序运行完毕后,可以在控制台中看到如下输出:

        这样就说明,通过采集的原始度分数据已经正确的进行了处理,处理后的数据变成了经纬度坐标。这样就可以在Leaflet当中进行展示使用。

四、WebGIS展示实现以及成果

        万事俱备只欠东风,当我们把需要展示的数据也准备完毕之后,就可以将数据叠加到Leaflet中进行展示。因此本小节重点讲解如何使用Leaflet来进行数据可视化开发。

1、点位标识

        为了比较方便的对这些点位数据进行表示,因此需要使用Leaflet框架来对相关的数据进行展示。这里需要使用的对应有marker。动态展示的代码如下:

function getRandomColor() {
	var letters = '0123456789ABCDEF';
	var color = '#';
	for (var i = 0; i < 6; i++) {
		 color += letters[Math.floor(Math.random() * 16)];
	}
	return color;
}
	
var collisionLayer = L.LayerGroup.collision({margin:3});
	
for(var i=0;i<data.length;i++){
	var html = "";
	var marker = L.marker([data[i].lat, data[i].lon], {
		icon: L.divIcon({
			iconSize: null,
			className: '',
			popupAnchor:[5,5],
			shadowAnchor:[5,5],
			html: buildHtml(data[i])
		})
	}).addTo(collisionLayer);
}
	
collisionLayer.addTo(map);

function buildHtml(dataJson){
	var html = "";
	html += "<div class='marsBlackPanel' style='background:" + getRandomColor() +";' animation-spaceInDown><div class='marsBlackPanel-text' ><b>【"+dataJson.name +"】</b></div>";
	html += "<div class='marsBlackPanel-text' style=''>" + dataJson.pinyin  + "</div>";
	html += "</div>";
	return html;
}

         以上代码就完成了点位信息的空间展示,同时提供一个信息详情查看的页面。下面我们结合可视化结果来进行讲解。

2、成果展示

        首先来看一下整体的效果,由于本轮公开的岛礁信息,有一些的空间距离挨的比较近,加上我们采用的碰撞检测的算法,因此在高层级下展示,效果不是很明显。先来看一下整体结果:

        可以看到,本轮公开的岛礁位置,大多是位于南海区域,而且是特别靠南的位置。 

        上图是南海的仁爱礁的点位数据,通过天地图的影像可以看到,仁爱礁上的岛礁还是比较多的。将地图放大后可以看到很多折叠在一起的位置。

        同样的,在鱼嘴礁附近,也是有众多的岛礁,比如鱼鳞礁、鱼目礁、鱼背礁等等。在这一块的岛礁也非常多。 通过以上的成果展示,大家应该可以看到本次公开的岛礁信息,在位置上更加靠南。

五、总结

        以上就是本文的主要内容,文本讲解如何使用Leaflet,结合国家天地图来进行南海部分岛礁标准名称可视化。首先介绍相关岛礁标准名称的原始数据,然后讲解如何使用输入法实现汉语拼音的声调输入,其次介绍如何将度分的位置坐标转换成数值型的经纬度坐标,最后使用Leaflet来叠加到天地图影像地图上。通过本文,你可以掌握如何使用输入法进行拼音声调输入,同时对Leaflet叠加相应坐标更加熟练。通过WebGIS的空间展示,让大家通过地图更加了解我国的岛礁信息。行文仓促,难免有许多的不足之处,如有不足,在此还恳请各位专家朋友在评论区留言指出,不胜感激。 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。