做俄罗斯外贸的网站设计,wordpress 密码 算法,流程做网站,建设一个网站的流程图PostGIS学习教程十一#xff1a;投影数据
地球不是平的#xff0c;也没有简单的方法把它放在一张平面纸地图上#xff08;或电脑屏幕上#xff09;#xff0c;所以人们想出了各种巧妙的解决方案#xff08;投影#xff09;。
每种投影方案都有优点和缺点#xff0c;一…PostGIS学习教程十一投影数据
地球不是平的也没有简单的方法把它放在一张平面纸地图上或电脑屏幕上所以人们想出了各种巧妙的解决方案投影。
每种投影方案都有优点和缺点一些投影保留面积特征一些投影保留角度特征如墨卡托投影Mercator一些投影试图找到一个很好的中间混合状态在几个参数上只有很小的失真。所有投影的共同之处在于它们将地球转换为平面笛卡尔坐标系选择哪种投影取决于你将如何使用数据需要哪些数据特征面积角度或者其他。
我们在加载纽约数据时邂逅了投影。回想一下令人讨厌的SRID 26918。但是有时需要在空间参考系统之间进行变换和重新投影。PostGIS包含更改数据投影重投影的功能即使用ST_Transform(geometry, srid)函数就可以实现重投影。另外为了查看和设置几何图形的空间参照标识符PostGIS提供了ST_SRID(geometry和ST_SetSRID(geometrySRID函数。
我们可以使用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投影对应的proj4text列的内容
SELECT proj4text FROM spatial_ref_sys WHERE srid 26918;实际上srtext和proj4text列都很重要srtext列由GeoServer、uDig和FME等外部程序使用proj4text列由PostGIS的内部程序使用。 文章目录 PostGIS学习教程十一投影数据一、比较数据二、转换数据三、投影练习3.1、练习 四、相关函数总结 一、比较数据
综合起来坐标和SRID严谨的说应该是空间参考系统一起定义了地球上的一个位置。没有SRID坐标只是一个抽象而没有实际意义的概念。“笛卡尔”坐标平面被定义为放置在地球表面的“平面”坐标系。由于PostGIS函数在这样的坐标系统上工作因此关于两个几何图形的比较的操作都要基于同一SRID。
如果输入具有不同SRID的几何图形则会得到错误
SELECT ST_Equals(ST_GeomFromText(POINT(0 0), 4326),ST_GeomFromText(POINT(0 0), 26918));注意空间索引是基于存储的几何图形的SRID构建的。如果在不同的SRID中进行比较则通常不使用空间索引。最佳做法是为数据库中的所有表选择一个SRID。仅在向外部程序读取或写入数据时使用转换函数将数据转换为基于指定SRID的数据
二、转换数据
如果查看SRID 26918的Proj4定义我们可以看到投影是UTMUniversal Transverse Mercator zone 18度量单位为米。 让我们将一些数据从投影坐标转换为地理坐标也称为经度longitude/ 纬度latitude“。 若要将数据从一种SRID转换为另一种SRID必须首先验证几何图形是否具有有效的SRID。由于我们已经确认了当前数据中的SRID所以接下来仅需要将投影坐标系统的SRID转换为地理坐标系统的SRID。 地理坐标最常见的SRID是4326WGS84地理坐标系统对应于WGS84球体上的经度/纬度”你可以在http://spatialreference.org站点上看到该定义 你也可以从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;三、投影练习
下面是一些我们已经看过的函数它们应该对练习有用 请记住你可以使用的在线资源
http://spatialreference.org http://prj2epsg.org 还有请记住我们的数据库中现有的数据表
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 zone 18投影坐标系统的测量纽约New York所有街道的长度是多少
SELECT Sum(ST_Length(geom))
FROM nyc_streets;②SRID 2831的WKT定义是什么
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 18与SRID 2831the State Plane Long Island projection - 国家平面长岛投影测量的差值为10421993 - 10418904/ 10418904 0.02%。利用地理法在地球球体上计算出的街道总长度为10421999也就是说基于SRID 2831计算出来的结果和真实结果更接近。这并不奇怪因为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()函数会自动进行坐标转换。
四、相关函数总结
ST_SRID(geometry —— 查看空间数据的坐标系 ST_SetSRID(geometrySRID —— 设置空间数据的坐标系 UpdateGeometrySRID(table_name, column_name, srid) —— 更新空间数据表的坐标系 ST_Transform(geometry, srid) —— 转换空间数据的坐标系