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) —— 转换空间数据的坐标系

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

干货!MES系统选型必须要考虑的9点要素!

你所在的企业是否为这些问题困扰? 纸质化管理混乱物料供应不及时设备数据难采集生产进度难透明 如果是的话,你的企业需要MES系统的帮助! MES是制造执行系统(Manufacturing Execution System)的缩写。它是一种信息系…

Redis 环境搭建

文章目录 第1关:Redis 环境搭建 第1关:Redis 环境搭建 编程要求 根据上述相关知识,在右侧命令行中完成 Redis 集群的部署与安装。 安装完成后,使用 echo “cluster nodes”|redis-cli -p 7001 -c >/root/test.txt 将结果保存。…

外贸网站建站的注意事项?海洋建站的流程?

外贸网站建站需要注意什么?网站建设要注意哪些问题? 在建设外贸网站时,有一些关键的注意事项需要牢记,以确保网站的成功运营。海洋建站将介绍一些重要的外贸网站建站注意事项,帮助企业避免一些常见的陷阱和错误。 外…

架构师进阶,微服务设计与治理的 16 条常用原则

今天将从存储的上一层「服务维度」学习架构师的第二项常用能力 —— 微服务设计与治理。 如何设计合理的微服务架构? 如何保持微服务健康运行? 这是我们对微服务进行架构设计过程中非常关注的两个问题。 本文对微服务的生命周期定义了七个阶段&#x…

C //习题10.3 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test“中保存,输入的字符串以“!“结束。

C程序设计 (第四版) 谭浩强 习题10.3 习题10.3 从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件"test"中保存,输入的字符串以"!"结束。 IDE工具:V…

MongoDB数据库时区问题

1.问题描述: 利用MongoTemplate类更新mongodb集合中的指定日期字段时,用mongodb可视化工具Robo3t查看所更新的字段,发现数据库中显示时间当前时间(东8区区时)早了8个小时。 2.产生原因: MongoDB默认的是…

骨传导原理是什么?使用骨传导耳机的危害有哪些?

骨传导耳机顾名思义:就是利用骨传导技术传递声音的耳机,骨传导的传声方式是通过颅骨震动来进行传导,将声音传到颅骨,在通过颅骨直接传导到内耳,因此不需要将声音通过耳膜来进行传递,即使用双手捂住耳朵也可…

【Java基础篇 | 面向对象】—— 聊聊什么是接口(上篇)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区交流讨论💌 关于接口的简单的介绍…

干爆ChatGPT,谷歌发布新大模型:Gemini

我是卢松松,点点上面的头像,欢迎关注我哦! 谷歌昨天又发布了一个新的大模型,叫Gemini(双子座时代)。打开Google AI 就能看到。 据说非常强,然后是一大堆夸奖,大概是本月中旬的时候正式推出。标题明晃晃写…

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架

1.安装ThinkPHP6框架 这里我们使用的是composer安装的安装方式,请确保电脑已经安装了composer,如未安装可查看Composer 安装与使用 | 菜鸟教程 composer create-project topthink/think tp 上面命令安装的是稳定版的,也是最新的稳定版&…

【Java 基础】23 国际化

文章目录 1.概念2.原理1)Locale2)ResourceBundle3)MessageFormat 3.例子1)准备资源文件2)加载资源文件3)格式化消息(非必须) 总结 在全球化的今天,开发支持多语言的应用变…

LinuxBasicsForHackers笔记 -- BASH 脚本

你的第一个脚本:“你好,黑客崛起!” 首先,您需要告诉操作系统您要为脚本使用哪个解释器。 为此,请输入 shebang,它是井号和感叹号的组合,如下所示:#! 然后,在 shebang …

为什么越来越多的网站使用https,有什么好处?什么是https加密协议?

首先回答“什么是https加密协议?” HTTPS(HyperText Transfer Protocol Secure)是一种通过加密传输数据的安全版本的HTTP协议。它使用了SSL(Secure Sockets Layer)或TLS(Transport Layer Security&#xf…

IntelliJ IDEA 2023.3 最新变化

关键亮点 AI Assistant 预览阶段结束 全面推出 Ultimate JetBrains AI Assistant 现已全面推出,搭载大量新功能和改进,助力提高您在 JetBrains IDE 中的工作效率。 最新更新包括编辑器中增强的直接代码生成、无需复制代码即可回答项目相关查询的上下文…

网络监控:网络故障告警通知

网络警报是向网络管理员发出的指示,表明设备已达到其设置的阈值或面临任何性能异常,网络警报可以通过不同的渠道通知网络管理员,例如电子邮件、短信、松弛、网络警报等。 通过网络监控警报,可以快速了解网络问题,通过…

低代码与MES:智能制造的新篇章

一、引言 随着工业4.0和智能制造的兴起,企业对于生产过程的数字化、智能化需求日益迫切。制造执行系统(MES)作为连接计划层与控制层的关键信息系统,在提升生产效率、优化资源配置、保障产品质量等方面发挥着重要作用。然而&#…

前端开发常用的Vscode插件整理(持续更新)

本文记录用vscode进行前端开发时,常用到的有用的vscode插件,将不定时更新~ 1、Chinese (Simplified) 将编辑器变成简体中文 2、vscode-icon 让 vscode 资源树目录加上图标,官方出品的图标库 3、Import Cost 引入包大小计算,对于…

hadoop安装与配置-shell脚本一键安装配置(集群版)

文章目录 前言一、安装准备1. 搭建集群 二、使用shell脚本一键安装1. 复制脚本2. 增加执行权限3. 分发脚本4. 执行脚本5. 加载用户环境变量 三、启动与停止1. 启动/停止hadoop集群(1) 复制hadoop集群启动脚本(2) 增加执行权限(3) 启动hadoop集群(4) 停止hadoop集群(5) 重启hado…

直播预告|StarRocks 3.2 全面解读:易用性和性能的双重提升

StarRocks 3.2 版本即将发布,这是 StarRocks 的又一次重大升级,除了进一步完善存算分离架构、数据湖分析和物化视图等重要特性,我们还聚焦于运维操作细节,大大提升了 StarRocks 的易用性,从建表、表变更、数据导入、查…

数据清洗、特征工程和数据可视化、数据挖掘与建模的应用场景

1.5 数据清洗、特征工程和数据可视化、挖掘建模的应用场景 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.5节内容。本书已正式出版上市,当当、京东、淘宝等平台热销中,搜索书名即可。内容涵盖数据科学应…