WebGIS开发实战:WKT转GeoJSON的多种技巧与Leaflet加载应用详解

WebGIS开发实战:WKT转GeoJSON的多种技巧与Leaflet加载应用详解

目录

前言

一、WKT后台转换实现

1、基于PostGIS实现

2、GeoTools实现

二、wellknown.js转换

1、wellknown.js是什么?

2、wellknown.js的方法

三、在Leaflet.js中集成wellknow.js

1、资源引入

2、将wkt转为geojson

四、总结


前言

        在当今数字化浪潮中,地理信息系统(GIS)技术正以前所未有的速度融入我们的生活与工作。从城市规划到环境监测,从物流配送到旅游出行,地理空间数据的价值日益凸显。而 WebGIS,作为 GIS 技术与 Web 技术的深度融合,更是为地理信息的共享与交互开辟了广阔天地。它让地理数据能够通过网络在各种终端设备上轻松呈现,极大地拓展了 GIS 的应用场景和受众群体。然而,在 WebGIS 开发过程中,数据格式的转换与兼容始终是一个关键挑战。其中,WKT(Well-Known Text)和 GeoJSON 作为两种常见的地理空间数据格式,它们之间的转换更是开发者们经常需要面对的问题。WKT 是一种简单易读的文本格式,广泛用于地理数据的存储与交换,但其在 Web 环境下的可视化和交互性相对较弱;而 GeoJSON 则以其简洁的 JSON 结构,完美契合了 Web 开发的需求,便于与各种前端框架和库进行集成,实现地图的渲染、交互以及地理数据的动态展示。

        那么,如何高效地将 WKT 数据转换为 GeoJSON 格式,以便更好地在 WebGIS 应用中使用呢?这正是本文将深入探讨的核心问题。在 WebGIS 开发实战中,我们有幸接触到了多种 WKT 转 GeoJSON 的方法,从基于开源库的便捷转换,到自定义算法的灵活实现,每一种方法都有其独特的优势和适用场景。这些方法不仅能够帮助我们快速完成数据格式转换,还能在一定程度上优化数据处理流程,提升应用性能。

        在本文中,我们将详细介绍这些 WKT 转 GeoJSON 的技巧,包括它们的原理、实现步骤以及优缺点分析。同时,我们还将结合 Leaflet 这一广受欢迎的开源 JavaScript 地图库,深入解析如何将转换后的 GeoJSON 数据加载到 Leaflet 地图中,实现地图的绘制、图层管理、交互功能开发等一系列实战应用。Leaflet 以其轻量级、高性能、易扩展的特点,在 WebGIS 前端开发领域占据着重要地位。通过 Leaflet 加载 GeoJSON 数据,我们能够轻松构建出功能丰富、交互流畅的地图应用,满足不同用户的需求。

        无论你是 GIS 领域的开发人员,希望提升 WebGIS 应用的数据处理与可视化能力;还是 Web 开发者,想要将地理信息融入你的项目中,本文都将为你提供宝贵的知识和实用的技巧。让我们一起踏上这场 WebGIS 开发实战之旅,解锁 WKT 转 GeoJSON 的奥秘,探索 Leaflet 加载应用的无限可能,共同推动地理信息在 Web 环境下的创新与发展。

一、WKT后台转换实现

        本节以PostGIS空间数据库和Java后台为例,介绍如何基于空间数据库和Geotools库实现Wkt转为GeoJSON。

1、基于PostGIS实现

        如果大家的开发数据库中有空间数据库的话,我们可以直接利用空间数据的空间函数来进行处理,以我们之前介绍过的地震信息数据为例,使用以下SQL语句可以查询空间属性的WKT格式,查询语句如下:

select st_asewkt(geom) from biz_ceic_earthquake limit 10;

        在Navicat执行上述语句后,可以看到如下结果:

        如果要实现对应的WKT转为GeoJSON应该如何实现呢?我们只需要使用st_asgeojson函数即可完成转换。示例SQL查询语句如下:

select st_asewkt(geom),st_asgeojson(geom) from biz_ceic_earthquake limit 10;

        在返回的结果集中可以看到以下结果:

        第二列就是我们需要的Geojson类型。有了这个sql语句之后,我们就可以在Java中结合SQL查询将结果返回给前端。这个方案的本质还是直接利用了空间数据库的空间查询能力,在此不再赘述。

2、GeoTools实现

        这里介绍完全基于Geotools的纯后台转换逻辑,只需要只用到Geotools这个组件。在工程项目中首先要引入Geotools组件,在Pom.xml中首先引入以下依赖:

<dependency> <groupId>org.geotools</groupId> <artifactId>gt-geojson</artifactId> <version>28.2</version> <!-- 使用最新版本 --> </dependency> <dependency> <groupId>org.locationtech.jts</groupId> <artifactId>jts-core</artifactId> <version>1.19.0</version> <!-- 使用最新版本 --> </dependency>

        引入相应的资源后,接下来我们就可以使用Geotools来实现把Wkt字符串转为Geojson。核心转换代码如下:

package com.yelang.project.geotools.wkt2json; import org.geotools.geojson.geom.GeometryJSON; import org.geotools.geometry.jts.JTSFactoryFinder; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.io.WKTReader; import java.io.StringWriter; public class WKTToGeoJSON { public static String wktToJson(String wkt) { String json = null; try { // 创建 GeometryFactory 和 WKTReader GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null); WKTReader reader = new WKTReader(geometryFactory); // 解析 WKT 字符串为 Geometry 对象 Geometry geometry = reader.read(wkt); // 创建 GeometryJSON 对象,用于将 Geometry 转换为 GeoJSON GeometryJSON geometryJson = new GeometryJSON(); // 将 Geometry 转换为 GeoJSON 格式的字符串 StringWriter writer = new StringWriter(); geometryJson.write(geometry, writer); json = writer.toString(); } catch (Exception e) { e.printStackTrace(); } return json; } public static void main(String[] args) { String wkt = "POLYGON ((0 0, 0 1, 1 1, 1 0, 0 0))"; //{"type":"Polygon","coordinates":[[[0.0,0.0],[0.0,1],[1,1],[1,0.0],[0.0,0.0]]]} String geoJson = wktToJson(wkt); System.out.println(geoJson); } }

        这里主要使用WKTReader读取WKT的字符串,然后转为Geometry,最后通过GeometryJSON进行GeoJSON格式化,从而实现从WKT到GeoJSON的转换。代码完成后,我们使用程序进行验证,输出如下,说明转换成功:

二、wellknown.js转换

        如果在开发WebGIS应用时,按照约定的标准,第三方接口返回给了一个WKT字符串,而我们没有对应的后台支撑,此时又该怎么办呢?如果我们只有前端,那么应该如何集成对应的WKT,从而达到页面的渲染展示。相信这是很多从事webgis开发的同学会遇到的问题。以此本节重点讲解如何基于纯前端wellkonw.js组件进行Wkt到GeoJSON的转换,并提供加载的功能。

1、wellknown.js是什么?

        不论是使用Leaflet还是openlayers或者Cesium来进行WebGIS开发,如果遇到WKT,还真不是一下子就能介入的,而GeoJSON是一种比较同样的格式,因此急需一款可以直接将Wkt转为GeoJSON的工具。这里介绍wellknow.js这款组件,是大名鼎鼎的Mapbox开源的一个成熟组件,开源地址如下:wellknown/

Parse & stringify Well-Known Text into GeoJSON.

SupportPoint + MultiPointLineString + MultiLineStringPolygon + MultiPolygonGeometryCollection2D, 3D, 4D geometries

        因此这款组件我们完全可以用来解决遇到的问题。

2、wellknown.js的方法

        这款插件很迷你,核心方法就是实现两种格式的转换。因此对外提供的两个核心函数就是实现从WKT到GeoJSON的转换和互转。

parse(wkt)

Given WKT as a string, return a GeoJSON geometry object or null if parse fails.

stringify(geojson)

Given a GeoJSON geometry object or Feature object, return a WKT representation as a string. Throws an error if given a FeatureCollection or unknown input.

        请熟练这两个方法,尤其是第一个方法,将是我们实现WKT转为GeoJSON的基础。了解了wellknow的基本知识后,下面我们就以Leaflet为例,重点讲解如何进行集成。

三、在Leaflet.js中集成wellknow.js

        本节将详细讲解如何在Leaflet中集成wellknow.js。当然大家可以根据自己的需要和熟练程度,选择自己熟悉的二三维引擎来进行WebGIS应用的开发。

1、资源引入

        在Leaflet.js页面中引入wellknow.js的方法很简单,最简单的方式就是直接使用<Script>的方式直接引入即可。核心代码如下:

<script src="/pcwater/static/js/wellknown.js"></script>

2、将wkt转为geojson

        引入资源以后,接下来就可以调用提供的API实现将WKT转为GeoJSON,代码也非常的简介,如下所示:

var myStyle = {color:"red",weight:5,"opacity":1, "fillOpacity": 0}; const geojson = wellknown.parse(_tempPolyline); var areaLayer = L.geoJSON(geojson,{style:myStyle}).addTo(showLayerGroup);

        这里指定了一个GeoJSON的展示样式,包括颜色、透明度和填充透明度,最后再调用leaflet的geojson展示方法实现WKT方法的转换,从而实现空间是属性的展示。如果在完全没有后端的前提下,可以采用这种方式来进行转换。

四、总结

        以上就是今天的主要内容,本文详细的介绍了如何在后台基于空间数据库和Geotools组件实现Wkt转换为GeoJSON,也介绍了一个前端组件wellknowjs这种纯前端的解决方案。在本文中,我们将详细介绍这些 WKT 转 GeoJSON 的技巧,包括它们的原理、实现步骤以及优缺点分析。同时,我们还将结合 Leaflet 这一广受欢迎的开源 JavaScript 地图库,深入解析如何将转换后的 GeoJSON 数据加载到 Leaflet 地图中,实现地图的绘制、图层管理、交互功能开发等一系列实战应用。Leaflet 以其轻量级、高性能、易扩展的特点,在 WebGIS 前端开发领域占据着重要地位。通过 Leaflet 加载 GeoJSON 数据,我们能够轻松构建出功能丰富、交互流畅的地图应用,满足不同用户的需求。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

Read more

最新Spring Security实战教程(十一)CSRF攻防实战 - 从原理到防护的最佳实践

最新Spring Security实战教程(十一)CSRF攻防实战 - 从原理到防护的最佳实践

🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Micro麦可乐的博客 🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战 🌺《RabbitMQ》专栏19年编写主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战 🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解 🌛《开源项目》本专栏主要介绍目前热门的开源项目,带大家快速了解并轻松上手使用 ✨《开发技巧》本专栏包含了各种系统的设计原理以及注意事项,并分享一些日常开发的功能小技巧 💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程 🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整 🌞《Spring Security》专栏中我们将逐步深入Spring Security的各个技术细节,带你从入门到精通,全面掌握这一安全技术 如果文章能够给大家带来一定的帮助!欢迎关注、评

By Ne0inhk
windows 如何更新npm及node.js到最新版本

windows 如何更新npm及node.js到最新版本

在 Windows 系统上更新 npm(Node Package Manager)可以通过以下步骤完成: 方法 1:直接更新 npm 1. 以管理员身份打开命令行工具(CMD 或 PowerShell): * 右键点击「开始菜单」→ 选择 Windows Terminal (Admin) 或 命令提示符(管理员)。 * -g 表示全局安装。 * 如果遇到权限问题,可以尝试使用系统代理或关闭杀毒软件。 验证更新是否成功: npm-v 更新 npm 到最新版本: npminstall-g npm@latest 方法 2:更新 Node.js 以附带更新 npm 如果 npm 版本过旧,可能需要直接升级 Node.

By Ne0inhk
【MySQL筑基篇】新手必看:聚簇索引、非聚簇索引与回表,一篇扫清盲区

【MySQL筑基篇】新手必看:聚簇索引、非聚簇索引与回表,一篇扫清盲区

🍃 予枫:个人主页 📚 个人专栏: 《Java 从入门到起飞》《读研码农的干货日常》 💻 Debug 这个世界,Return 更好的自己! 引言 做后端开发的同学,大概率都听过“索引优化”,也用过主键索引提升查询速度。但你真的懂索引吗?日常开发中,不少同学遇到查询卡顿就盲目加索引,结果反而导致数据增删改效率下降;还有人疑惑,为什么同样是索引,主键查询秒出结果,普通索引查询却要慢半拍?除了主键,还有哪些核心索引类型?为什么有的查询不用“绕路”,有的却要额外“回表”?今天咱们从数据库物理存储的底层逻辑出发,逐字拆解聚簇索引与非聚簇索引的核心概念,帮你夯实索引入门基础,为后续吃透B+树结构、搞定索引优化铺路~ 建议点赞收藏,避免后续需要时找不到! 文章目录 * 引言 * 一、索引基础:不止是“快速查找” * 1.1 为什么需要关注物理存储? * 二、聚簇索引:数据与索引“合二为一”

By Ne0inhk
Spring Boot AOP(三) 通知执行链源码解析

Spring Boot AOP(三) 通知执行链源码解析

博主社群介绍: ① 群内初中生、高中生、本科生、研究生、博士生遍布,可互相学习,交流困惑。 ② 热榜top10的常客也在群里,也有数不清的万粉大佬,可以交流写作技巧,上榜经验,涨粉秘籍。 ③ 群内也有职场精英,大厂大佬,跨国企业主管,可交流技术、面试、找工作的经验。 进群免费赠送写作秘籍一份,助你由写作小白晋升为创作大佬,进群赠送ZEEKLOG评论防封脚本,送真活跃粉丝,助你提升文章热度。 群公告里还有全网大赛约稿汇总/博客提效工具集/ZEEKLOG自动化运营脚本 有兴趣的加文末联系方式,备注自己的ZEEKLOG昵称,拉你进群,互相学习共同进步。 文章目录 * Spring Boot AOP(三) 通知执行链源码解析 * 1. 执行链概述 * 核心概念 * 2. Advisor 链与通知统一处理 * Mermaid 流程图:Advisor 链构建 * 3. MethodInterceptor 执行流程

By Ne0inhk