PostGIS学习教程十一:投影数据

PostGIS学习教程十一:投影数据

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

每种投影方案都有优点和缺点,一些投影保留面积特征;一些投影保留角度特征,如墨卡托投影(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投影对应的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定义,我们可以看到投影是UTM(Universal Transverse Mercator) zone 18,度量单位为米。
让我们将一些数据从投影坐标转换为地理坐标(也称为"经度(longitude)/ 纬度(latitude)“)。
若要将数据从一种SRID转换为另一种SRID,必须首先验证几何图形是否具有有效的SRID。由于我们已经确认了当前数据中的SRID,所以接下来仅需要将投影坐标系统的SRID转换为地理坐标系统的SRID。
地理坐标最常见的SRID是4326(WGS84地理坐标系统),对应于"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 2831(the 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(geometry,SRID) —— 设置空间数据的坐标系
UpdateGeometrySRID(table_name, column_name, srid) —— 更新空间数据表的坐标系
ST_Transform(geometry, srid) —— 转换空间数据的坐标系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/256041.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW使用单板RIO开发远程监控电源信号

LabVIEW使用单板RIO开发远程监控电源信号 设计和构建用于智能电网的本地功耗分析系统,主要服务于领先的电力监控设备设计者和制造商。随着智能电网投资的增加,对于能够有效处理替代电源(如太阳能和风能)间歇性功率水平的技术需求…

揭秘强化学习:Python 实践指南

一、说明 强化学习 (RL) 是机器学习和人工智能 (AI) 的一个子领域,专注于开发能够通过与环境交互进行学习的智能代理。与传统的监督和无监督学习不同,强化学习主要关注动态、顺序环境中的决策。它在人工智能中具有重要意义,特别是在自主代理必…

数字与数学基础问题

关卡名 数字与数学基础问题 我会了✔️ 内容 1.数字里统计的处理技巧 ✔️ 2.必须熟练掌握溢的处理方法 ✔️ 3.掌握进制的处理方法 ✔️ 1. 数字统计专题 统计一下特定场景下的符号,或者数字个数等是一类非常常见的问题 。如果按照正常方式强行统计&#xf…

MX6ULL学习笔记 (八) platform 设备驱动实验

前言: 什么是 Linux 下的 platform 设备驱动 Linux下的字符设备驱动一般都比较简单,只是对IO进行简单的读写操作。但是I2C、SPI、LCD、USB等外设的驱动就比较复杂了,需要考虑到驱动的可重用性,以避免内核中存在大量重复代码&…

uc_13_共享内存_消息队列_IPC对象

1 IPC对象 多个IPC -> 一个IPC对象 -> 一个IPC对象标识符 -> 一个键(整数)(即IPC对象的外部名称) 共享内存、消息队列和信号量,这三种IPC一般被合称为XSI IPC,它们有很多相似之处。 为了实现进程间的数据交换,系统内核会为参…

dockerfile简单实践部署(jenkins,wordpress)

实现部署jenkins的流程 配置java环境,导入jenkins包,运行命令 java -jar jenkins包,这里为了减少进入jenkins的web端安装插件,将插件提前部署到容器内。 制作dockerfile 创建镜像所在的文件夹和Dockerfile文件 mkdir /test cd …

【项目日记(一)】高并发内存池项目介绍

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:项目日记-高并发内存池⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 项目日记 1. 前言2. 什么是高并发内存池…

Textual Inversion

参考博客1:https://www.bilibili.com/read/cv25430752/

移动云荣获OpenInfra社区“算力基础设施技术突破奖”

近日,一年一度的 OpenInfra Days China在北京召开,大会汇聚了全球各大云厂商的技术专家,共同分享全球前沿基础设施技术的展望和实践经验。在本次大会上,移动云荣获OpenInfra社区颁发的“算力基础设施技术突破奖”,表明…

基于ssm实验室课程管理系统源码和论文

idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 环境: jdk8 tomcat8.5 摘 要 随着科学实验规模的不断扩大,实验室课程数量的急剧增加,有关实验室课程的各种信息量也在不断成倍增长。面对庞大的信息量,就需要有…

ChatGPT 应用开发(一)ChatGPT OpenAI API 免代理调用方式(通过 Cloudflare 的 AI Gateway)

前言 开发 ChatGPT 应用,我觉得最前置的点就是能使用 ChatGPT API 接口。首先我自己要能成功访问,这没问题,会魔法就可以本地调用。 那用户如何调用到我的应用 API 呢,我的理解是通过用户能访问到的中转服务器向 OpenAI 发起访问…

基于SSM实现的公文管理系统

一、技术架构 前端:jsp | jquery | bootstrap 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 首页 03. 系统管理-角色管理 04. 系统管理-功能管理 05. 系统管理-用…