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

火山引擎GitHub CI + 对象存储 + CDN静态资源网站部署总结

火山引擎GitHub CI + 对象存储 + CDN静态资源网站部署总结

哇 第一次接触带CDN的网站部署,好好玩。 Github Actions 在项目的主目录中新建一个.github/workflows/deploy.yml文件 大概长这样: name: Deploy to Volcengine TOS on:# 触发条件push:branches:- main # 或者是你的主分支名称jobs:# 在什么机器上跑+环境变量build-and-deploy:runs-on: ubuntu-latest env:# Build-time env for Vite (optional)VITE_API_BASE_URL: ${{ secrets.VITE_API_BASE_URL }}# Volcengine TOS (S3-compatible) deploy configTOS_BUCKET: ${{ secrets.TOS_BUCKET

By Ne0inhk

App Inventor语音交互机器人实战:从零构建高效语音控制系统

快速体验 在开始今天关于 App Inventor语音交互机器人实战:从零构建高效语音控制系统 的探讨之前,我想先分享一个最近让我觉得很有意思的全栈技术挑战。 我们常说 AI 是未来,但作为开发者,如何将大模型(LLM)真正落地为一个低延迟、可交互的实时系统,而不仅仅是调个 API? 这里有一个非常硬核的动手实验:基于火山引擎豆包大模型,从零搭建一个实时语音通话应用。它不是简单的问答,而是需要你亲手打通 ASR(语音识别)→ LLM(大脑思考)→ TTS(语音合成)的完整 WebSocket 链路。对于想要掌握 AI 原生应用架构的同学来说,这是个绝佳的练手项目。 从0到1构建生产级别应用,脱离Demo,点击打开 从0打造个人豆包实时通话AI动手实验 App Inventor语音交互机器人实战:从零构建高效语音控制系统 语音交互正在成为移动应用的重要入口,但很多App Inventor开发者在实现语音控制功能时,常常遇到识别延迟高、环境噪声干扰、多指令混淆等问题。本文将分享一套经过实战验证的优化方案,帮助开发者构建响应迅速的语音交互机器人。

By Ne0inhk
AIOps实践:基于 Dify+LangBot 实现飞书智能体对话机器人

AIOps实践:基于 Dify+LangBot 实现飞书智能体对话机器人

文章目录 * AIOps实践:Dify接入飞书实现与智能体对话 * 前言 * 环境搭建 * 1、Docker环境搭建 * 2、LangBot搭建 * 3、编辑流水线 * 4、配置飞书机器人 * 5、创建机器人 * 6、进行测试 * 附:遇到的问题 AIOps实践:Dify接入飞书实现与智能体对话 前言 前端时间把dify的智能体接入到了Prometheus和夜莺上,实现了与智能体的基本对话,并可以调取Prometheus数据进行分析,在那之后就开始深度研究AIOps实现原理于深度赋能运维的可能性,所以正在研究AIOps的核心:MCP Server;现在还并未成型,在研究的过程中,就想到了可否基于dify的agent,连接自建的mcp服务器,对接到飞书的机器人上,这样就可以和智能体进行对话,配合成型的mcp,就可以基本实现AIOps。 这里需要借助一个三方的开源工具LangBot,LangBot是一个生产级多平台 LLM 机器人开发平台。那么就开始实践吧: MCP Server开发的当前阶

By Ne0inhk
【无人机】无人机路径规划算法

【无人机】无人机路径规划算法

目录 一、引言:无人机与路径规划算法 二、路径规划算法基础 (一)定义与重要性 (二)规划目标与约束条件 三、常见路径规划算法详解 (一)A * 算法 (二)Dijkstra 算法 (三)RRT(快速扩展随机树)算法 (四)蚁群算法 四、算法应用实例与效果展示 (一)不同场景下的算法应用 (二)算法性能对比数据 五、算法的优化与发展趋势 (一)现有算法的优化策略 (二)结合新技术的发展方向 六、挑战与展望 (一)面临的技术挑战 (二)未来应用前景 七、结论 一、引言:无人机与路径规划算法 在科技飞速发展的今天,无人机作为一种极具创新性的技术产物,已深度融入我们生活的方方面面,

By Ne0inhk