PostGIS教程十二:投影数据

目录

一、比较数据

二、转换数据

三、投影练习

3.1、练习


    地球不是平的,也没有简单的方法把他放在一张平面纸地图(或电脑屏幕上),所以人们想出了各种巧妙的解决方案(投影)。

    每种方案都有优点和缺点,一些投影保留面积特征,因此所有对象都有一个相对大小;一些投影保留角度特征,如墨卡托投影Mercator);一些投影试图找到一个很好的中间混合状态,在几个参数上只有很小的失真。所有投影的共同之处在于,它们将(地球)转换为平面笛卡尔坐标系选择哪种投影取决于你将如何使用数据(需要哪些数据特征,面积?角度?或者其他)

    我们在加载纽约数据时已经遇到了投影。(回想一下令人讨厌的SRID 26918)。但是,有时需要在空间参照系统之间进行变换和重新投影。PostGIS包含对更改数据投影的内置支持,即使用ST_Transform(geometry, srid)函数,为了管理几何图形上的空间参照标识符,PostGIS提供了ST_SRID(geometry)ST_SetSRID(geometry,SRID)函数。

    我们可以使用ST_SRID(geometry)函数确认数据的SRID

SELECT ST_SRID(geom) FROM nyc_streets LIMIT 1;

    “26918“的定义是什么?正如我们在”加载数据部分”中看到的,该定义包含在spatial_ref_sys表中。事实上,有两个定义。”well-known text“(WKT)定义在srtext列中,”proj.4“格式定义在proj4text列。

SELECT * FROM spatial_ref_sys WHERE srid = 26918;

    实际上,对于内部PostGIS重新投影的计算,使用的是proj4text列的内容。以下是26918投影的proj.4text

SELECT proj4text FROM spatial_ref_sys WHERE srid = 26918;

    实际上,srtextproj4text列都很重要:srtext列由GeoServeruDigFME等外部程序使用;proj4text列由内部使用。

一、比较数据

    综合起来,坐标和SRID一起定义了地球上的一个位置。没有SRID,坐标只是一个抽象的概念。“笛卡尔”坐标平面被定义为放置在地球表面的“平面”坐标系。由于PostGIS函数在这样的平面上工作,因此关于两个几何图形的比较的操作都要基于同一SRID

    如果输入具有不同SRID的几何图形,则会得到错误:

SELECT ST_Equals(
         ST_GeomFromText('POINT(0 0)', 4326),
         ST_GeomFromText('POINT(0 0)', 26918)
         );

    

    注意:使用ST_Transform进行实时转换时要小心。空间索引是使用存储的几何图形的SRID构建的。如果在不同的SRID中进行比较,则通常不使用空间索引。最佳做法是为数据库中的所有表选择一个SRID。仅在向外部程序读取或写入数据时使用转换函数。

 

二、转换数据

    如果查看SRID 26918Proj4定义,我们可以看到投影是UTMUniversal Transverse Mercator)的zone 18,度量单位为

    让我们将一些数据从投影坐标转换为地理坐标(也称为”经度longitude)/ 纬度latitude)”)。

    若要将数据从一种SRID转换为另一种SRID,必须首先验证几何图形是否具有有效的SRID。由于我们已经确认了有效的SRID,所以接下来需要将投影坐标系SRID转换为地理坐标系SRID

    地理坐标最常见的SRID4326,对应于”WGS84球体上的经度/纬度“,你可以在spatialreference.org站点上看到该定义:

http://spatialreference.org/ref/epsg/4326/

    你也可以从spatial_ref_sys表中查到该定义:

SELECT srtext FROM spatial_ref_sys WHERE srid = 4326;

    让我们将”Broad St(宽街)”地铁站的坐标转换为地理坐标

SELECT ST_AsText(ST_Transform(geom,4326))
FROM nyc_subway_stations
WHERE name = 'Broad St';

    如果加载数据或创建新几何图形而未指定SRID,则SRID的值将为0。回想一下,在几何图形中,当我们创建几何表时,我们并没有指定SRID。如果我们查询数据库,则应该知道所有nyc_表的SRID值都为26918,而geometries表的SRID默认值为0

    若要查看表的SRID分配,请查询数据库的geometry_columns表:

SELECT f_table_name AS name, srid
FROM geometry_columns;

    然而,如果你知道坐标的SRID是什么,则可以使用ST_SetSRID()对几何图形进行SRID设置。然后,你将能把几何图形转换为其他坐标系统。

SELECT ST_AsText(
 ST_Transform(
   ST_SetSRID(geom,26918),
 4326)
)
FROM geometries;

 

三、投影练习

    下面是一些我们已经看过的函数,它们应该对练习有用!

    请记住你可以使用的在线资源:

    还有请记住我们的数据库中现有的表格:

  • nyc_census_blocks
    • name, popn_total, boroname, geom
  • nyc_streets
    • name, type, geom
  • nyc_subway_stations
    • name, geom
  • nyc_neighborhoods
    • name, boroname, geom

3.1、练习

    ①”基于UTM 18投影坐标系统的测量,纽约(New York)所有街道的长度是多少?”

SELECT Sum(ST_Length(geom))
  FROM nyc_streets;

    ②”SRID 2831WKT定义是什么?”

SELECT srtext FROM spatial_ref_sys
WHERE SRID = 2831;

    或者通过查询prj2epsg

PROJCS["NAD83(HARN) / New York Long Island",
  GEOGCS["NAD83(HARN)",
    DATUM["NAD83 (High Accuracy Regional Network)",
      SPHEROID["GRS 1980", 6378137.0, 298.257222101,
        AUTHORITY["EPSG","7019"]],
      TOWGS84[-0.991, 1.9072, 0.5129, 0.0257899075194932, -0.009650098960270402, -0.011659943232342112, 0.0],
      AUTHORITY["EPSG","6152"]],
    PRIMEM["Greenwich", 0.0,
      AUTHORITY["EPSG","8901"]],
    UNIT["degree", 0.017453292519943295],
    AXIS["Geodetic longitude", EAST],
    AXIS["Geodetic latitude", NORTH],
    AUTHORITY["EPSG","4152"]],
  PROJECTION["Lambert Conic Conformal (2SP)",
    AUTHORITY["EPSG","9802"]],
  PARAMETER["central_meridian", -74.0],
  PARAMETER["latitude_of_origin", 40.166666666666664],
  PARAMETER["standard_parallel_1", 41.03333333333333],
  PARAMETER["false_easting", 300000.0],
  PARAMETER["false_northing", 0.0],
  PARAMETER["scale_factor", 1.0],
  PARAMETER["standard_parallel_2", 40.666666666666664],
  UNIT["m", 1.0],
  AXIS["Easting", EAST],
  AXIS["Northing", NORTH],
  AUTHORITY["EPSG","2831"]]

    ③”基于SRID 2831坐标系统的计算,纽约市所有街道的长度是多少?”

SELECT Sum(ST_Length(ST_Transform(geom,2831)))
  FROM nyc_streets;

    注意UTM 18SRID 2831the State Plane Long Island projection – 国家平面长岛投影)测量的差值为(10421993 – 10418904)/ 10418904 = 0.02%。利用地理法在地球球体上计算出的街道总长度为10421999,更接近于状态平面值。这并不奇怪,因为SRID 2831投影坐标系是精确地校准一个很小的区域(纽约市),而UTM 18必须为一个大的区域提供合理的结果。

    ④” ‘Broad St‘ 地铁站点的KML表示是什么?”

SELECT ST_AsKML(geom)
FROM nyc_subway_stations
WHERE name = 'Broad St';

    嘿!坐标是地理坐标,尽管我们没有调用ST_Transform(),为什么?因为KML标准规定所有坐标都必须是地理坐标(实际上是EPSG: 4326),所以ST_AsKML()函数会自动进行转换。

 

转载自:https://blog.csdn.net/qq_35732147/article/details/86301242

You may also like...

退出移动版