GeoTools是在java下的gis開源軟件,以下介紹坐標轉換的兩種方法:投影轉換和仿射變換
- 投影轉換
這里以xian80經緯度坐標轉xian80,3度分帶 111中央經線平面坐標為例
轉換函數如下:
1 Point pointXian80 = projectTransform(lon, lat, "EPSG:4610", "EPSG:2382");
1 /** 2 * 投影轉換, lon=經度,lat=緯度,ESPG格式(例):EPSG:4610 3 */ 4 public static Point projectTransform(double lon, double lat, 5 String epsgSource, String epsgTarget) throws FactoryException, 6 MismatchedDimensionException, TransformException { 7 // 原始坐標點 8 // PS:通常邏輯上理解經度應該是橫坐標x,緯度是y,可是這里經度要填到y,緯度x,否則會報錯 9 Point sourcePoint = JtsHelper.createPoint(lat, lon); 10 11 // 定義轉換前和轉換后的投影,可以用ESPG或者wkt 12 // "PROJCS[\"Xian_1980_3_Degree_GK_CM_111E\",GEOGCS[\"GCS_Xian_1980\",DATUM[\"D_Xian_1980\",SPHEROID[\"Xian_1980\",6378140.0,298.257]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",111.0],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]"; 13 // CoordinateReferenceSystem mercatroCRS = CRS.parseWKT(strWKTMercator); 14 CoordinateReferenceSystem crsSource = CRS.decode(epsgSource); 15 CoordinateReferenceSystem crsTarget = CRS.decode(epsgTarget); 16 // 投影轉換 17 MathTransform transform = CRS.findMathTransform(crsSource, crsTarget); 18 Point pointTarget = (Point) JTS.transform(sourcePoint, transform); 19 20 return pointTarget; 21 }
關於定義坐標系的說明,GeoTools中定義坐標系有兩種方法,一是坐標系的wkt,二是ESPG
坐標系的wkt可以從arcgis的prj文件中過去,用記事本打開prj文件,里面的內容就是該坐標系的wkt格式內容,例如:PROJCS[\"Xian_1980_3_Degree_GK_CM_111E\",GEOGCS[\"GCS_Xian_1980\",DATUM[\"D_Xian_1980\",SPHEROID[\"Xian_1980\",6378140.0,298.257]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]],PROJECTION[\"Gauss_Kruger\"],PARAMETER[\"False_Easting\",500000.0],PARAMETER[\"False_Northing\",0.0],PARAMETER[\"Central_Meridian\",111.0],PARAMETER[\"Scale_Factor\",1.0],PARAMETER[\"Latitude_Of_Origin\",0.0],UNIT[\"Meter\",1.0]]
獲取到wkt后,可以通過 CoordinateReferenceSystem mercatroCRS = CRS.parseWKT(strWKTMercator); 獲取到坐標系對象
另一種方法是ESPG,意思是每一個坐標系都有一個ESPG標准的號碼,查詢坐標系的ESPG可通過以下網站 http://spatialreference.org/
PS:當轉換的兩種坐標系的datum不同,會報錯Bursa-Wolf parameters,暫時未解決
- 仿射變換
代碼如下:
首先是輸入三組參考點,前三個是轉換前,后三個是轉換后
最后結果是pointReuslt
1 // 參考點坐標 2 Coordinate s1 = new Coordinate(429275.549, 2801455.153); 3 Coordinate s2 = new Coordinate(428110.626, 2792148.620); 4 Coordinate s3 = new Coordinate(428966.479, 2800016.622); 5 6 Coordinate t1 = new Coordinate(4628.339, 801349.338); 7 Coordinate t2 = new Coordinate(3515.906, 792036.308); 8 Coordinate t3 = new Coordinate(4327.381, 799909.069); 9 // 建立仿射變換對象 10 AffineTransformationBuilder afb = new AffineTransformationBuilder(s1, 11 s2, s3, t1, t2, t3); 12 AffineTransformation atf = afb.getTransformation(); 13 14 Point pointReuslt = JtsHelper.createPoint(x,y); 15 16 // 坐標轉換 17 pointReuslt.apply(atf);