首頁 > 軟體

Java利用Geotools實現不同座標系之間座標轉換

2022-08-01 14:00:18

Geotools

GeoTools 是一個開源的 Java GIS 工具包,可利用它來開發符合標準的地理資訊系統。GeoTools 提供了 OGC (Open Geospatial Consortium) 規範的一個實現來作為他們的開發。

GeoTools 被許多專案使用,包括 Web 服務,命令列工具和桌面應用程式。

核心功能

1.定義關鍵空間概念和資料結構的介面

  • Java 拓撲套件(JTS)提供的整合幾何支援
  • 使用 OGC 過濾器編碼規範的屬性和空間過濾器

2.乾淨的資料存取 API,支援功能存取,事務支援和執行緒之間的鎖定

  • 以多種檔案格式和空間資料庫存取 GIS 資料
  • 座標參考系統和轉換支援
  • 處理廣泛的地圖投影
  • 根據空間和非空間屬性過濾和分析資料

4.無狀態的低記憶體渲染器,在伺服器端環境中特別有用。

  • 撰寫和顯示樣式複雜的地圖
  • 供應商擴充套件,可以更好地控制文字標籤和顏色混合

5.使用 XML 模式繫結到 GML 內容的強大模式輔助解析技術

解析 / 編碼技術提供了許多 OGC 標準的繫結,包括 GML,Filter,KML,SLD 和 SE。

6.GeoTools 外掛:開放式外掛系統,可讓您教授庫其他格式

用於 ImageIO-EXT 專案的外掛,允許 GeoTools 從 GDAL 讀取其他柵格格式

7.GeoTools 擴充套件

提供使用核心庫的空間設施構建的其他功能。

擴充套件提供圖形和網路支援(用於查詢最短路徑),驗證,Web 地圖伺服器使用者端,用於 XML 解析和編碼的繫結以及顏色調變器!

8.不支援 GeoTools

GeoTools 也是更廣泛的社群的一部分,其工作區用於培養新人才和促進實驗。

一些重點包括搖擺支援(在我們的教學中使用!),SWT,本地和 Web 流程支援,附加符號,附加資料格式,網格的生成以及 ISO Geometry 的一些實現。

maven設定

我們將首先定義我們希望使用的 GeoTools 的版本號。本工作手冊是為 28-SNAPSHOT 編寫的,儘管您可能希望嘗試不同的版本。

對於生產, geotools.version應該使用 28 的穩定版本:

 <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <geotools.version>28-SNAPSHOT</geotools.version>
    <maven.deploy.skip>true</maven.deploy.skip>
  </properties>

我們指定以下依賴項(您的應用程式需要的 GeoTools 模組):

        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-main</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-epsg-hsql</artifactId>
            <version>${geotools.version}</version>
        </dependency>

我們告訴 maven 從哪些儲存庫下載 jars:

  <repositories>
    <repository>
    <id>osgeo</id>
    <name>OSGeo Release Repository</name>
    <url>https://repo.osgeo.org/repository/release/</url>
    <snapshots><enabled>false</enabled></snapshots>
    <releases><enabled>true</enabled></releases>
    </repository>
    <repository>
    <id>osgeo-snapshot</id>
    <name>OSGeo Snapshot Repository</name>
    <url>https://repo.osgeo.org/repository/snapshot/</url>
    <snapshots><enabled>true</enabled></snapshots>
    <releases><enabled>false</enabled></releases>
    </repository>
  </repositories>

程式碼工具

import lombok.extern.slf4j.Slf4j;
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 java.math.BigDecimal;
 
@Slf4j
public class GisUtil {
 
    public static void main(String[] args) throws FactoryException, TransformException {
        bjz54ToCgcs2000( 39440999.301,3631381.649);
    //    bjz54ToCgcs2000( 39446227.146,3626791.679);
    }
 
    /**
     * @param x 源座標x
     * @param y 源座標y
     * @Description: 座標系轉換-北京54投影轉國家2000投影
     */
    public static Coordinate bjz54ToCgcs2000(double x ,double y){
        Coordinate tgtCoordinate= coordinateTransform(2415,4527, y, x);
        double tx=new BigDecimal(tgtCoordinate.x).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
        double ty=new BigDecimal(tgtCoordinate.y).setScale(3, BigDecimal.ROUND_HALF_UP).doubleValue();
        log.info(ty+","+tx);
        tgtCoordinate.setX(ty);
        tgtCoordinate.setY(tx);
        return tgtCoordinate;
    }
 
    public static Coordinate bjz54ToCgcs2000(Coordinate p){
        return bjz54ToCgcs2000(p.x, p.y);
    }
 
    /**
     * @param srcNo 源座標系EPSG代號
     * @param targetNo 目標座標系EPSG代號
     * @param x 源座標x
     * @param y 源座標y
     * @Description: 座標系轉換 
     */
    public static Coordinate coordinateTransform(int srcNo, int targetNo, double x , double y){
        Coordinate tar=new Coordinate();
        try {
            CoordinateReferenceSystem src = CRS.decode("EPSG:"+srcNo);
            CoordinateReferenceSystem target = CRS.decode("EPSG:"+targetNo);
            MathTransform transform = CRS.findMathTransform(src, target, true);
            Coordinate sour= new Coordinate(x, y);
           return JTS.transform(sour, tar, transform);
        } catch (FactoryException | TransformException  e) {
            log.error(e.getMessage());
        }
        return tar;
 
    }
}

注:計算結果和測量軟體的結果有2米的誤差,用org.locationtech.proj4j工具包 計算的結果誤差更大,有幾十米。後續突出用pgis轉換的辦法誤差在1毫米之間。

使用範例

    @ApiOperation(value = "座標系轉換北京54-國家2000")
    @GetMapping(value = "/bjz54ToCgcs2000")
    public ResponseDTO<Coordinate> bjz54ToCgcs2000(@RequestBody Coordinate dto){
        return ResponseDTO.succData(GisUtil.bjz54ToCgcs2000(dto));
    }

到此這篇關於Java利用Geotools實現不同座標系之間座標轉換的文章就介紹到這了,更多相關Java Geotools座標轉換內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com