参考:Geometry CRS Tutorial — GeoTools 32-SNAPSHOT User Guide
一、CRS概述
CRS全称为CoordinateReferenceSystems,中文叫坐标参考系统
在之前我们谈到了 JTS 库,它为 Geometry.
提供了我们的数据模型。在实际生活中,他们仅仅是我们想象的一个物体,并没有任何实际意义。只有当你给他附加一个单位,那么它才具备实际的意义。然而,对于一个地理几何体,我们还需要知道他们的位置。那么记录这些信息的数据结构称之为坐标参考系统。说白了,坐标参考系统就是一个数据结构。
在坐标参考系统中,他为我们提供了几个概念:
1、它定义了使用的轴以及测量单位。因此,您可以从赤道以度为单位测量纬度,从格林威治子午线以度为单位测量经度。或者您可以以米为单位测量 x,以米为单位测量 y,这对于计算距离或面积非常方便。
2、它定义了世界的形状。并非所有坐标参考系统都想象世界的相同形状。谷歌使用的 CRS 假装世界是一个完美的球体,而“EPSG:4326”使用的 CRS 有不同的形状——所以如果你把它们混在一起,你的数据将被绘制在错误的地方。这导致的结果就是几何图形不能正确的显示。那是一个很严重的问题。
所以对于任何一个shp文件或者tiff文件,如果他脱离了坐标参考系统或者没有坐标参考系统。他就会变一个毫无意义的几何体或者图片文件。
二、EPSG代码
EPSG全称为欧洲石油标准组织。
这个组织是第一个关心这些东西以将其以数据库形式记录下来的组织。该数据库分布在 Microsoft Access 中,并被移植到各种其他形式。在GeoTools中,它被附带到gt-epsg-hsql的jar中。下面列举一下常见的EPSG代码,如果你想了解更多的EPSG代码,可以访问epsg.io。
1、EPSG:4326
EPSG:4326 就是 WGS84 的代码, 使用十进制度数通过纬度/经度测量的信息,是目前最流行的地理坐标系统,GPS是基于WGS84的,所以通常我们得到的坐标数据都是WGS84的。一般我们在存储数据时,仍然按WGS84存储。
1.1 WKT定义
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4326"]]
1.2 GeoTools定义坐标
//方式一
CRS.decode("EPSG:4326");
//方式二
DefaultGeographicCRS.WGS84;
2、EPSG: 3785
伪墨卡托投影,也被称为球体墨卡托,Web Mercator。它是基于墨卡托投影的,把 WGS84坐标系投影到正方形。我们前面已经知道 WGS84 是基于椭球体的,但是伪墨卡托投影把坐标投影到球体上,这导致两极的失真变大,但是却更容易计算。另外,伪墨卡托投影还切掉了南北85.051129°纬度以上的地区,以保证整个投影是正方形的。因为墨卡托投影等正形性的特点,在不同层级的图层上物体的形状保持不变,一个正方形可以不断被划分为更多更小的正方形以显示更清晰的细节。很明显,伪墨卡托坐标系适合显示数据,但是不适合存储数据的,通常我们使用WGS84 存储数据,使用伪墨卡托显示数据。
2.1 WKT定义
PROJCS["WGS 84 / Pseudo-Mercator",
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4326"]],
PROJECTION["Mercator_1SP"],
PARAMETER["central_meridian",0],
PARAMETER["scale_factor",1],
PARAMETER["false_easting",0],
PARAMETER["false_northing",0],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
AXIS["X",EAST],
AXIS["Y",NORTH],
EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],
AUTHORITY["EPSG","3857"]]
2.2 GeoTools定义坐标
CRS.decode("EPSG:3785");
3、EPSG:3005
加拿大西海岸的“等面积”投影示例。轴以米为单位测量,便于计算距离或面积。
3.1 WKT定义
PROJCS["NAD83 / BC Albers",
GEOGCS["NAD83",
DATUM["North_American_Datum_1983",
SPHEROID["GRS 1980",6378137,298.257222101,
AUTHORITY["EPSG","7019"]],
TOWGS84[0,0,0,0,0,0,0],
AUTHORITY["EPSG","6269"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4269"]],
PROJECTION["Albers_Conic_Equal_Area"],
PARAMETER["standard_parallel_1",50],
PARAMETER["standard_parallel_2",58.5],
PARAMETER["latitude_of_center",45],
PARAMETER["longitude_of_center",-126],
PARAMETER["false_easting",1000000],
PARAMETER["false_northing",0],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
AXIS["Easting",EAST],
AXIS["Northing",NORTH],
AUTHORITY["EPSG","3005"]]
3.2 GeoTools定义坐标
CRS.decode("EPSG:3005");
4、EPSG:4490
EPSG:4490为大地坐标系_国家2000大地坐标系CGCS2000。
4.1 WKT定义
GEOGCS["China Geodetic Coordinate System 2000",
DATUM["China_2000",
SPHEROID["CGCS2000",6378137,298.257222101,
AUTHORITY["EPSG","1024"]],
AUTHORITY["EPSG","1043"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4490"]]
4.2 GeoTools定义坐标
CRS.decode("EPSG:4490");
5、EPSG:4479
EPSG:4490为中国大地坐标系2000,它和EPSG:4490的区别在于单位不同,EPSG:4490以度为单位;EPSG:4479以米为单位
5.1 WKT定义
GEOCCS["China Geodetic Coordinate System 2000",
DATUM["China_2000",
SPHEROID["CGCS2000",6378137,298.257222101,
AUTHORITY["EPSG","1024"]],
AUTHORITY["EPSG","1043"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
AXIS["Geocentric X",OTHER],
AXIS["Geocentric Y",OTHER],
AXIS["Geocentric Z",NORTH],
AUTHORITY["EPSG","4479"]]
5.2 GeoTools定义坐标
CRS.decode("EPSG:4479");
三、CRS操作
GeoTools对CRS的操作主要包括创建、获取和转换。
1、创建
CRS.decode(“EPSG:4326”);
2、获取
2.1 通过ShapefileDataStore获取
FileDataStore store = FileDataStoreFinder.getDataStore(sourceFile);
SimpleFeatureType schema = store.getSchema();
CoordinateReferenceSystem coordinateReferenceSystem = schema.getCoordinateReferenceSystem();
2.2 通过Geometry获取
//方式一
Point point = geometryFactory.createPoint(new Coordinate(longitude, latitude));
int srid = point.getSRID();
CoordinateReferenceSystem decode = CRS.decode("EPSG:" + srid);
//方式二
SimpleFeature feature = featureBuilder.buildFeature(null);
feature.getType().getCoordinateReferenceSystem()
3、转换
CoordinateReferenceSystem dataCRS = schema.getCoordinateReferenceSystem();
CoordinateReferenceSystem worldCRS = map.getCoordinateReferenceSystem();
// allow for some error due to different datums
boolean lenient = true;
MathTransform transform = CRS.findMathTransform(dataCRS, worldCRS, lenient);
Geometry newGeometry = JTS.transform(oldGeometry, transform);
注:操作实例类 https://download.csdn.net/download/qq_19800029/89106224