CRS操作

参考: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值