当前位置: 首页 > news >正文

GeoJSON 转换工具类

1.maven依赖

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.4</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>net.postgis</groupId><artifactId>postgis-jdbc-jtsparser</artifactId><version>2.5.1</version></dependency><!-- JTS 几何库 --><dependency><groupId>org.locationtech.jts</groupId><artifactId>jts-core</artifactId><version>1.20.0</version></dependency></<dependencies>

2.转换类

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.io.WKBReader;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.io.geojson.GeoJsonReader;
import org.locationtech.jts.io.geojson.GeoJsonWriter;/*** GeoJSON 转换工具类* 用于 GeoJSON 与 JTS Geometry 之间的转换* */
public class GeoJsonUtil {private static final GeoJsonReader geoJsonReader = new GeoJsonReader();private static final GeoJsonWriter geoJsonWriter = new GeoJsonWriter();private static final ObjectMapper objectMapper = new ObjectMapper();/*** GeoJSON 字符串转 Geometry* @param geoJson GeoJSON 字符串,例如:{"type":"Point","coordinates":[113.93,22.58]}* @return JTS Geometry 对象*/public static Geometry geoJsonToGeometry(String geoJson) {if (geoJson == null || geoJson.trim().isEmpty()) {return null;}try {return geoJsonReader.read(geoJson);} catch (Exception e) {throw new RuntimeException("Failed to parse GeoJSON: " + geoJson, e);}}/*** Geometry 转 GeoJSON 字符串* @param geometry JTS Geometry 对象* @return GeoJSON 字符串*/public static String geometryToGeoJson(Geometry geometry) {if (geometry == null) {return null;}try {return geoJsonWriter.write(geometry);} catch (Exception e) {throw new RuntimeException("Failed to write GeoJSON", e);}}/*** 验证是否是有效的 GeoJSON* @param geoJson GeoJSON 字符串* @return true-有效,false-无效*/public static boolean isValidGeoJson(String geoJson) {if (geoJson == null || geoJson.trim().isEmpty()) {return false;}try {JsonNode node = objectMapper.readTree(geoJson);return node.has("type") && node.has("coordinates");} catch (Exception e) {return false;}}/*** 数据库 Geometry 字段转 GeoJSON* 支持 WKT 和 EWKB(十六进制字符串)两种格式* * @param dbGeometry 数据库返回的 geometry 字段值(WKT 或 EWKB 十六进制字符串)* @return GeoJSON 字符串,如果转换失败返回 null*/public static String dbGeometryToGeoJson(String dbGeometry) {if (dbGeometry == null || dbGeometry.trim().isEmpty()) {return null;}try {String geomStr = dbGeometry.trim();Geometry geometry;// 判断是 WKB(十六进制)还是 WKT 格式if (geomStr.matches("^[0-9A-Fa-f]+$")) {// EWKB 格式(十六进制字符串)- PostgreSQL PostGIS 默认返回格式WKBReader wkbReader = new WKBReader();byte[] wkbBytes = WKBReader.hexToBytes(geomStr);geometry = wkbReader.read(wkbBytes);} else {// WKT 格式(文本格式)WKTReader wktReader = new WKTReader();geometry = wktReader.read(geomStr);}return geometryToGeoJson(geometry);} catch (Exception e) {throw new RuntimeException("Failed to convert database geometry to GeoJSON: " + e.getMessage(), e);}}public static void main(String[] args) {// 标准 GeoJSON - 一个简单的矩形PolygonString geoJson = "{\"type\":\"Polygon\",\"coordinates\":[[[116.0,23.0],[116.1,23.0],[116.1,23.1],[116.0,23.1],[116.0,23.0]]]}";String dbGeometry = "0103000020E610000001000000050000000000000000005E40CDCCCCCCCC1C3F0000000000005E400000000000005E40CDCCCCCCCC1C3F00000000000062400000000000005E40CDCCCCCCCC1C3F00000000000062400000000000005E40CDCCCCCCCC1C3F0000000000005E40";System.out.println("【GeoJSON -> Geometry】" + geoJsonToGeometry(geoJson));System.out.println("【GeoJSON -> Geometry -> GeoJSON】" + geometryToGeoJson(geoJsonToGeometry(geoJson)));System.out.println("【数据库Geometry -> GeoJSON】" + dbGeometryToGeoJson(dbGeometry));}
}

3.效果图

image

http://www.rkmt.cn/news/1467340.html

相关文章:

  • 客户至上:诚誉财税用口碑铸就南沙财税服务第一品牌 - 资讯快报
  • 慢动作生成失效全归因,从光流抖动到物理一致性崩塌——Sora 2底层时序引擎拆解
  • 抖音批量下载神器:3分钟掌握无水印视频批量保存技巧
  • 国产化替代实战指南:从理性评估到系统验证的工程实践
  • 2025_NIPS_Efficient RL with Impaired Observability: Learning to Act with Delayed and Missing Stat...
  • 降本增效管理咨询口碑机构推荐:2026年家居建材企业利润保卫指南 - 远大方略管理咨询
  • 终极指南:如何用TomatoBar打造macOS最高效的番茄工作法体验 [特殊字符]
  • Matlab实现的BP神经网络车牌字符识别系统:含预处理、训练与实测图像
  • 内置天线选购指南:如何挑选优质的手机内置天线厂家 - 资讯速览
  • 2026年芝麻白厂家推荐排行榜:芝麻白石材/墓碑料/火烧板/路沿石/花岗石源头工厂最新精选 - 企业推荐官【官方】
  • STM32内部参照电压(Vrefint)原理与应用:提升ADC测量精度的工程实践
  • AI芯片、GPU与CPU的算力博弈:专用与通用的架构权衡与生态竞争
  • QQ音乐解析工具:免费音乐下载与无损音质提取的终极解决方案
  • 2026杭州翡翠回收靠谱测评|NGTC/CCIC双认证无套路|高端翡翠高价变现避坑指南 - 薛定谔的梨花猫
  • 在MonkeyCode上能做6件事:不只是写代码
  • 丽水黄金回收机构盘点,上门便利,安全可靠 - 黄金上门回收
  • NS-USBLoader:Switch游戏管理终极解决方案,5分钟快速上手指南
  • 别再被‘Zabbix agent is not available‘坑了!手把手教你排查MySQL Socket连接问题
  • 2026年最新三星官方授权维修服务中心地址核验报告 - 资讯快报
  • 深耕舞台智能装备全产业链 广州市科卓机械凭定制化实力领跑多场景演艺设备赛道 - GrowthUME
  • R语言画GSEA图时,你的颜色和排版真的对了吗?分享几个让审稿人眼前一亮的enrichplot美化技巧
  • 079、自动降落控制算法
  • 代理记账服务有哪些关键点?白云区资深财税咨询机构要点拆解 - 资讯综合站
  • SSH远程免密登录的两种方式
  • 汽车贴膜怎么选?南京日晟一文讲透玻璃膜、隐形车衣、改色膜 - GrowthUME
  • 2026北京黄金回收避坑指南|报价透明可上门,实测靠谱 - 奢侈品回收测评
  • 英雄联盟回放分析神器ReplayBook:从青铜到王者的进阶指南
  • QZoneExport终极指南:三步永久保存你的QQ空间青春记忆
  • 渝中区高性价比手工牛油火锅推荐|景区周边无套路市井火锅指南 - 资讯纵览
  • 每天切换几十个微信手忙脚乱?同一界面聚合聊天,一站式搞定运营难题