Java利用Geotools實現(xiàn)不同坐標系之間坐標轉(zhuǎn)換
Geotools

GeoTools 是一個開源的 Java GIS 工具包,可利用它來開發(fā)符合標準的地理信息系統(tǒng)。GeoTools 提供了 OGC (Open Geospatial Consortium) 規(guī)范的一個實現(xiàn)來作為他們的開發(fā)。
GeoTools 被許多項目使用,包括 Web 服務,命令行工具和桌面應用程序。

核心功能
1.定義關(guān)鍵空間概念和數(shù)據(jù)結(jié)構(gòu)的接口
- Java 拓撲套件(JTS)提供的集成幾何支持
- 使用 OGC 過濾器編碼規(guī)范的屬性和空間過濾器
2.干凈的數(shù)據(jù)訪問 API,支持功能訪問,事務支持和線程之間的鎖定
- 以多種文件格式和空間數(shù)據(jù)庫訪問 GIS 數(shù)據(jù)
- 坐標參考系統(tǒng)和轉(zhuǎn)換支持
- 處理廣泛的地圖投影
- 根據(jù)空間和非空間屬性過濾和分析數(shù)據(jù)
4.無狀態(tài)的低內(nèi)存渲染器,在服務器端環(huán)境中特別有用。
- 撰寫和顯示樣式復雜的地圖
- 供應商擴展,可以更好地控制文本標簽和顏色混合
5.使用 XML 模式綁定到 GML 內(nèi)容的強大模式輔助解析技術(shù)
解析 / 編碼技術(shù)提供了許多 OGC 標準的綁定,包括 GML,F(xiàn)ilter,KML,SLD 和 SE。
6.GeoTools 插件:開放式插件系統(tǒng),可讓您教授庫其他格式
用于 ImageIO-EXT 項目的插件,允許 GeoTools 從 GDAL 讀取其他柵格格式
7.GeoTools 擴展
提供使用核心庫的空間設施構(gòu)建的其他功能。

擴展提供圖形和網(wǎng)絡支持(用于查找最短路徑),驗證,Web 地圖服務器客戶端,用于 XML 解析和編碼的綁定以及顏色調(diào)制器!
8.不支持 GeoTools
GeoTools 也是更廣泛的社區(qū)的一部分,其工作區(qū)用于培養(yǎng)新人才和促進實驗。
一些重點包括搖擺支持(在我們的教程中使用?。?,SWT,本地和 Web 流程支持,附加符號,附加數(shù)據(jù)格式,網(wǎng)格的生成以及 ISO Geometry 的一些實現(xiàn)。
maven配置
我們將首先定義我們希望使用的 GeoTools 的版本號。本工作手冊是為 28-SNAPSHOT 編寫的,盡管您可能希望嘗試不同的版本。
對于生產(chǎn), geotools.version應該使用 28 的穩(wěn)定版本:
<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: 坐標系轉(zhuǎn)換-北京54投影轉(zhuǎn)國家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: 坐標系轉(zhuǎn)換
*/
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;
}
}
注:計算結(jié)果和測量軟件的結(jié)果有2米的誤差,用org.locationtech.proj4j工具包 計算的結(jié)果誤差更大,有幾十米。后續(xù)突出用pgis轉(zhuǎn)換的辦法誤差在1毫米之間。
使用示例
@ApiOperation(value = "坐標系轉(zhuǎn)換北京54-國家2000")
@GetMapping(value = "/bjz54ToCgcs2000")
public ResponseDTO<Coordinate> bjz54ToCgcs2000(@RequestBody Coordinate dto){
return ResponseDTO.succData(GisUtil.bjz54ToCgcs2000(dto));
}到此這篇關(guān)于Java利用Geotools實現(xiàn)不同坐標系之間坐標轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)Java Geotools坐標轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
特殊數(shù)據(jù)結(jié)構(gòu)之使用Java實現(xiàn)單調(diào)棧示例
這篇文章主要為大家介紹了特殊數(shù)據(jù)結(jié)構(gòu)之使用Java實現(xiàn)單調(diào)棧示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-09-09
spring-boot整合dubbo:Spring-boot-dubbo-starter
這篇文章主要介紹了spring-boot整合dubbo:Spring-boot-dubbo-starter的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05
基于Java數(shù)組實現(xiàn)循環(huán)隊列的兩種方法小結(jié)
下面小編就為大家分享一篇基于Java數(shù)組實現(xiàn)循環(huán)隊列的兩種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12
SpringCloud Zuul實現(xiàn)負載均衡和熔斷機制方式
這篇文章主要介紹了SpringCloud Zuul實現(xiàn)負載均衡和熔斷機制方式,具有很好的參考價值,希望對大家有所幫助。2021-07-07

