最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)WGS84/GCJ02/BD09的坐標(biāo)互轉(zhuǎn)終極方案

 更新時間:2025年09月16日 09:53:53   作者:寒冰碧海  
這篇文章主要為大家詳細介紹了Java如何利用Geotools實現(xiàn)WGS84/GCJ02/BD09的坐標(biāo)互轉(zhuǎn),文中的示例代碼講解詳細,需要的小伙伴可以了解下

工具類設(shè)計目標(biāo)

為簡化GIS開發(fā)中頻繁的坐標(biāo)轉(zhuǎn)換操作,本文封裝可復(fù)用的Java工具類,實現(xiàn)以下能力:

多坐標(biāo)系互轉(zhuǎn)(WGS84/GCJ02/BD09/UTM等)

線程安全的靜態(tài)方法調(diào)用

自動處理坐標(biāo)軸順序(經(jīng)度優(yōu)先/緯度優(yōu)先)

異常捕獲與日志追蹤

核心源碼實現(xiàn)

1. Maven依賴配置

<dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-main</artifactId>
    <version>31-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>org.locationtech.jts</groupId>
    <artifactId>jts-core</artifactId>
    <version>1.19.0</version>
</dependency>

2. 工具類源碼

import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.locationtech.jts.geom.Coordinate;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import lombok.extern.slf4j.Slf4j;


/**
 * 坐標(biāo)轉(zhuǎn)換工具類(支持EPSG標(biāo)準(zhǔn))
 *
 * @author 技術(shù)派
 */
@Slf4j
public class CoordinateUtil {

    /**
     * 二維坐標(biāo)轉(zhuǎn)換
     *
     * @param x          源X坐標(biāo)
     * @param y          源Y坐標(biāo)
     * @param srcEPSG    源坐標(biāo)系EPSG碼
     * @param targetEPSG 目標(biāo)坐標(biāo)系EPSG碼
     * @return 轉(zhuǎn)換后坐標(biāo)對象
     */
    public static Coordinate convert2D(double x, double y, int srcEPSG, int targetEPSG) {
        try {
            CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:" + srcEPSG, true);
            CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:" + targetEPSG, true);
            MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true);
            return JTS.transform(new Coordinate(x, y), new Coordinate(), transform);
        } catch (FactoryException | TransformException e) {
            log.error("坐標(biāo)轉(zhuǎn)換失敗: {}", e.getMessage());
            throw new RuntimeException("Coordinate transform error", e);
        }
    }

    public static Coordinate convert3D(Coordinate coordinate, int srcEPSG, int targetEPSG) {
        try {
            // 強制指定坐標(biāo)軸順序(兼容三維坐標(biāo)系)
            CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:" + srcEPSG, true);
            CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:" + targetEPSG, true);

            // 創(chuàng)建帶高程的坐標(biāo)點(x,y,z)
            Coordinate sourceCoord = new Coordinate(coordinate.x, coordinate.y, coordinate.z);

            // 構(gòu)建三維坐標(biāo)轉(zhuǎn)換管道
            MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true);
            Coordinate targetCoord = new Coordinate();

            // 執(zhí)行坐標(biāo)轉(zhuǎn)換(自動處理Z軸值)
            JTS.transform(sourceCoord, targetCoord, transform);

            // 高程值處理邏輯
            if (Double.isNaN(targetCoord.z)) {
                // 目標(biāo)坐標(biāo)系無高程維度時保留原始Z值
                targetCoord.z = coordinate.z;
            }

            return targetCoord;
        } catch (FactoryException | TransformException e) {
            log.error("三維坐標(biāo)轉(zhuǎn)換異常:SRC={}, TAR={} | {}",
                    srcEPSG, targetEPSG, e.getMessage());
            throw new RuntimeException("三維坐標(biāo)轉(zhuǎn)換失敗", e);
        }
    }
}

使用示例

場景1:WGS84轉(zhuǎn)Web墨卡托(EPSG:4326 → 3857)

public static void main(String[] args) {
    // 原始WGS84坐標(biāo)(北京天安門)
    Coordinate src = new Coordinate(116.3975, 39.9087);
    
    // 執(zhí)行轉(zhuǎn)換
    Coordinate result = CoordinateUtil.convert2D(
        src.x, src.y, 
        4326,  // WGS84
        3857   // Web墨卡托
    );
    
    System.out.printf("轉(zhuǎn)換結(jié)果:X=%.2f, Y=%.2f", result.x, result.y);
}

輸出結(jié)果

轉(zhuǎn)換結(jié)果:X=12958178.85, Y=4851434.41

場景2:高斯投影換帶計算(3度帶39→40)

Coordinate result = CoordinateUtil.convert2D(
    4453572.07, 536385.21, 
    4524,  // 3度帶39帶
    4525    // 3度帶40帶
);

關(guān)鍵特性說明

特性實現(xiàn)方案圖標(biāo)
坐標(biāo)系兼容性支持5000+ EPSG標(biāo)準(zhǔn)坐標(biāo)系??
性能優(yōu)化緩存CRS對象避免重復(fù)解碼?
異常處理統(tǒng)一捕獲Factory/Transform異常??
日志追蹤通過@Slf4j記錄詳細錯誤信息??

注意事項

坐標(biāo)軸順序

GeoTools默認采用經(jīng)度,緯度順序,通過CRS.decode(code, true)強制指定軸順序

精度損失

高精度場景建議使用PrecisionModel配置計算精度

依賴沖突

注意GeoTools與其他GIS庫的版本兼容性

擴展應(yīng)用場景

  • 批量轉(zhuǎn)換:結(jié)合CSV文件實現(xiàn)海量數(shù)據(jù)轉(zhuǎn)換
  • GIS系統(tǒng)集成:與GeoServer等平臺對接
  • 移動端適配:封裝為RESTful API服務(wù)

參考文檔GeoTools官方文檔

引用說明:本文實現(xiàn)參考了GeoTools核心轉(zhuǎn)換邏輯,并結(jié)合笑臉坐標(biāo)轉(zhuǎn)換工具的設(shè)計思想優(yōu)化異常處理流程。

到此這篇關(guān)于Java實現(xiàn)WGS84/GCJ02/BD09的坐標(biāo)互轉(zhuǎn)終極方案的文章就介紹到這了,更多相關(guān)Java坐標(biāo)互轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中有無參數(shù)和返回值的方法詳解

    java中有無參數(shù)和返回值的方法詳解

    這篇文章主要介紹了java中有無參數(shù)和返回值的方法詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 淺析SpringBoot中常見的底層注解

    淺析SpringBoot中常見的底層注解

    Spring?Boot?是一個用于創(chuàng)建獨立的、基于Spring框架的Java應(yīng)用程序的框架,它提供了許多注解,下面小編就來和大家介紹一些常見的底層注解吧
    2023-08-08
  • Java socket 如何獲取gps定位

    Java socket 如何獲取gps定位

    在Java中使用Socket來直接獲取GPS定位信息并不直接可行,因為GPS數(shù)據(jù)通常不是通過Socket通信來獲取的,本文給大家介紹Java socket 獲取gps定位的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • SpringBoot、mybatis返回樹結(jié)構(gòu)的數(shù)據(jù)實現(xiàn)

    SpringBoot、mybatis返回樹結(jié)構(gòu)的數(shù)據(jù)實現(xiàn)

    本文主要介紹了SpringBoot、mybatis返回樹結(jié)構(gòu)的數(shù)據(jù)實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 淺談spring和spring MVC的區(qū)別與關(guān)系

    淺談spring和spring MVC的區(qū)別與關(guān)系

    下面小編就為大家?guī)硪黄獪\談spring和spring MVC的區(qū)別與關(guān)系。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • MybatisPlus實現(xiàn)數(shù)據(jù)攔截的使用示例

    MybatisPlus實現(xiàn)數(shù)據(jù)攔截的使用示例

    在MyBatis-Plus中,可以通過自定義攔截器來實現(xiàn)對SQL語句的攔截和修改,本文就來介紹一下如何使用,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Mybatis中的like模糊查詢功能

    Mybatis中的like模糊查詢功能

    這篇文章主要介紹了Mybatis中的like模糊查詢功能,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • 解決使用@Component會導(dǎo)致spring.factories中的EnableAutoConfiguration無效問題

    解決使用@Component會導(dǎo)致spring.factories中的EnableAutoConfiguration無效

    這篇文章主要介紹了解決使用@Component會導(dǎo)致spring.factories中的EnableAutoConfiguration無效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • eclipse報錯 eclipse啟動報錯解決方法

    eclipse報錯 eclipse啟動報錯解決方法

    本文將介紹eclipse啟動報錯解決方法,需要了解的朋友可以參考下
    2012-11-11
  • 聊聊finally中的代碼一定會執(zhí)行嗎

    聊聊finally中的代碼一定會執(zhí)行嗎

    通常在面試中,只要是疑問句一般答案都是“否定”的,因為如果是“確定”和“正?!钡?那面試官就沒有必要再問了嘛,本文想和大家聊聊finally中的代碼一定會執(zhí)行嗎?,感興趣的朋友跟著小編一起來看看吧
    2023-12-12

最新評論

枣庄市| 绍兴县| 淮北市| 泰来县| 南京市| 理塘县| 靖远县| 达日县| 资阳市| 惠来县| 资阳市| 澜沧| 茂名市| 樟树市| 定日县| 武城县| 灵丘县| 柘荣县| 商水县| 金湖县| 绥棱县| 扬中市| 武川县| 开鲁县| 噶尔县| 钟山县| 汶川县| 句容市| 延庆县| 水城县| 淮滨县| 昌平区| 自治县| 山东省| 正定县| 芦山县| 呼和浩特市| 台南市| 中阳县| 瓮安县| 东港市|